Upload
samuelthiago
View
803
Download
0
Embed Size (px)
Citation preview
1
Curso Superior de Tecnologia em TelemáticaProgramação e Estruturas de Dados
Listas Lineares Duplamente Encadeadas
Copyright©2010Prof. César Rocha
2
Objetivos
§ Explorar conceitos importantes acerca das listas listas duplamente encadeadasduplamente 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 bibliotecasbibliotecas em práticas de laboratório futuras
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...
4
Desvantagens Lista Encadeada
� Em uma lista encadeada simples, não temos como percorrer eficientemente os elementos em ordemordeminversainversa, isto é, do final para o início da lista� O encadeamento simples também dificultava a
remoçãoremoção de um elemento da lista. Veja abaixo:/* Parâmetros: lista = a lis
dado = passa
posição = pos
Retorno: 1 em caso de suce
*/
int removerElemento(TListaEnc*TListaEnc aux;TListaEnc anterior;int contador;// verifica se a lista esta v
if(listaVazia(lista)) return
Assim, mesmo quando sabíamos qual elemento íamos retirar, Assim, mesmo quando sabíamos qual elemento íamos retirar, tínhamos que percorrer a lista, elemento por elemento, até tínhamos que percorrer a lista, elemento por elemento, até encontrarmos o elemento anterior.encontrarmos o elemento anterior.
Isso se deve porque, dado um elemento, não tínhamos como Isso se deve porque, dado um elemento, não tínhamos como acessar diretamente o seu elemento anterior (ou antecessor) acessar diretamente o seu elemento anterior (ou antecessor) para redirecionar o ponteiro.para redirecionar o ponteiro.
Note, na função de remoção, que a solução encontrada foi Note, na função de remoção, que a solução encontrada foi declarar uma variável somente para podermos guardar o declarar uma variável somente para podermos guardar o endereço do nó anterior ao elemento a ser removido da lista.endereço do nó anterior ao elemento a ser removido da lista.
5
§ Para solucionar esses problemas, podemos formar o que chamamos de listas duplamente encadeadaslistas 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§§ GraficamenteGraficamente
§ O primeiro nó não possui elemento anterior (o ponteiro do elemento anterior terá valor NULL)
Conceitos
LJoão Maria Ana Edu
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
7
§ Este novo TAD possui semelhanças com TListaEnc§§ RepresentaçãoRepresentação de cada nó:§ estrutura contém os campos dado, proximo e anterior
§ Onde:
Estruturação dos Dados
/* estruturação */typedef struct nolista {
int dado;struct nolista* proximo;struct nolista* anterior;
}no;typedef no* TListaDupEnc;
/* estruturação */typedef struct nolista {
int dado;struct nolista* proximo;struct nolista* anterior;
}no;typedef no* TListaDupEnc;
/* estruturação */typedef struct nolista {
int dado;struct nolista* proximo;
}no;typedef no* TListaEnc;
/* estruturação */typedef struct nolista {
int dado;struct nolista* proximo;
}no;typedef no* TListaEnc;
TListaDupEnc *pOnde:Onde:pp-->dado;>dado;pp-->>proxprox;;pp-->ant;>ant;
dado proxant
8
Operações básicas
§ A literatura é unânime quanto às operações básicas realizadas numa lista duplamente encadeada:� criarcriar uma lista vazia� verificar se uma lista estáestá vaziavazia� obter o tamanhotamanho da uma lista� obterobter o elementoelemento de uma determinada posição na
lista� obter a posiçãoobter a posição onde se encontra um determinado
elemento� inserir um novo elementoinserir um novo elemento numa determinada
posição na lista� removerremover um elemento de uma determinada posição
na lista
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
10
Para um bom aproveitamento:Para um bom aproveitamento:
§ Codifique os exemplos mostrados nestes slides e verifique pontos de dúvidas§ Resolva todas as questões da prpráática de tica de
laboratlaboratóório de listas duplamente encadeadasrio 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!