Nesta aula vamos desenvolver uma segunda versão para a implementação da estrutura de dados dinâmica do tipo fila. Agora, além da estrutura Nó, vamos também criar uma estrutura Fila com um ponteiro para o primeiro nó, um ponteiro para o último nó e o tamanho da fila.
Utilizar outra estrutura significa consumir mais memória. Contudo, também significa tornar o código menos complexo. Como o ponteiro para o início da fila estará dentro da estrutura fila, não será necessário mais a utilização de ponteiro para ponteiro.
Agora, nossa estrutura fila será composta de duas estruturas, a estrutura Nó que já conhecemos, e a estrutura fila, assim:
/* Estruturas para trabalhar com a estrutura de dados do tipo fila encadeada */ typedef struct no{ int valor; struct no *proximo; }No; typedef struct{ No *prim; No *fim; int tam; }Fila;
Ao criar uma fila seu estado inicial é vazio. Então, podemos criar um procedimento para isso, inicializando os ponteiros e o tamanho da fila, assim:
/* Procedimento para inicializar uma estrutura do tipo fila */ void criar_fila(Fila *fila){ fila->prim = NULL; fila->fim = NULL; fila->tam = 0; }
Precisamos também alterar o procedimento para inserir um novo elemento na fila. Com um ponteiro para o fim da fila, não precisamos percorrer toda a fila, podemos acessar diretamente o último nó da nossa fila.
/* Procedimento para inserir um novo nó na fila */ void inserir_na_fila(Fila *fila, int num){ No *aux, *novo = malloc(sizeof(No)); if(novo){ novo->valor = num; novo->proximo = NULL; if(fila->prim == NULL){ // se a fila estiver vazia fila->prim = novo; fila->fim = novo; } else{ // se a fila NÃO estiver vazia fila->fim->proximo = novo; // o próximo do ponteiro fim aponta para o novo nó fila->fim = novo; // o ponteiro fim aponta para o novo nó } fila->tam++; } else printf("\nErro ao alocar memoria.\n"); }
Código completo em C para a segunda versão da estrutura de dados do tipo Fila
/* Código escrito por Wagner Gaspar Julho de 2021 Aula 238: Estrutura FILA - Segunda versão */ typedef struct no{ int valor; struct no *proximo; }No; typedef struct{ No *prim; No *fim; int tam; }Fila; void criar_fila(Fila *fila){ fila->prim = NULL; fila->fim = NULL; fila->tam = 0; } void inserir_na_fila(Fila *fila, int num){ No *aux, *novo = malloc(sizeof(No)); if(novo){ novo->valor = num; novo->proximo = NULL; if(fila->prim == NULL){ fila->prim = novo; fila->fim = novo; } else{ fila->fim->proximo = novo; fila->fim = novo; } fila->tam++; } else printf("\nErro ao alocar memoria.\n"); } No* remover_da_fila(Fila *fila){ No *remover = NULL; if(fila->prim){ remover = fila->prim; fila->prim = remover->proximo; fila->tam--; } else printf("\tFila vazia\n"); return remover; } void imprimir(Fila *fila){ No *aux = fila->prim; printf("\t------- FILA --------\n\t"); while(aux){ printf("%d ", aux->valor); aux = aux->proximo; } printf("\n\t------- FIM FILA --------\n"); } int main(){ No *r; Fila fila; int opcao, valor; criar_fila(&fila); do{ printf("\t0 - Sair\n\t1 - Inserir\n\t2 - Remover\n\t3 - Imprimir\n"); scanf("%d", &opcao); switch(opcao){ case 1: printf("Digite um valor: "); scanf("%d", &valor); inserir_na_fila(&fila, valor); break; case 2: r = remover_da_fila(&fila); if(r){ printf("Removido: %d\n", r->valor); free(r); } break; case 3: imprimir(&fila); break; default: if(opcao != 0) printf("\nOpcao invaluda!\n"); } }while(opcao != 0); return 0; }