Lista ligada simples em C e C++
Nesta lição, você vai construir, percorrer e liberar uma lista ligada simples em C e C++.
Introdução
Uma lista ligada simples (singly linked list) é formada por nós (nodes), e cada nó guarda um valor e um ponteiro para o próximo nó. Diferente de um array, os nós não precisam ficar lado a lado na memória, então você pode adicionar elementos sem deslocar os outros.
Pontos importantes
- Defina as condições que sempre devem ser verdadeiras (invariantes) antes de escrever as operações.
- Trate os casos de estrutura vazia, cheia e de falha na alocação de memória.
- Avalie ao mesmo tempo a complexidade e o gerenciamento de memória de cada operação.
Veja como funciona
Adicione nós no início ou no fim e clique num nó para apagá-lo. Clique em Executar para seguir os ponteiros next de head até NULL.
Exemplos de código C e C++
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int value;
struct Node *next;
} Node;
int main(void) {
Node *head = NULL;
for (int value = 3; value >= 1; --value) {
Node *node = malloc(sizeof *node);
if (!node) return 1;
*node = (Node){value, head};
head = node;
}
while (head) {
Node *next = head->next;
printf("%d ", head->value);
free(head);
head = next;
}
puts("");
return 0;
}
1 2 3
#include <iostream>
#include <memory>
struct Node {
int value;
std::unique_ptr<Node> next;
};
int main() {
std::unique_ptr<Node> head;
for (int value = 3; value >= 1; --value) {
head = std::make_unique<Node>(Node{value, std::move(head)});
}
for (Node *node = head.get(); node; node = node->next.get()) {
std::cout << node->value << ' ';
}
std::cout << '\n';
}
1 2 3
Comparação entre C e C++
Na versão em C, cada nó é alocado com malloc, e o programa precisa percorrer a lista inteira chamando free em cada nó no final. Na versão em C++, os nós são ligados com std::unique_ptr, então, quando o primeiro nó é destruído, toda a cadeia seguinte é liberada automaticamente.
Os dados (struct) e as operações ficam separados, e a memória é alocada e liberada à mão.
Classes e contêineres protegem a consistência dos dados e gerenciam os próprios recursos.
Exercícios práticos
Execute as duas versões e depois mude o código para observar a diferença de segurança que cada linguagem oferece.
- Adicione testes para a estrutura vazia e para quando ela atinge a capacidade.
- Escreva a liberação de memória e verifique se há vazamentos.
- Compare a complexidade com o contêiner equivalente da biblioteca padrão.
Pratique com um desafio
Use o conteúdo desta lição para resolver um problema real. Cada desafio roda no navegador, com testes instantâneos e uma revisão por IA.
Todos os desafios