Lista Encadeada Simples em C: Implementação

Classificado em Eletrônica

Escrito em em português com um tamanho de 3,76 KB

Estrutura da Lista

struct lista {
    int info;
    struct lista *prox;
};
typedef struct lista Lista;

Função de Inicialização

// Função de inicialização: retorna uma lista vazia
Lista* inicializa(void) {
    return(NULL);
}

Função de Inserção

/* Inserção no início: retorna a lista atualizada */
Lista* insere(Lista* l, int i) {
    Lista* novo = (Lista*)malloc(sizeof(Lista));
    novo->info = i;
    novo->prox = l;
    return novo;
}

Função Imprime

/* Função imprime: imprime valores dos elementos */
void imprime(Lista* l) {
    Lista* p; /* Variável auxiliar para percorrer a lista */
    for (p = l; p != NULL; p = p->prox) {
        printf("info = %d\n", p->info);
    }
}

Função Vazia

/* Função vazia: retorna 1 se vazia ou 0 se não vazia */
int vazia(Lista* l) {
    if (l == NULL) {
        return 1;
    } else {
        return 0;
    }
}

Função Busca

/* Função busca: busca um elemento na lista */
Lista* busca(Lista* l, int v) {
    Lista* p;
    for (p = l; p != NULL; p = p->prox) {
        if (p->info == v) {
            return p; /* Achou o elemento */
        }
    }
    return NULL; /* Não achou o elemento */
}

Função Retira

/* Função retira: retira elemento da lista */
Lista* retira(Lista* l, int v) {
    Lista* ant = NULL; /* Ponteiro para elemento anterior */
    Lista* p = l;    /* Ponteiro para percorrer a lista */

    /* Procura elemento na lista, guardando anterior */
    while (p != NULL && p->info != v) {
        ant = p;
        p = p->prox;
    }

    /* Verifica se achou elemento */
    if (p == NULL) {
        return l; /* Não achou: retorna lista original */
    }

    /* Retira elemento */
    if (ant == NULL) {
        /* Retira elemento do início */
        l = p->prox;
    } else {
        /* Retira elemento do meio da lista */
        ant->prox = p->prox;
    }
    free(p);
    return l;
}

Função Libera

/* Função libera: libera toda a memória alocada */
void libera(Lista* l) {
    Lista* p = l;
    while (p != NULL) {
        Lista* t = p->prox; /* Guarda referência para o próximo elemento */
        free(p);          /* Libera a memória apontada por p */
        p = t;            /* Faz p apontar para o próximo */
    }
}

Função Principal (Exemplo de Uso)

// Incluir bibliotecas necessárias no arquivo .c completo:
// #include <stdio.h>
// #include <stdlib.h>
// #include <conio.h> // Para getch() - não padrão

int main(void) {
    Lista* l;         /* Declara uma lista não iniciada */
    l = inicializa(); /* Inicia lista vazia */
    l = insere(l, 23); /* Insere na lista o elemento 23 */
    l = insere(l, 45); /* Insere na lista o elemento 45 */
    l = insere(l, 56); /* Insere na lista o elemento 56 */
    l = insere(l, 78); /* Insere na lista o elemento 78 */

    printf("Lista após inserções:\n");
    imprime(l);       /* Imprimirá: info = 78\n info = 56\n info = 45\n info = 23\n */
    printf("\n--------------\n");

    printf("Após retirar 78:\n");
    l = retira(l, 78);
    imprime(l);       /* Imprimirá: info = 56\n info = 45\n info = 23\n */
    printf("\n--------------\n");

    printf("Após retirar 45:\n");
    l = retira(l, 45);
    imprime(l);       /* Imprimirá: info = 56\n info = 23\n */
    printf("\n--------------\n");

    printf("Liberando a lista...\n");
    libera(l);

    // getch(); // Usar getchar() ou remover para portabilidade
    printf("Pressione Enter para sair...\n");
    getchar(); // Aguarda o usuário pressionar Enter

    return 0;
}

Entradas relacionadas: