Estruturas de dados em C/C++

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++

C
Executar →
main.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;
}
Resultado da execução
1 2 3
C++
Executar →
main.cpp
#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';
}
Resultado da execução
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.

C

Os dados (struct) e as operações ficam separados, e a memória é alocada e liberada à mão.

C++

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