Estrutura de Dados (DPADF 0056)
Aula 11 – Listas Ordenadas
Universidade Federal de Santa Maria
Colégio Agrícola de Frederico Westphalen
Curso Superior de Tecnologia em Sistemas para Internet
Prof. Bruno B. Boniati – www.cafw.ufsm.br/~bruno
Conjunto de dados mantido sempre ordenado
12
45
?
23
28
33
Listas Ordenadas
• Cada inserção de um novo elemento deverá obedecer ao
critério de ordenação;
• Antes de incluir um novo elemento da lista sua posição
correta precisa ser encontrada:
Novo elemento
12
28
33
23
45
Mantendo a Lista Ordenada
• Manter uma lista ordenada em geral não é eficiente pois
cada vez que a lista aumentar de tamanho, maior será o
custo computacional de realizar a operação de inclusão;
• A única alteração a ser feita é na função de inclusão, que
precisará percorrer a lista procurando o elemento após o
qual a inclusão será feita;
• Se a ordem de armazenamento dos elementos na lista
não for significante/determinante para o problema em
questão, não é recomendado a utilização de listas
ordenadas;
Prós e contras
• Uma lista ordenada é uma boa escolha se ...
▫ Você precisa que os elementos sejam mantidos sempre de
acordo com algum critério de ordenação e a eventual
demora na inclusão de novos elementos não é um fator
importante;
• Uma lista ordenada não é uma boa escolha se ...
▫ Você precisa de rapidez de inclusão e não precisa
necessariamente que os elementos da lista estejam
ordenados;
• Uma opção alternativa seria disponibilizar uma operação para ordenar
a lista (somente quando houvesse necessidade)
Implementação
Elemento* insere_ordenado (Elemento* inicio, int v) {
//procurar a posição a ser inserido o elemento
TO-DO?
// TO-DO
//alocar memória para o novo elemento
// TO-DO
//encadear o novo elemento
// TO-DO
}
Exercícios para fixação
Lista de Nomes em Ordem Alfabética
• Que tal implementar um TAD Lista para ler um
conjunto de caracteres de um arquivo e
apresentá-los de forma ordenada.
▫ Tente variar o tamanho do arquivo e medir o
desempenho do programa.
Estrutura de Dados (DPADF 0056)
Aula 12 – Lista Duplamente Encadeada
Universidade Federal de Santa Maria
Colégio Agrícola de Frederico Westphalen
Curso Superior de Tecnologia em Sistemas para Internet
Prof. Bruno B. Boniati – www.cafw.ufsm.br/~bruno
Lista com encadeamento nos dois sentidos (anterior e próximo)
Lista duplamente encadeada
• Até então o que vimos foram listas com encadeamento
simples (cada elemento indica seu vizinho em um único
sentido: “início fim” da lista);
• Suponhamos a necessidade de percorrer uma lista em
sua ordem inversa. Isso seria possível?
• Outra dificuldade é a retirada de um elemento, pois
mesmo conhecendo seu ponteiro, de nada adianta se não
conhecermos também seu antecessor;
Lista duplamente encadeada
• Uma lista duplamente encadeada é uma lista onde cada
elemento possui dois campos de encadeamento:
▫ Uma indicação para o próximo elemento;
▫ Uma indicação para o elemento anterior;
• Em uma lista duplamente encadeada se obtivermos uma
referência a qualquer elemento da lista podemos avançar
ou retroceder ambos os sentidos.
ɸ
10
40
17
6
40
ɸ
Para exemplificar ...
anterior
10
proximo
struct elemento {
int conteudo;
struct elemento* anterior;
struct elemento* proximo;
};
typedef struct elemento Elemento;
Implementação
• As interfaces das operações são exatamente as
mesmas ... E basicamente duas operações
precisam ser alteradas:
▫ Inclusão
 Tanto o novo elemento como os elementos entre o
qual ocorrerá a inclusão precisam ter suas ligações
atualizadas;
▫ Exclusão
 Os elementos antes e após ao elemento a ser
excluído precisarão ajustar suas ligações;
Vantagens
• Com a referência a qualquer elemento da lista posso
descobrir seu início e seu final;
• Conhecendo a referência a um elemento posso fazer sua
exclusão sem a necessidade de descobrir seu elemento
anterior;
• Estabeleço uma relação bilateral de vizinhança o que
pode possibilitar outras operações, como a ordenação da
lista, por exemplo.
Exercícios para fixação
Qual a distância de um elemento?
(do começo para o fim e do fim para o começo)
• Usando uma LDE (lista duplamente encadeada) e
a referência a um elemento qualquer da lista você
consegue dizer a posição que esse elemento
ocupa?
40
O elemento
ocupa a 4ª posição (em
relação ao início) e a 2ª posição em relação ao fim)
ɸ
10
40
17
6
40
ɸ
Download

Listas Ordenadas e Aula 12 - Listas Duplamente Encadeadas (LDE)