eng. de computação – estruturas de dados i – lista simplesmente encadeada prof. henrique...
TRANSCRIPT
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
1
TADS – Tipos Abstratos de Dados
Listas Encadeadas:
• Listas simplesmente encadeadas: cada nó aponta apenas para o próximo.
• Listas duplamente encadeadas: cada nó
aponta para o próximo e também para o
anterior.
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
2
Motivação para uso da lista encadeada: desvantagens do uso
de vetor • Tamanho máximo fixo
• Mesmo vazias ocupam espaço grande de memória
• Um vetor de ponteiros ameniza o desperdício de memória, mas, desperdiça a memória dos ponteiros não usados.
• Operações podem envolver muitos deslocamentos de dados:
• Inclusão em uma posição ou no início
• Exclusão em uma posição ou no início
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
3
Listas simplemente encadeadas
São listas onde cada elemento está armazenado em um TAD chamado elemento de lista.
Cada elemento da lista referencia o próximo que só é alocado quando necessário de forma dinamica
Para referenciar o primeiro elemento utiliza-se um TAD cabeça de lista.
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
4
Listas simplemente encadeadas
São listas onde cada elemento está armazenado em um TAD chamado elemento de lista.
Cada elemento da lista referencia o próximo que só é alocado quando necessário de forma dinamica
Para referenciar o primeiro elemento utiliza-se um TAD cabeça de lista.
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
5
Exemplo:
5
melão
info próximo
maçã
info próximo
uva
info próximo
qtde dadosCabeçade lista
Elemento de Lista
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
6
Modelagem da Cabeça da Lista
• Necessidade:
– Um inteiro para indicar a qtde de elementos da lista.
– Um ponteiro para o primeiro elemento da lista.
• Código:
struct Lista {
int qtde;
struct Elemento *dados;
};
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
7
Modelagem do Elemento da Lista
• Necessidade:
– Um ponteiro para o próximo elemento da lista.
– Um campo do tipo da informação que vamos armazenar.
• Código:
struct Elemento {
struct Elemento *prox;
tipo_desejado info;
};
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
8
Modelagem do Elemento da Lista (versão 2)
struct Elemento {
Elemento *proximo;
TipoInfo *info;
};
struct TipoInfo {
tipo-do-campo1 campo1;
tipo-do-campo2 campo2;
…
tipo-do-campoN campoN;
}
info como ponteiro torna os algoritmos mais genéricos.
Com o uso do typedef generaliza-se ainda mais.
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
9
Para tornar todos os algoritmos da lista mais genéricos, usa-se o campo info como um ponteiro para um elemento de informação.
3
info próximo info próximo info próximo
qtde dados
Elemento de Informação(TipoInfo)
melão
doce
caro
maçã
azeda
cara
uva
irkh
barata
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
10
Algumas funcionalidades básicas:– Criar lista.
– Colocar e retirar dados da lista.
– Realizar testes sobre a lista: se vazia, se contém elemento etc.
– Destruir uma lista.
3
melão
doce
caro
maçã
azeda
cara
uva
irkh
barata
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
11
Algoritmo: adicionaInicio
2
maçã
azeda
cara
uva
irkh
barata
qtde dados
info prox info prox
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
12
Algoritmo: adicionaInicio
2
maçã
azeda
cara
uva
irkh
barata
qtde dados
info prox info prox
int adicionaInicio(struct Lista *lista, struct Fruta *fruta)
melão
doce
caro
lista
fruta
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
13
Algoritmo: adicionaInicio
2
maçã
azeda
cara
uva
irkh
barata
qtde dados
info prox info prox
int adicionaInicio(struct Lista *lista, struct Fruta *fruta) { struct Elemento *novo;
melão
doce
caro
lista
fruta
novo
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
14
Algoritmo: adicionaInicio
2
maçã
azeda
cara
uva
irkh
barata
qtde dados
info prox info prox
int adicionaInicio(struct Lista *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento));
melão
doce
caro
lista
fruta
novo info prox
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
15
Algoritmo: adicionaInicio
2
maçã
azeda
cara
uva
irkh
barata
qtde dados
info prox info prox
int adicionaInicio(struct Lista *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento)); novo->prox = lista->dados;
melão
doce
caro
lista
fruta
novo info prox
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
16
Algoritmo: adicionaInicio
2
maçã
azeda
cara
uva
irkh
barata
qtde dados
info prox info prox
int adicionaInicio(struct Lista *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento)); novo->prox = lista->dados; novo->info = fruta;
melão
doce
caro
lista
fruta
novo info prox
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
17
Algoritmo: adicionaInicio
2
maçã
azeda
cara
uva
irkh
barata
qtde dados
info prox info prox
int adicionaInicio(struct Lista *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento)); novo->prox = lista->dados; novo->info = fruta; lista->dados = novo;
melão
doce
caro
lista
fruta
novo info prox
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
18
Algoritmo: adicionaInicio
3
maçã
azeda
cara
uva
irkh
barata
qtde dados
info prox info prox
int adicionaInicio(struct Lista *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento)); novo->prox = lista->dados; novo->info = fruta; lista->dados = novo; lista->qtde++;
melão
doce
caro
lista
fruta
novo info prox
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
19
Algoritmo: adicionaInicio
3
maçã
azeda
cara
uva
irkh
barata
qtde dados
info prox info prox
melão
doce
caro
lista
fruta
info prox
int adicionaInicio(struct Lista *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento)); novo->prox = lista->dados; novo->info = fruta; lista->dados = novo; lista->qtde++; return 0;}
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
20
Modelagem do Tipo Info
Para inserção em ordem e para localizar um determinado elemento são necessárias funções para comparar as informações associadas aos elementos
Estas operações de comparação fazem parte do TAD TipoInfo e não da Lista.
Sugestões:
– igual(dado1,dado2): 0 se igual, 1 se diferente
– maior(dado1,dado2): 0 se maior, 1 se menor ou igual
– maior(dado1,dado2): 0 se menor, 1 se maior ou igual
– compara(dado1,dado2): 0 se igual, >0 se maior, <0 se menor
Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada
prof. Henrique Monteiro Cristovão
21
Exemplos e exercícios no
documento cooperativo
disponível no site