# Dicionário Português-Inglês em Pascal

## Descrição

Este programa implementa um dicionário Português-Inglês utilizando listas encadeadas dinâmicas em Pascal.

A estrutura principal é composta por:

* Uma lista duplamente encadeada de chaves.
* Cada chave possui um dicionário próprio.
* Cada dicionário é uma lista simplesmente encadeada de verbetes.

Cada verbete contém:

* Palavra em português.
* Tradução em inglês.

Exemplo:

Chave: A

* Abacaxi = Pineapple
* Amor = Love
* Avião = Airplane

Chave: M

* Mesa = Table
* Morango = Strawberry

---

# Estruturas Utilizadas

## Tverbete

Representa um verbete do dicionário.

Campos:

* br: palavra em português.
* ing: tradução em inglês.
* prox: próximo verbete da lista.

## Tlista

Representa uma chave do dicionário.

Campos:

* key: letra ou chave identificadora.
* dicionario: lista de verbetes pertencentes à chave.
* ant: chave anterior.
* prox: próxima chave.

---

# Funções

## ler

Lê uma string digitada pelo usuário.

Retorno:

* String informada pelo usuário.

---

## ler_int

Lê um número inteiro digitado pelo usuário.

Retorno:

* Valor inteiro informado.

---

## buscar_verbete

Procura uma palavra dentro de um dicionário.

Parâmetros:

* D: dicionário onde será feita a busca.
* P: palavra procurada.

Retorno:

* Ponteiro para o verbete encontrado.
* Nil caso não exista.

Método utilizado:

Busca recursiva.

---

## encontrar_lista

Localiza a chave responsável por armazenar determinada palavra.

Parâmetros:

* T_lista: lista principal.
* palavra: palavra a ser localizada.

Retorno:

* Ponteiro para a chave adequada.
* Nil caso não exista chave compatível.

---

# Procedimentos

## lista_iniciar

Inicializa a estrutura principal.

Ação:

* Define a lista principal como vazia.

---

## dicionario_adicionar

Insere um novo verbete em ordem alfabética.

Parâmetros:

* dicionario
* br
* ing

Ação:

* Cria um novo verbete.
* Insere mantendo a ordenação alfabética.

---

## dicionario_remover

Remove um verbete de um dicionário.

Parâmetros:

* dicionario
* palavra
* removido

Ação:

* Procura a palavra.
* Remove da lista.
* Retorna o ponteiro removido.

---

## lista_adicionar

Insere uma nova chave.

Parâmetros:

* lista

Ação:

* Cria uma nova chave.
* Mantém as chaves ordenadas.
* Atualiza ponteiros anterior e próximo.
* Redistribui verbetes quando necessário.

---

## redistribuir_verbetes

Redistribui verbetes após a criação de uma nova chave.

Parâmetros:

* lista
* chave

Ação:

* Localiza a nova chave.
* Analisa o dicionário da chave anterior.
* Separa os verbetes que agora pertencem à nova chave.
* Move esses verbetes para o novo dicionário.

Exemplo:

Antes:

Chave A

* Abacaxi
* Banana
* Morango

Após criar a chave M:

Chave A

* Abacaxi
* Banana

Chave M

* Morango

---

## mover_verbetes_para_listas

Redistribui verbetes quando uma chave é removida.

Parâmetros:

* lista
* origem

Ação:

* Percorre todos os verbetes da chave removida.
* Procura uma nova chave compatível.
* Reinsere os verbetes.
* Descarta os verbetes sem destino válido.

---

## adicionar_dicionario

Adiciona uma nova palavra ao sistema.

Ação:

* Solicita palavra em português.
* Solicita tradução.
* Localiza a chave correta.
* Insere o verbete.

---

## consultar_lista

Exibe todas as chaves cadastradas.

Ação:

* Percorre a lista principal.
* Mostra cada chave.

---

## consultar_dicionario

Busca uma palavra específica.

Ação:

* Procura a palavra em todas as chaves.
* Exibe a tradução caso encontrada.

---

## consultar_geral

Exibe todo o conteúdo do sistema.

Ação:

* Mostra todas as chaves.
* Mostra todos os verbetes de cada chave.

---

## remover_dicionario

Remove uma palavra do sistema.

Ação:

* Procura a palavra.
* Remove o verbete.
* Libera a memória utilizada.

---

## remover_lista

Remove uma chave inteira.

Ação:

* Remove a chave da lista principal.
* Redistribui seus verbetes.
* Libera a memória da chave removida.

---

## menu

Controla a interação com o usuário.

Opções:

1 - Adicionar chave

2 - Adicionar palavra

3 - Consultar chaves

4 - Consultar palavra

5 - Consultar geral

6 - Remover chave

7 - Remover palavra

0 - Sair

---

# Fluxo Geral do Programa

1. Inicializa a lista principal.
2. Exibe o menu.
3. Recebe a opção do usuário.
4. Executa a operação escolhida.
5. Retorna ao menu.
6. Encerra quando o usuário selecionar a opção 0.

---

# Conceitos Aplicados

* Ponteiros
* Alocação dinâmica
* Listas simplesmente encadeadas
* Listas duplamente encadeadas
* Recursão
* Manipulação de memória
* Ordenação alfabética
* Estruturas de dados dinâmicas

Lista Principal

[A] <-> [M] <-> [S]

[A]
 |
 v
Abacaxi -> Amor -> Avião

[M]
 |
 v
Mesa -> Morango

[S]
 |
 v
Sapato -> Sol