eng. de computação – estruturas de dados i – lista simplesmente encadeada prof. henrique...

21
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.

Upload: internet

Post on 17-Apr-2015

111 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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.

Page 2: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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

Page 3: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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.

Page 4: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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.

Page 5: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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

Page 6: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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;

};

Page 7: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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;

};

Page 8: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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.

Page 9: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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

Page 10: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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

Page 11: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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

Page 12: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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

Page 13: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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

Page 14: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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

Page 15: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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

Page 16: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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

Page 17: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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

Page 18: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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

Page 19: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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;}

Page 20: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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

Page 21: Eng. de Computação – Estruturas de Dados I – Lista Simplesmente Encadeada prof. Henrique Monteiro Cristovão 1 TADS – Tipos Abstratos de Dados Listas Encadeadas

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