Desafio 1: Implemente o TAD Listas duplamente ligadas de inteiros. Deve ter as operações abaixo: (2 V):
g. Eliminar a lista
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.