ESTRUTURA DE DADOSboeres/slides_ed/ed_ListasEncadeadas.pdf · Lista Encadeada x Sequencial !...

Post on 07-Aug-2020

17 views 0 download

Transcript of ESTRUTURA DE DADOSboeres/slides_ed/ed_ListasEncadeadas.pdf · Lista Encadeada x Sequencial !...

ESTRUTURA DE DADOS

Listas Encadeadas

Cristina Boeres

Listas Lineares

Relembrando

!  listas lineares agrupam informações referentes a um conjunto de elementos que, de alguma forma, se relacionam entre si

!  Uma lista linear ou está vazia, ou possui uma série de elementos

(a1,a2, ....., an) !  onde ai é um componente de algum conjunto

2

Listas Encadeadas

!  podem crescer e diminuir dinamicamente !  tamanho máximo não precisa ser conhecido a priori

!  Provêem flexibilidade permitindo que os itens sejam rearrumados eficientemente (ainda veremos)

!  Estrutura de dados baseada em tipo recursivo de dados

3

Listas encadeadas

Tipo recursivo de dados !  um dos campos é um ponteiro para uma estrutura do

mesmo tipo !  definem agregados de crescimento arbitrário !  Exemplo:

struct {

int a;

no* proximo;

} no;

4

!  Também é um conjunto de itens organizados !  em um vetor ou lista sequencial a organização é

implícita (pela posição) !  alocados em espaços de memória consecutivos

!  em uma lista encadeada a sequência de elementos é especificada explicitamente !  cada elemento contém um ponteiro para o próximo

da lista

Listas Encadeadas 5

A L I S T

!  Olhando mais em detalhes

Listas Encadeadas 6

A L I S T

A 1024 A

L 2052

esse elemento está alocado no endereço 1024

Listas Encadeadas

!  Detalhes que devem ser considerados: !  todo elemento possui um ponteiro

!  o ponteiro do último elemento tem que especificar algum tipo de próximo (aponta para si próprio ou NULL)‏

!  para acessar qualquer elemento da lista

!  um ponteiro ou um elemento para o 1º da lista

7

A L I S T

head

Listas Encadeadas !  algumas operações são mais eficientes do que em lista

sequencial !  exemplo: o último elemento com valor “T” deve ser o primeiro

da lista !  mesmo que a lista seja muito longa, a mudança é realizada

através de 3 operações

8

A L I S T

head

Listas Encadeadas !  algumas operações são mais eficientes do que em lista

sequencial !  exemplo: o último elemento com valor “T” deve ser o primeiro

da lista !  mesmo que a lista seja muito longa, a mudança é realizada

através de 3 operações 1)  primeiro: localizar o elemento que contém o valor desejado

9

A L I S T

head pt

Listas Encadeadas !  algumas operações são mais eficientes do que em lista

sequencial !  exemplo: o último elemento com valor “T” deve ser o primeiro

da lista !  mesmo que a lista seja muito longa, a mudança é realizada

através de 3 operações 2)  o ponteiro próximo dele passa a apontar para o primeiro

elemento

10

A L I S T

head pt

Listas Encadeadas !  algumas operações são mais eficientes do que em lista

sequencial !  exemplo: o último elemento com valor “T” deve ser o primeiro

da lista !  mesmo que a lista seja muito longa, a mudança é realizada

através de 3 operações 3)  o cabeça, passa a apontar para esse elemento

11

A L I S T

head pt

Listas Encadeadas !  algumas operações são mais eficientes do que em lista

sequencial !  exemplo: o último elemento com valor “T” deve ser o primeiro

da lista !  mesmo que a lista seja muito longa, a mudança é realizada

através de 3 operações 4)  o anterior a esse elemento, aponta para NULL (tem que ser

localizado também)

12

A L I S T

head pt

Listas Encadeadas

!  Para inserção de um novo elemento que tenha info X: !  aloca-se memória para um elemento !  atualiza-se os ponteiros

!  em lista sequencial seria necessário deslocar todos os elementos a partir do ponto de inserção;

!  apenas 2 links são alterados para esta operação - não importa quão longa é a lista

13

A L I S T

head X

!  remoção de um elemento: !  basta alterar o ponteiro do elemento anterior ao

removido !  o conteúdo de X (no exemplo) ainda existe, mas

não é mais acessível pela lista

Listas Encadeadas 14

A L I S T

head X

Listas Encadeadas

!  Lista Encadeada x Sequencial !  remoção e inserção são mais naturais na lista encadeada

!  outras operações já não são tão naturais

!  Encontrar o k-ésimo elemento da lista

!  em uma lista sequencial - simplesmente acessar a[k]

!  na lista encadeada é necessário percorrer k links.

!  Achar um ítem antes de um dado ítem

15

Listas Encadeadas

Duplamente encadeada - ponteiros para duas direções !  um ponteiro para o próximo e um para o anterior

16

Simplesmente encadeada - ponteiros em uma direção

Listas Encadeadas

Inserção e Remoção !  alocação dinâmica de memória

!  aloca() - malloc() ou calloc() do C !  desaloca() ou libera() - free() do C

Exemplo - Gerenciamento de blocos de memória livres !  Rotina que toma conta do espaço livre de memória

!  Ao liberar memória - inserção na lista de bloco livres !  Ao alocar memória - remoção da lista

17

Listas Encadeadas - Inserção

!  seja uma lista em que cada elemento armazena: !  um inteiro !  ponteiro para o próximo elemento da lista

!  Problema a resolver: !  inserir um novo elemento sempre no início da lista

18

Listas Encadeadas - Inserção

!  seja uma lista em que cada elemento armazena: !  um inteiro !  ponteiro para o próximo elemento da lista

!  Problema a resolver: !  inserir um novo elemento sempre no início da lista

19

head

10 7 32 17 80

Listas Encadeadas - Inserção

!  seja uma lista em que cada elemento armazena: !  um inteiro !  ponteiro para o próximo elemento da lista

!  Problema a resolver: !  inserir um novo elemento sempre no início da lista

!  aloca um novo elemento

20

head

10 7 32 17 80

novo

Listas Encadeadas - Inserção

!  seja uma lista em que cada elemento armazena: !  um inteiro !  ponteiro para o próximo elemento da lista

!  Problema a resolver: !  inserir um novo elemento sempre no início da lista

!  inicializa campos

21

head

10 7 32 17 80

novo

X

Listas Encadeadas - Inserção

!  seja uma lista em que cada elemento armazena: !  um inteiro !  ponteiro para o próximo elemento da lista

!  Problema a resolver: !  inserir um novo elemento sempre no início da lista

!  cabeça passa apontar para o novo primeiro elemento

22

head

10 7 32 17 80

novo

X

Listas Encadeadas - Inserção

Estrutura usada struct { int info; tipo_no * prox; } tipo_no; tipo_no * head; head = NULL;

Protótipo da Função Insere(int valor);

23

Listas Encadeadas - Inserção

Insere(int valor) { tipo_no * novo;

novo = malloc (sizeof(tipo_no)); if (!novo) return(false); novo->info = valor; novo->prox = head; head = novo; return(true);

}

24

Listas Encadeadas - Remoção

!  Problema !  remover o 1º elemento, retornando o valor

armazenado !  Se remover de uma lista vazia? !  E se remover e a lista ficar vazia?

25

Listas Encadeadas - Remoção

!  Problema !  remover o 1º elemento, retornando o valor

armazenado !  Se remover de uma lista vazia? !  E se remover e a lista ficar vazia?

!  aponta para o primeiro elemento

26

head

10 7 32 17 80

pt

Listas Encadeadas - Remoção

!  Problema !  remover o 1º elemento, retornando o valor

armazenado !  Se remover de uma lista vazia? !  E se remover e a lista ficar vazia?

!  atualiza o novo cabeça

27

head

10 7 32 17 80

pt

Listas Encadeadas - Remoção

!  Problema !  remover o 1º elemento, retornando o valor

armazenado !  Se remover de uma lista vazia? !  E se remover e a lista ficar vazia?

!  libera o espaço (antes guarde em uma variável o valor armazenado no elemento)

28

head

7 32 17 80

pt

Listas Encadeadas - Remoção

remove () { valor = INEXISTENTE;

if (head != NULL){ valor = head->valor; pt = head; head = head ->prox; free (pt); }else “lista vazia”; return (valor);

}

29

Busca em Listas Encadeadas

!  Problema: !  Buscar um valor em uma lista encadeada onde os

elementos não seguem uma ordenação !  retorna o elemento que contém o valor

procurado, ou NULL, caso não encontre

30

Busca em Listas Encadeadas

!  Problema: !  Buscar um valor em uma lista encadeada onde os

elementos não seguem uma ordenação !  retorna o elemento que contém o valor

procurado, ou NULL, caso não encontre

31

10 7 32 17 80

head valor = 32

Busca Listas Encadeadas

busca_encadeada (valor, ant, pt) { pt = head; ant = head;

while (pt != NULL) && ( pt->info != valor){ ant = pt; pt = pt->prox; }

}

32

10 7 32 17 80

head valor = 32

Busca Listas Encadeadas

!  caso o valor esteja na lista !  pt aponta para o elemento que contém o valor

!  senão estiver na lista !  pt aponta para NULL - o campo prox do último elemento

aponta para NULL

33

10 7 32 17 80

head valor = 11

Listas Encadeadas - Inserção

!  Problema: inserir um valor em uma lista encadeada não ordenada, caso não exista !  como não existe ordenação, pode-se inserir no

início da lista

34

Listas Encadeadas - Inserção Insere(valor){ pt = head; ant = head;

while (pt != NULL) && ( pt->info != valor){ ant = pt; pt = pt->prox; }

if (pt == NULL){ /* não encontrou o valor na lista */ novo = malloc ();

novo->info = valor; novo->prox = head; head = novo; }

}

35

Listas Encadeadas - Inserção Insere(valor){ pt = head; ant = head;

while (pt != NULL) && ( pt->info != valor){ ant = pt; pt = pt->prox; }

if (pt == NULL){ /* não encontrou o valor na lista */ novo = malloc ();

novo->info = valor; novo->prox = head; head = novo; }

}

36

10 7 32 17 80 head

valor = 11

Listas Encadeadas - Remoção

!  Problema: remover o elemento que armazena um dado valor em uma lista encadeada não ordenada, caso exista

37

Listas Encadeadas - Remoção

!  Problema: remover o elemento que armazena um dado valor em uma lista encadeada não ordenada, caso exista !  procurar pelo elemento !  retirá-lo se encontrar

38

Listas Encadeadas - Remoção remove_enc(valor)‏ { pt = head; ant = head;

while (pt != NULL) && ( pt->info != valor){ ant = pt; pt = pt->prox; } if (pt != NULL){ ant->prox = pt->prox; if (ant == pt) head = pt->prox; free (pt); }else “não encontrado”;

}

39

Listas Encadeadas - Remoção remove_enc(valor)‏ { pt = head; ant = head;

while (pt != NULL) && ( pt->info != valor){ ant = pt; pt = pt->prox; } if (pt != NULL){ ant->prox = pt->prox; if (ant == pt) head = pt->prox; free (pt); }else “não encontrado”;

}

40

Busca em uma lista ordenada

busca_enc_ord (valor, ant, pt)‏ {

ant = head; pt = head; while ((pt != NULL) && (pt->info < valor)){ ant = pt; pt = pt->prox; }

}

41

Pensar

!  Fazer um programa que: !  Le números inteiros positivos

a) Calcular média destes números

b) Calcular mínimo e máximo destes números

c) Listar os N maiores

!  Sejam x e y dois polinômios. Calcule a soma de x e y e armazene em z

42

Listas Encadeadas

Exercício Prático !  Implementar os procedimentos de inserção e remoção

em uma lista encadeada desordenada !  Dado uma lista encadeada, localizar o n-ésimo elemento

43