Desafio 2: Implemente o TAD Listas circulares simples. Deve ter as operações abaixo: (2 V)
g. Eliminar a lista

Passo 1

Beleza, vamos resolver esse exercício juntos! O enunciado pede para a gente implementar o TAD (Tipo Abstrato de Dados) de uma Lista Circular Simples e, especificamente, a operação de eliminar a lista. Isso está dentro da matéria de Estruturas de Dados, onde trabalhamos com diferentes formas de organizar e manipular informações na memória. Para resolver isso, vamos precisar entender como funciona uma lista circular simples e como eliminar todos os seus elementos de maneira eficiente.

Passo 2

Primeiro, vamos lembrar o que é uma Lista Circular Simples. É uma estrutura de dados onde cada elemento (chamado de nó) aponta para o próximo, formando um ciclo. Ou seja, o último nó aponta de volta para o primeiro, formando um círculo. Isso é útil para aplicações que precisam percorrer os elementos de forma contínua.

Passo 3

Para representar isso no código, geralmente usamos uma estrutura chamada que contém um valor e um ponteiro para o próximo nó. Em C, por exemplo, seria algo assim:
typedef struct No {
    int dados;
    struct No* proximo;
} No;
Aqui, dados armazena o valor do nó, e proximo é o ponteiro para o próximo nó na lista.

Passo 4

Agora, a operação que queremos implementar é eliminar a lista. Isso significa que precisamos liberar toda a memória ocupada pelos nós da lista, garantindo que não haja vazamentos de memória. Para fazer isso, vamos percorrer toda a lista e liberar cada nó individualmente.

Passo 5

Vamos criar uma função chamada eliminarLista que recebe um ponteiro para o último nó da lista (já que em uma lista circular, geralmente mantemos uma referência para o último nó para facilitar as operações). O objetivo é percorrer a lista a partir desse nó e liberar cada um até que todos estejam eliminados.

Passo 6

Dentro da função, vamos usar um ponteiro temporário para armazenar o próximo nó antes de liberar o atual. Continuaremos esse processo até que todos os nós tenham sido liberados. Por fim, vamos garantir que o ponteiro para o último nó seja definido como NULL, indicando que a lista está vazia.

Passo 7

Aqui está como a função pode ser implementada em C:
void eliminarLista(No** ultimo) {
    if (*ultimo == NULL) {
        return; // Lista já está vazia
    }

    No* atual = (*ultimo)->proximo; // Começa pelo primeiro nó
    No* proximoNo;

    while (atual != *ultimo) {
        proximoNo = atual->proximo;
        free(atual);
        atual = proximoNo;
    }

    free(*ultimo);
    *ultimo = NULL; // Lista está vazia
}
Explicando o código:
  • Verificamos se a lista já está vazia.
  • Iniciamos a partir do primeiro nó ((*ultimo)->proximo).
  • Em cada iteração, armazenamos o próximo nó, liberamos o nó atual e avançamos.
  • Após liberar todos os nós, liberamos o último nó e definimos o ponteiro como NULL.

Resposta

Prontinho! Implementamos a função eliminarLista para uma Lista Circular Simples, garantindo que toda a memória seja liberada corretamente e evitando vazamentos. Agora, ao chamar essa função passando o ponteiro para o último nó da lista, ela elimina toda a lista de forma eficiente.

Exercícios relacionados