aula 239

Estrutura de dados FILA – segunda versão com a estrutura Fila

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;
}

Deixe um comentário

4 − 4 =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.