Skip to content

Estudos de estruturas de dados e algoritmos em C com ênfase na gestão explícita de memória e manipulação direta de endereços

Notifications You must be signed in to change notification settings

willianmv/data-structure-practice

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

💻 Por que praticar Estruturas de Dados em C?

Entender estruturas de dados em C oferece uma perspectiva única e profunda sobre como programas funcionam na memória do computador. Diferentemente de linguagens de alto nível como Python, Java ou JavaScript, C exige que você gerencie diretamente a memória, usando ponteiros, alocação dinâmica e liberação manual. 🧠

🧩 Entendimento real da memória

Cada variável, array ou estrutura existe em um endereço específico da memória. Você aprende a manipular esses endereços com ponteiros, entender como os dados são armazenados e como acessar ou modificar valores diretamente.

Esse conhecimento dá uma visão interna do que linguagens de alto nível abstraem, tornando você mais consciente sobre:

  • Eficiência
  • Desempenho
  • Consumo de memória ⚡

🔗 Estruturas de dados explícitas

Ao implementar listas encadeadas, pilhas, filas ou árvores em C, você precisa conectar elementos manualmente com ponteiros. Isso força a compreender:

  • Como os elementos estão ligados na memória 🧱
  • Como inserir, remover ou percorrer elementos
  • Como otimizar o uso de memória e evitar vazamentos 💧

Esse entendimento não só reforça a lógica de programação, mas também ensina como estruturas prontas funcionam “por baixo dos panos” em outras linguagens.

🌱 Transferência de conhecimento

Mesmo que você nunca mais use C, o que aprende nele é aplicável em qualquer linguagem:

  • Entender referências, cópias e compartilhamento de dados 🔄
  • Distinguir valor vs endereço
  • Raciocinar sobre complexidade de operações e otimização 📈

C serve como laboratório de baixo nível, revelando detalhes que outras linguagens escondem.

4️⃣ Controle e eficiência

Aprender a manipular memória manualmente e usar ponteiros permite escrever programas mais precisos, eficientes e seguros, especialmente em casos de alta performance ou estruturas complexas de dados. ⚡


Estrutura das Pastas 📂

pasta-principal/
│
├── include/ Headers (.h)
│ └── *.h -> Arquivos header da estrutura
│
├── src/ Implementações (.c)
│ └── *.c -> Arquivos com funções
│
├── tests/ Arquivos main de teste
│ └── *_test.c -> Programas para testar cada estrutura
│
├── bin/ Executáveis gerados (não versionado no github)
│
└── README.md # Documentação do projeto

Estruturas de Dados 🗄️

1. Lista Encadeada (Singly Linked List)

  • Descrição: Cada elemento aponta para o próximo, crescimento dinâmico.
  • Exemplos: Implementação de filas ou histórico de navegação.
  • Complexidade:
    • Inserir/remover início: O(1)
    • Inserir/remover fim/meio: O(n)
    • Acesso: O(n)
  • Quando usar: Inserções e remoções frequentes, tamanho variável.

2. Lista Duplamente Encadeada (Doubly Linked List)

  • Descrição: Cada nó aponta para o próximo e para o anterior, permitindo percorrer a lista em ambos os sentidos.
  • Exemplos: Navegadores (histórico para frente e para trás), editores de texto (undo/redo), playlists.
  • Complexidade:
    • Inserir/remover início/fim: O(1)
    • Inserir/remover no meio: O(n)
    • Acesso: O(n)
  • Quando usar: Quando precisa de percorrer a lista em ambos os sentidos ou remoções/inserções frequentes em qualquer posição.

3. Pilha (Stack)

  • Descrição: LIFO (Last In, First Out) – último a entrar, primeiro a sair.
  • Exemplos: Undo/redo em editores, chamadas de função (call stack).
  • Complexidade:
    • Push/Pop: O(1)
    • Acesso: O(n) se precisar percorrer
  • Quando usar: Reversão, controle de chamadas, parsing.

4. Fila (Queue)

  • Descrição: FIFO (First In, First Out) – primeiro a entrar, primeiro a sair.
  • Exemplos: Impressoras, processamento de tarefas, threads.
  • Complexidade:
    • Enqueue/Dequeue: O(1)
    • Acesso: O(n)
  • Quando usar: Processamento sequencial, buffer de dados.

5. Árvore Binária de Busca (BST)

  • Descrição: Cada nó tem até dois filhos; filho esquerdo < pai < filho direito.
  • Exemplos: Bancos de dados, sistemas de busca, dicionários.
  • Complexidade (árvore balanceada):
    • Inserção/Remoção/Busca: O(log n)
    • Percurso (inorder/preorder/postorder): O(n)
  • Quando usar: Busca rápida, ordenação dinâmica, organização hierárquica.

About

Estudos de estruturas de dados e algoritmos em C com ênfase na gestão explícita de memória e manipulação direta de endereços

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages