Desafio 1: Implemente o TAD Listas duplamente ligadas de inteiros. Deve ter as operações abaixo: (2 V):
g. Eliminar a lista

Passo 1

Beleza, vamos lá! O enunciado pede para a gente implementar o TAD (Tipo Abstrato de Dados) para listas duplamente ligadas de inteiros, especificamente a operação de “Eliminar a lista”. Isso faz parte da matéria de Estruturas de Dados, onde vamos mexer com ponteiros e a manipulação de nós em uma lista que aponta tanto para o próximo quanto para o anterior. Para resolver isso, vamos precisar entender como as listas duplamente ligadas funcionam e como liberar a memória que foi alocada para essa lista.

Passo 2

Primeiro, vamos lembrar como uma lista duplamente ligada é estruturada. Cada elemento da lista, chamado de nó, tem três partes: um valor inteiro, um ponteiro para o próximo nó e um ponteiro para o nó anterior. Essa estrutura permite navegar tanto para frente quanto para trás na lista.

Passo 3

Para eliminar a lista, a ideia é percorrer todos os nós e liberar a memória que foi reservada para cada um deles. Isso evita problemas de memória, como vazamentos, onde a memória não é liberada corretamente e fica ocupada desnecessariamente.

Passo 4

Vamos assumir que temos uma estrutura de nó definida assim:
typedef struct No {
    int valor;
    struct No* proximo;
    struct No* anterior;
} No;
E uma estrutura para a lista que mantém o ponteiro para o primeiro nó:
typedef struct Lista {
    No* cabeca;
} Lista;

Passo 5

A função para eliminar a lista vai precisar percorrer cada nó, liberar a memória e depois, por fim, liberar a própria estrutura da lista. Vamos fazer isso passo a passo.

Passo 6

Primeiro, verificamos se a lista não está vazia. Se o ponteiro cabeca for NULL, a lista já está vazia e não precisa fazer nada.

Passo 7

Caso a lista não esteja vazia, iniciamos um ponteiro temporário que aponta para o primeiro nó. Em seguida, usamos um loop para percorrer cada nó, guardar o próximo nó temporariamente, liberar o nó atual e então mover para o próximo.

Passo 8

Depois de liberar todos os nós, liberamos também a estrutura da lista em si.

Passo 9

Aqui está um exemplo de como essa função pode ser implementada em C:
void eliminarLista(Lista* lista) {
    if (lista->cabeca == NULL) {
        printf("A lista já está vazia.\n");
        return;
    }
    
    No* atual = lista->cabeca;
    No* proximo = NULL;
    
    while (atual != NULL) {
        proximo = atual->proximo;
        free(atual);
        atual = proximo;
    }
    
    lista->cabeca = NULL;
    free(lista);
    printf("Lista eliminada com sucesso.\n");
}

Resposta

Pronto! Com a função acima, conseguimos eliminar completamente a lista duplamente ligada, liberando toda a memória que estava sendo usada pelos nós e pela própria estrutura da lista. Assim, evitamos vazamentos de memória e mantemos nosso programa mais eficiente e seguro.

Exercícios relacionados