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

Passo 1

Beleza, vamos lá! O desafio aqui é implementar o Tipo Abstrato de Dados (TAD) de Listas Circulares Simples. Especificamente, a operação que precisamos desenvolver é a de imprimir a lista. Para isso, vamos precisar entender como funcionam as listas circulares e como percorrê-las para exibir seus elementos.

Passo 2

Primeiro, vamos entender o que é uma lista circular simples. Imagine uma lista ligada comum, onde cada elemento aponta para o próximo. Na lista circular, o último elemento aponta de volta para o primeiro, formando um círculo. Isso significa que, se não tomarmos cuidado, podemos entrar em um loop infinito ao percorrer a lista.

Passo 3

Agora, vamos pensar em como implementar a operação de imprimir essa lista sem ficar preso nesse ciclo infinito. A ideia é começar do primeiro elemento e ir avançando elemento por elemento, imprimindo cada um, até que voltemos ao início. Para controlar isso, precisamos de uma condição de parada: quando chegarmos de volta ao primeiro elemento.

Passo 4

Vamos supor que cada elemento da lista tem uma estrutura que guarda um valor e um ponteiro para o próximo elemento. Em código, isso pode ser representado assim (em linguagem C, por exemplo):
typedef struct No {
    int valor;
    struct No* proximo;
} No;

Passo 5

Para implementar a função de imprimir, precisamos de um ponteiro para o início da lista. Vamos percorrer a lista começando desse ponteiro e imprimir cada valor até que novamente apontemos para o início. Aqui está como podemos fazer isso:
void imprimirLista(No* inicio) {
    if (inicio == NULL) {
        printf("A lista está vazia.\n");
        return;
    }

    No* atual = inicio;
    do {
        printf("%d ", atual->valor);
        atual = atual->proximo;
    } while (atual != inicio);
    printf("\n");
}

Resposta

A função imprimirLista percorre uma lista circular simples e imprime todos os seus elementos sem entrar em loop infinito. Se a lista estiver vazia, informa que está vazia. Do contrário, começa no primeiro elemento e continua imprimindo até retornar ao início.
Exemplo de uso:
int main() {
    // Criando os nós
    No* primeiro = malloc(sizeof(No));
    No* segundo = malloc(sizeof(No));
    No* terceiro = malloc(sizeof(No));

    // Atribuindo valores
    primeiro->valor = 1;
    segundo->valor = 2;
    terceiro->valor = 3;

    // Ligando os nós
    primeiro->proximo = segundo;
    segundo->proximo = terceiro;
    terceiro->proximo = primeiro; // Fecha o círculo

    // Imprimindo a lista
    imprimirLista(primeiro);

    // Liberação de memória omitida para simplificação
    return 0;
}
Saída esperada:
1 2 3 

Exercícios relacionados