Revisão da ETAPA 7 — Estruturas de dados, ordenação e busca

Revise as aulas 43 a 44 com uma folha de consulta, seis questões de leitura de código e uma lista de erros frequentes.

① Folha de consulta

Revise os conceitos essenciais da ETAPA 7nas tabelas a seguir.

📚 Escolher uma estrutura de dados

EstruturaCaracterísticaUso típico
arraysAcesso direto por índiceDados de tamanho fixo
Lista encadeadaInserção e remoção eficientesDados com tamanho variável
PilhaÚltimo a entrar, primeiro a sair (LIFO)Chamadas de funções e desfazer
FilaPrimeiro a entrar, primeiro a sair (FIFO)Espera por atendimento e BFS
  • Escolha a estrutura conforme as operações que precisam ser rápidas.

🔗 Nó de uma lista encadeada

struct Node {
    int value;
    struct Node *next; // Ponteiro para o próximo nó
};

// No último nó, next é NULL
  • Cada nó contém um ponteiro para o próximo nó.
  • Inserir ou remover exige ajustar os ponteiros quando a posição já é conhecida
  • Acesso por índice é lento: percorre a lista desde o início

📥 Pilha / 📤 Fila

// Pilha (LIFO): push / pop
push(1); push(2); push(3);
pop(); // → 3 (último inserido)

// Fila (FIFO): enqueue / dequeue
enqueue(1); enqueue(2); enqueue(3);
dequeue(); // → 1 (primeiro inserido)
  • Pilha: como uma pilha de pratos.Último a entrar, primeiro a sair
  • Fila: como a fila do caixa.Primeiro a entrar, primeiro a sair

🔀 Algoritmos básicos de ordenação

NomeEstratégiaComplexidade
BolhaCompara e troca vizinhosO(N²)
SeleçãoMove o menor valor para o inícioO(N²)
InserçãoInsere na posição correta da parte ordenadaO(N²)
  • Em geral, esses métodos têm custo O(N²). Ficam mais lentos rapidamente conforme N cresce
  • Métodos mais eficientes incluem quicksort (em média) e mergesort: O(N log N)

🔍 Busca linear e busca binária

MétodoPré-requisitoComplexidade
busca linearNenhumaO(N)
busca bináriaDados ordenadossão necessáriosO(log N)
  • A busca binária reduz o intervalo pela metadea cada comparação com o meio
  • Para N=1000: até 1000 passos lineares ou cerca de 10 binários
  • Em dados não ordenados, a busca binária não é válida

② Seis questões de leitura de código

Execute mentalmente antes de clicar em uma alternativa. Se errar, leia a explicação.

Q1. Comportamento da pilha

// Após os push, o que um único pop retorna?
push(10);
push(20);
push(30);
int v = pop();
printf("%d\n", v);

Qual é a saída?

10
20
30
Indefinido
Explicação: Uma pilha segue a ordem último a entrar, primeiro a sair (LIFO). O último valor inserido, 30, é o primeiro removido por pop. A saída é 30. Pense em pratos empilhados: retiramos primeiro o que está em cima.

Q2. Comportamento da fila

enqueue(10);
enqueue(20);
enqueue(30);
int v = dequeue();
printf("%d\n", v);

Qual é a saída?

10
20
30
Indefinido
Explicação: Uma fila segue a ordem primeiro a entrar, primeiro a sair (FIFO). O primeiro valor inserido por enqueue, 10, é o primeiro removido por dequeue. A saída é 10, como numa fila de atendimento.

Q3. Comparações da ordenação por bolha

int a[] = {5, 2, 8, 1, 9}; // N=5
for (int i = 0; i < N - 1; i++) {
    for (int j = 0; j < N - 1 - i; j++) {
        if (a[j] > a[j+1]) /* swap */;
    }
}

Quantas comparações o laço interno faz no total?

25 vezes
10 vezes
cinco vezes
15 vezes
Explicação: Para i=0, o laço interno executa quatro vezes; para i=1, três; para i=2, duas; para i=3, uma. O total é 4+3+2+1 = 10. Com N=5, a fórmula N(N-1)/2 também fornece 10. Esse crescimento é quadrático: O(N²).

Q4. Comparações na busca binária

// Procure um item em 1024 dados ordenados
// Aproximadamente quantas comparações no pior caso?

Aproximadamente quantas comparações no pior caso?

Cerca de 1024
Cerca de 512
Cerca de 10
Cerca de 1
Explicação: A busca binária reduz o intervalo pela metade: 1024 → 512 → 256 → 128 → … → 1. Dez reduções deixam um candidato, pois 2¹⁰ = 1024. Sua complexidade é O(log N), menor que a busca linear. Ela exige dados ordenados.

Q5. Último nó da lista encadeada

struct Node *cur = head;
while (cur->next != NULL) {
    cur = cur->next;
}
// Para qual nó cur aponta agora?

Para onde cur aponta?

Primeiro nó
Segundo nó
Último nó (cujo next é NULL)
NULL
Explicação: O laço continua enquanto cur->next != NULL. Quando next é NULL, cur ainda aponta para o último nó, cujo próximo é NULL. Se a condição fosse cur != NULL, ele só terminaria quando cur fosse NULL.

Q6. Primeira passagem da ordenação por seleção

int a[] = {5, 2, 8, 1, 9};
// Após uma passagem (encontrar o mínimo e trocá-lo com o primeiro)?

Como fica o vetor após a primeira passagem?

{1, 2, 5, 8, 9} (todo ordenado)
{1, 2, 8, 5, 9} (mínimo no início, demais sem troca)
{1, 5, 8, 2, 9}
{2, 5, 8, 1, 9}
Explicação: A ordenação por seleção procura o menor elemento da parte ainda não ordenada e o troca com o primeiro dessa parte. Na primeira passagem, encontra 1 no índice 3 e o troca com 5 no início, produzindo {1, 2, 8, 5, 9}. As passagens seguintes repetem o processo a partir de a[1].

③ Lista de erros e dificuldades frequentes

Se reconhecer um erro que já cometeu, volte à página correspondente para revisar.
  1. 1
    Confundir a ordem da pilha e da fila
    push/pop usa LIFO;enqueue/dequeue usa FIFO.Lembre pelo exemplo(pilha de pratos e fila do caixa).
  2. 2
    Confundir cur != NULL com cur->next != NULL
    A primeira condição percorre todos os nós; a segunda para no último. Escolha conforme o objetivo.
  3. 3
    Esquecer de chamar free para os nós
    Quando terminar de usar um nó, free é necessário para evitar Vazamento de memória. Guarde next em outra variável antes de liberar o nó atual.
  4. 4
    Usar busca binária em um array não ordenado
    A busca binária exige dados ordenados. Sem essa condição, o resultado pode ser incorreto.
  5. 5
    Errar os limites do laço interno de bolha, seleção ou inserção
    j < N - 1 - i e j >= 1 : errar o limite por uma posição pode causar Acesso fora dos limites.
  6. 6
    Subestimar o custo de O(N²)
    Para N=10, a escala é de 100 operações; para N=10000, de 100 milhões. Para entradas grandes, prefira algoritmos eficientes, como os de custo O(N log N).
  7. 7
    Durante swap, uma variável temporária foi esquecida e um valor se perdeu
    a = b; b = a; faz ambas receberem o valor original de b.int t = a; a = b; b = t; realiza a troca por meio de uma variável temporária.

④ Páginas para revisar — retome os pontos difíceis

Use os links para voltar diretamente à explicação correspondente.
Estruturas de DadosPara revisar listas encadeadas, pilhas e filas Algoritmos de OrdenaçãoPara revisar bolha, seleção, inserção e busca binária Fundamentos de ponteirosQuando, em uma lista encadeada, next ainda não estiver claro Memória dinâmicaPara alocar e liberar nós dinamicamente Folha de consulta rápidaRevise complexidade e estruturas de dados em uma página