//Função que irá Visitar os vizinhos, enfileirar, desenfileirar de acordo com a cor de cada vértice void VisitaBfs(TipoVertice u, TipoGrafo *Grafo, int **Dist, TipoCor *Cor, int *Antecessor){ TipoVertice v; TipoApontador Aux; short FimListaAdj; TipoPeso Peso; TipoItem Item; TipoFila Fila; Cor[u] = cinza; Dist[u][0] = 0; FFVazia(&Fila); Item.Vertice = u; Item.Peso = 0; Enfileira(Item, &Fila); while (!FilaVazia(Fila)){ Desenfileira(&Fila, &Item); u = Item.Vertice; if (!ListaAdjVazia(&u, Grafo)){ Aux = PrimeiroListaAdj(&u, Grafo); FimListaAdj = FALSE; while (FimListaAdj == FALSE){ ProxAdj(&u, Grafo, &v, &Peso, &Aux, &FimListaAdj); if (Cor[v] == branco){ Cor[v] = cinza; Dist[v][0] = Dist[u][0] + 1; Antecessor[v] = u; Item.Vertice = v; Item.Peso = Peso; Enfileira(Item, &Fila);} } } Cor[u] = preto; } }
//Função que caso a a fila não esteja vazia, atribui o valor a *Item e libera a memoria alocada para aquele espaço void Desenfileira(TipoFila *Fila, TipoItem *Item){ TipoApontador q; if (FilaVazia(*Fila)){ printf("FILA VAZIA"); return; } q = Fila->Frente; Fila->Frente = Fila->Frente->Prox; *Item = Fila->Frente->Item; free(q); }
void Desenfileira(TipoFila *Fila, TipoItem *Item) { Celula *q; if (FilaVazia(*Fila)) { printf(" Erro fila est a vazia\n"); return; } q = Fila->Frente; Fila->Frente = Fila->Frente->Prox; *Item = Fila->Frente->Item; free(q); }
int main(){ FILE *arq, *arqT, *arqC; char c; struct tipofila *finicio; int count=0; int count1=42; InicializaFila(&finicio); arq = fopen ("dadosdctphoto.txt", "r"); arqT = fopen ("dadosdctphoto_temp.txt", "w"); arqC = fopen ("dadosdctphoto_coef.txt", "w"); while ((c = getc (arq)) != EOF) { if (c!='\n'){ count=count+1; InsereFila(&finicio,c); } if(c=='\n'){ InsereFila(&finicio,c); if(count==count1){ while(!FilaVazia(finicio)){ fputc(RetiraFila(&finicio),arqC); } } else{ while(!FilaVazia(finicio)){ fputc(RetiraFila(&finicio),arqT); } } count=0; } } fclose (arq); fclose (arqT); fclose(arqC); return 0; }
void VisitaBfs(TipoValorVertice u, TipoGrafo *Grafo, int *Dist, TipoCor *Cor, int *Antecessor) { TipoValorVertice v; Apontador Aux; short FimListaAdj; TipoPeso Peso; TipoItem Item; TipoFila Fila; Cor[u] = cinza; Dist[u] = 0; FFVazia(&Fila); Item.Vertice = u; Item.Peso = 0; Enfileira(Item, &Fila); printf("Visita origem%2d cor: cinza F:", u); ImprimeFila(Fila); getchar(); while (!FilaVazia(Fila)) { Desenfileira(&Fila, &Item); u = Item.Vertice; if (!ListaAdjVazia(&u, Grafo)) { Aux = PrimeiroListaAdj(&u, Grafo); FimListaAdj = FALSE; while (FimListaAdj == FALSE) { ProxAdj(&u, &v, &Peso, &Aux, &FimListaAdj); if (Cor[v] != branco) continue; Cor[v] = cinza; Dist[v] = Dist[u] + 1; Antecessor[v] = u; Item.Vertice = v; Item.Peso = Peso; Enfileira(Item, &Fila); } } Cor[u] = preto; printf("Visita%2d Dist%2d cor: preto F:", u, Dist[u]); ImprimeFila(Fila); getchar(); } } /* VisitaBfs */