Lista Encadeada Dinâmica em C: Implementação Completa

Classificado em Grego

Escrito em em português com um tamanho de 2,31 KB

Desafio: Crie um programa capaz de armazenar dados em uma estrutura de dados do tipo lista encadeada dinâmica.

Código-Fonte em C

#include <stdio.h>
#include <stdlib.h>

typedef struct no {
    int valor;
    struct no *prox;
} lista;

lista *p, *q = NULL, *inicio = NULL;

void remover(int n) {
    p = inicio;
    q = NULL;
    int achou = 0;
    while ((p != NULL) && (achou == 0)) {
        if (p->valor != n) { // avança para o próximo
            q = p;
            p = p->prox;
        } else { // encontrou o valor
            if (q == NULL) { // é o primeiro nó
                inicio = p->prox;
                free(p);
            } else { // nó do meio ou final
                q->prox = p->prox;
                free(p);
            }
            achou = 1;
        }
    }
}

void exibir() {
    p = inicio;
    while (p != NULL) {
        printf("%d | ", p->valor);
        p = p->prox;
    }
}

void consultar() {
    int v;
    printf("\nDigite o valor para consulta: ");
    scanf("%d", &v);
    int achou = 0;
    p = inicio;
    while (p != NULL && achou == 0) {
        if (p->valor == v) {
            printf("Valor encontrado: %d", p->valor);
            achou = 1;
        }
        p = p->prox;
    }
}

void inserir() {
    int v;
    printf("\nDigite o valor: ");
    scanf("%d", &v);
    p = (lista*) malloc(sizeof(lista));
    p->valor = v;
    p->prox = NULL;
    if (inicio == NULL)
        inicio = p;
    if (q != NULL)
        q->prox = p;
    q = p;
}

int main() {
    int op;
    do {
        printf("\n*** Menu de Opções ***");
        printf("\n1- Inserir Valor");
        printf("\n2- Consultar Valor");
        printf("\n3- Exibir Lista");
        printf("\n4- Remover Valor");
        printf("\n5- SAIR");
        printf("\nDigite a sua opção: ");
        scanf("%d", &op);
        switch (op) {
            case 1: inserir(); break;
            case 2: consultar(); break;
            case 3: exibir(); break;
            case 4: {
                int v;
                printf("\nDigite o valor a ser removido: ");
                scanf("%d", &v);
                remover(v);
                break;
            }
        }
    } while (op != 5);
    return 0;
}

Entradas relacionadas: