Edição didática em português. O código e suas saídas preservam o original.
Lista simplesmente encadeada em C
Crie, percorra e libere nós ligados por ponteiros.

Cada nó guarda um dado e um ponteiro para o próximo nó. head aponta para o primeiro; NULL indica o final ou uma lista vazia. Ao contrário de um array, os nós não precisam ocupar endereços consecutivos.
Verifique malloc antes de escrever em um nó. Ao inserir ou remover, preserve a ligação com o restante da lista e atualize head se o primeiro nó mudar. Buscar um valor exige percorrer a lista e custa O(N).
Para liberar a lista, salve o próximo ponteiro antes de chamar free no nó atual. Teste listas vazias, com um nó e com vários nós; nunca consulte um nó depois de liberá-lo.
Código C
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node* insertHead(Node *head, int val) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = val;
newNode->next = head;
return newNode;
}
void printList(Node *head) {
Node *curr = head;
while (curr != NULL) {
printf("%d -> ", curr->data);
curr = curr->next;
}
printf("NULL\n");
}
void freeList(Node *head) {
Node *curr = head;
while (curr != NULL) {
Node *temp = curr;
curr = curr->next;
free(temp);
}
}
int main() {
Node *head = NULL;
head = insertHead(head, 30);
head = insertHead(head, 20);
head = insertHead(head, 10);
printf("Linked List: ");
printList(head);
freeList(head);
return 0;
}Abrir no compiladorSaída esperada
Linked List: 10 -> 20 -> 30 -> NULL
Perguntas frequentes
Por que o código e a saída continuam em inglês?
Palavras-chave, identificadores e textos verificados pelos testes são preservados para não alterar o programa. As explicações e os controles estão traduzidos.