1 listas encadeadas. 2 listas seqüenciais conjunto de itens organizados vetor – a organização...

39
1 Listas Encadeadas

Upload: internet

Post on 17-Apr-2015

110 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

1

Listas Encadeadas

Page 2: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

2

  Listas Seqüenciais

Conjunto de itens organizados vetor– a organização é implícita (pela posição)

– o símbolo vet representa o endereço do primeiro elemento (ponteiro)

– ocupa um espaço contíguo na memória:permite acesso a qualquer elemento a partir

do ponteiro para o primeiro, utilizando indexação acesso aleatório

vet

A L I TS

Page 3: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

3

Listas Seqüenciais

Qual a principal desvantagem de se usar o armazenamento seqüencial para representar Listas?

Quantidade fixa de elementos– memória alocada sem uso ou– impossibilidade de alocar mais

memória

Page 4: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

4

Listas Lineares

Solução?

Listas Encadeadas

Utilizar Estruturas de Dados que cresçam e diminuam na medida da necessidade Estruturas Dinâmicas

Alocação dinâmica de memória para armazenar os elementos

Page 5: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

5

Listas Encadeadas

Podem crescer e diminuir dinamicamente

Tamanho máximo não precisa ser definido previamente

Provêem flexibilidade, permitindo que os itens sejam rearrumados eficientemente– perda no tempo de acesso a qualquer item

arbitrário da lista, comparando com vetores

Também chamadas de Listas Ligadas

Page 6: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

6 A L I TS

  Listas Encadeadas A seqüência de elementos é especificada

explicitamente, onde cada um contém um ponteiro para o próximo da lista (link) Encadeamento

Cada elemento é chamado de nó da lista A lista é representada por um ponteiro para o

primeiro elemento (ou nó) Do primeiro elemento, pode-se alcançar o segundo

seguindo o encadeamento e assim sucessivamente Para cada novo elemento inserido na estrutura, um

espaço na memória é alocado dinamicamente, mas a alocação do espaço não é contígua

lista

Page 7: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

7

Listas Encadeadas

Detalhes que devem ser considerados:– cada elemento possui pelo menos dois campos:

um para armazenar a informação e outro para o endereço do próximo (ponteiro)

– deve haver um ponteiro especial para o 1O da lista

– o ponteiro do último elemento tem que especificar algum tipo de final (aponta para si próprio ou nulo)

– uma lista vazia (ou nula) é uma lista sem nósA

lista info prox

L I S T

Page 8: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

8

  Listas Encadeadas

Algumas operações são mais eficientes do que em Lista Seqüencial– Mover o elemento com a informação T do fim

da lista para o início– Mesmo que a lista seja muito longa, a

mudança estrutural é realizada através de 3 operações

A

lista

L I S T

Page 9: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

9

  Listas Encadeadas Para inserção de um novo elemento X:

– aloca-se memória para um elemento e atualiza-se os ponteiros

– em lista seqüencial 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

A

lista

L I S T

X

Page 10: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

10

Remoção de um elemento:– Basta alterar o ponteiro do elemento

anterior ao removido

– o conteúdo de I (no exemplo) ainda existe, mas não é mais acessível pela lista

Listas Encadeadas

A

lista

L I S T

Page 11: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

11

  Listas Encadeadas

Lista Encadeada x Seqüencial– 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 seqüencial - simplesmente acessar

a[k-1] – na lista encadeada é necessário percorrer k links

Achar um item localizado antes de um outro item

Page 12: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

12

  Listas Encadeadas

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

Simplesmente encadeada - ponteiros em uma direção

Page 13: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

13

  Listas Encadeadas

Implementações:

typedef struct tp_no { int info; struct tp_no *prox;

} tplista; tplista *lista;

Page 14: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

14

Listas Encadeadas

Inicialização da Lista:lista=NULL;

Lista Vazia:int vazia (tplista *t) {

return (t==NULL); }

Page 15: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

15

Listas Encadeadas

Alocação Dinâmica de Memória – malloc aloca( );– free – exigem #include "stdlib.h"

Page 16: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

16

  Manipulação da MemóriaFunção malloc

– aloca dinamicamente uma parte da memória

– recebe como parâmetro o número de bytes que se deseja alocar

– retorna um ponteiro para endereço inicial da área alocada

– se não houver espaço livre, retorna um endereço nulo (representado por NULL, definido em stdlib.h) que pode ser testado para encerrar o programa

Page 17: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

17

  Manipulação da MemóriaFunção malloc

– Ex.:int *p;p = malloc(8);

– p representa o endereço inicial de uma área contínua de memória suficiente para armazenar 8 bytes

Page 18: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

18

  Manipulação da MemóriaFunção malloc

– utilização da função sizeof( )int *p;p = malloc(sizeof(int));

– ponteiro retornado é para um item do tipo char converter o tipo (cast)int *p;p = (int *) malloc(sizeof(int));

código do programa

variáveis globais e estáticas

p

504

504

4 bytes

Livre

Page 19: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

19

  Manipulação da Memóriaaloca()

tplista* aloca( ) {tplista* pt;pt=(tplista*) malloc(sizeof(tplista));return pt;

}

No bloco principal:p=aloca( );if (p!=NULL)

/* continua o programa... */else

printf(“Não há memória disponível!”);

Page 20: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

20

  Manipulação da Memória

Função free

– Libera o espaço de memória alocado dinamicamente

– recebe como parâmetro o ponteiro da área de memória a ser liberada

– Ex.: free(p);

Page 21: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

21

Listas Encadeadas

Operações Básicas– vazia(lista);– insere(lista, valor);– busca(lista, valor);– listagem(lista);– retira(lista, &valor);

Page 22: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

22

Lista Vazia

int vazia (tplista *t) { if (t==NULL)

return 1;else

return 0;}

Page 23: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

23

Listagem

Utilizar um ponteiro auxiliar para percorrer a lista até o final

t

p p p pp

Page 24: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

24

Listagem

void listagem (tplista *t) {

tplista *p;

for (p=t; p!=NULL; p=p->prox)

printf("Info: %d\n", p->info);

}

Page 25: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

25

Busca

Utilizar um ponteiro auxiliar para percorrer a lista até encontrar ou até chegar ao final

A função retorna o ponteiro para o elemento ou NULL caso não encontre

Page 26: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

26

Busca

tplista* busca (tplista *t , int valor) {

tplista *p=t;

while ((p!=NULL) && (p->info!=valor))

p=p->prox;

return p;

}

Page 27: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

27

Inserção no Início Cada elemento armazena uma informação

do tipo tp_item A função:

– recebe como parâmetros um ponteiro para a lista e o novo elemento

– tenta alocar dinamicamente o espaço para o novo nó, guardando a informação e fazendo ele apontar para o início da lista

– retorna o novo ponteiro da lista ou NULL caso não seja possível incluir

Page 28: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

28

Inserção no Início

Estrutura usada:

typedef int tp_item;

typedef struct tp_no {tp_item info;struct tp_no *prox;

} tplista;tplista * lista;

t

Page 29: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

29

Inserção no Iníciotplista * insere (tplista *t , int valor) {

tplista *novo;novo = aloca( );if (!novo)

return(NULL);else {

novo->info = valor;novo->prox = t;return(novo);

}}

Insere em qualquer lista, retornando um ponteiro para o primeiro. Quem chama a função deve atualizar o ponteiro da lista com o valor retornado:

tmp= insere(12,lista); if (temp) lista=tmp; else

printf(“Sem memória”);

Page 30: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

30

Inserção no Início (Por referência)

int insere (tplista **t , int valor) {tplista *novo;novo = aloca( );if (!novo)

return 0;else {

novo->info = valor;novo->prox = *t;*t=novo;return 1;

}}

Insere em qualquer lista, retornando 1 ou zero

para indicar sucesso ou falta de memória. A função já atualiza

automaticamente o ponteiro de início da

lista.

ok= insere(12,lista); if (!ok)

printf(“Sem memória”);

Page 31: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

31

Inserção Geral Insere elementos em uma lista

classificada, mantendo a ordenação Ponto chave: localizar o elemento da

lista que precede o novo De posse do ponteiro para este

antecessor, pode-se encadear o novo elemento:– o novo apontará para o próximo do

antecessor– o antecessor apontará para o novo

Page 32: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

32

Inserção Geral

Estrutura usada:

typedef int tp_item;

typedef struct tp_no {tp_item info;struct tp_no *prox;

} tplista;tplista * lista;

t

B E

G

M R

Page 33: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

/* procura posição do elemento */while (p!=NULL && p->info<e) {ant=p;p=p->prox; }

if (ant==NULL) {/* insere elemento no início */novo->prox=t;t=novo; }else {/* insere elemento no meio */novo->prox=ant->prox;ant->prox=novo; }return t;

}

tplista* insere (tplista *t , tp_item e) {

/* novo nó */tplista *novo;

/* ponteiro p/ anterior */tplista *ant=NULL;

/* ponteiro p/ percorrer */tplista *p=t;

novo = aloca();if (!novo)

return(NULL);novo->info = e;

Page 34: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

novo->prox=p; if (ant==NULL)

*t=novo;else

ant->prox=novo; return 1;

}

int insere (tplista **t , tp_item e) {/* Por Referência */tplista *novo;tplista *ant=NULL;tplista *p=*t;novo = aloca();if (!novo)

return 0;novo->info = e;while (p && p->info<e) {

ant=p;

p=p->prox;

}

Page 35: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

35

Remoção Procurar o elemento a ser removido e

guardar uma referência para o anterior Se encontrar:

– se for o primeiro: lista passa a apontar para o segundo e espaço do primeiro é liberado

t t

– se estiver no meio ou fim: seu antecessor passa a apontar para seu próximo e o espaço é liberado

Page 36: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

if (p==NULL) {

/* Não Achou; retorna NULL */

printf("Não existe\n");

return NULL; }

/* Achou */

if (ant==NULL) {

/* retira elemento do início */

t=p->prox; }

else {

/* retira elemento do meio */

ant->prox=p->prox; }

free(p);

return t;

}

tp_lista* retira (tp_lista *t, tpitem e) {

/* ponteiro p/ anterior */tp_lista *ant=NULL;

/* ponteiro p/ percorrer */tp_lista *p=t;

/* procura elemento na lista,

guardando o anterior */

while (p!=NULL && p->info!=e)

{

ant=p;

p=p->prox;

}

Page 37: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

int retira (tplista **t, tpitem e) {/* Por Referência */tplista *ant=NULL, *p=*t;while (p!=NULL && p->info!=*e){

ant=p;p=p->prox;

}if (p==NULL)

return 0; else {

if (ant==NULL)*t=p->prox;

else ant->prox=p->prox;

free(p);return 1;

}}

Page 38: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

38

Liberar Lista

Liberar todos os elementos alocadosPercorrer todos os elementos,

liberando cada um

É preciso guardar a referência para o próximo antes de liberar o atual

Page 39: 1 Listas Encadeadas. 2 Listas Seqüenciais Conjunto de itens organizados vetor – a organização é implícita (pela posição) – o símbolo vet representa o

39

Liberar Lista

void destroi (tplista *t) {tplista *p=t, *q;while (p!=NULL) {

q=p->prox; /* guarda referência p/ o próximo */

free(p); /* libera a memória apontada por p */

p=q; /* faz p apontar para o próximo */

}}