2. Objetivos
§ Explorar conceitos importantes acerca das listas
duplamente encadeadas utilizando a linguagem C
§ Organização e implementação, características,
vantagens e desvantagens, regras de utilização,
operações básicas e os algoritmos de implementação
§ Estas estruturas são um pouco mais complicadas
que as listas encadeadas (módulo anterior)
§ Contudo, tenta superar algumas limitações
encontradas no TAD supracitado
§ Este módulo também fará uso das regras de criação
das bibliotecas em práticas de laboratório futuras
2
3. Motivação
§ Você deve lembrar que a estrutura lista encadeada,
vista no módulo anterior, caracterizava-se por um
encadeamento simples entre os elementos
§ Havia a alocação dinâmica de cada elemento
§ Cada elemento armazenava um único ponteiro para o
próximo elemento da lista
§ Lembre-se que esta estrutura resolveu algumas das
limitações encontradas nas listas seqüenciais
§ Pré-dimensionamento da lista
§ Sub-utilização de memória
§ Porém, você pode ter notado que... 3
4. Desvantagens Lista Encadeada
Œ Em uma lista encadeada simples, não temos como
percorrer eficientemente os elementos em ordem
inversa, isto é, do final para o início da lista
• O encadeamento simples também dificultava a
remoção de um elemento da lista. Veja abaixo:
Assim, mesmo quando sabíamos qual elemento íamos retirar, /* Parâmetros: lista = a lis
tínhamos que percorrer a lista, elemento por elemento, até
dado = passa
posição = pos
encontrarmos o elemento anterior. Retorno: 1 em caso de suce
*/
Isso se deve porque, dado um elemento, não tínhamos como int removerElemento(TListaEnc*
TListaEnc aux;
acessar diretamente o seu elemento anterior (ou antecessor) TListaEnc anterior;
para redirecionar o ponteiro. int contador;
// verifica se a lista esta v
Note, na função de remoção, que a solução encontrada foi
if(listaVazia(lista)) return
declarar uma variável somente para podermos guardar o
endereço do nó anterior ao elemento a ser removido da lista. 4
5. Conceitos
§ Para solucionar esses problemas, podemos formar o
que chamamos de listas duplamente encadeadas
§ Semelhante à lista encadeada, mas contém dois
ponteiros (ou links) na estrutura do nó
§ Cada elemento agora tem um ponteiro para o próximo
elemento e um ponteiro para o seu elemento anterior
§ Graficamente
L
João Maria Ana Edu
§ O primeiro nó não possui elemento anterior (o ponteiro
do elemento anterior terá valor NULL) 5
6. Vantagens
§ Isto trará novas oportunidades ao novo TAD:
Œ Dado um elemento, poderemos acessar ambos
elementos adjacentes: o próximo e o anterior
• O ponteiro para o elemento anterior, bem como o
endereço do próximo elemento serão manipulados
diretamente
Ž Inserção à direita e à esquerda de um nó qualquer
• Se tivermos um ponteiro para o último elemento da
lista, poderemos percorrê-la na ordem inversa
•Também utilizará a memória de maneira eficiente com
alocação dinâmica como fez o TAD do módulo anterior
6
7. Estruturação dos Dados
§ Este novo TAD possui semelhanças com TListaEnc
§ Representação de cada nó:
§ estrutura contém os campos dado, proximo e anterior
/* estruturação */
/* estruturação */ /* estruturação */
/* estruturação */
typedef struct nolista {
typedef struct typedef struct nolista {
typedef
int dado;
int dado; int dado;
int
struct nolista* proximo;
struct nolista* struct nolista* proximo;
nolista*
}no;
}no; struct nolista* anterior;
typedef no* TListaEnc;
typedef no* TListaEnc; }no;
typedef no* TListaDupEnc;
§ Onde: Onde:
p->dado;
TListaDupEnc *p ant dado prox p->prox;
p->ant; 7
8. Operações básicas
§ A literatura é unânime quanto às operações básicas
realizadas numa lista duplamente encadeada:
Œ criar uma lista vazia
• verificar se uma lista está vazia
Ž obter o tamanho da uma lista
• obter o elemento de uma determinada posição na
lista
• obter a posição onde se encontra um determinado
elemento
‘ inserir um novo elemento numa determinada
posição na lista
’ remover um elemento de uma determinada posição
na lista
8
9. Algoritmos em C
§ O que deverá ser feito pelo aluno:
§ Escolha e instalação do ambiente a ser trabalhado no
laboratório
§ Modelagem deste TAD (dados e operações)
§ Implementação dos algoritmos de operações básicas
vistos em sala de aula na linguagem C
§ Utilização das regras de modelagem vistas no módulo
anterior (criação de bibliotecas) e modularização
§ Implantação de código legível e bem documentado
§ Nomes de variáveis condizentes com o problema
§ Prática de laboratório
9
10. Para um bom aproveitamento:
§ Codifique os exemplos mostrados nestes slides e
verifique pontos de dúvidas
§ Resolva todas as questões da prática de
laboratório de listas duplamente encadeadas
§ Procure o professor ou monitor da disciplina e
questione conceitos, listas, etc.
§ Não deixe para codificar tudo e acumular assunto
para a primeira avaliação.
§ Este é apenas um dos assuntos abordados na prova!
10