Desafio 2: Implemente o TAD Listas circulares simples. Deve ter as operações abaixo: (2 V)
d. Imprimir a lista
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