1 Lista Encadeada Circular Lista Duplamente Encadeada

Preview:

Citation preview

1

Lista Encadeada CircularLista Duplamente Encadeada

2

Estruturas Compostas Um nó em uma Lista Encadeada possui

basicamente dois itens: – ponteiro para o próximo– informação armazenada

Caso a informação não seja um dado simples:criar vários campos, um para cada informação

Ex.: código, preço e quantidade de um produto

3

Estruturas Compostastypedef struct tp_no {

int cod;float preco;int quant;struct tp_no *prox;

} TPLISTA;

TPLISTA *lista;...lista->cod=1; lista->preco=10.5;lista->quant=20;

5

Nós de Cabeçalho Nó adicional no início da lista que substitui o

ponteiro para a lista A parte INFO pode ficar sem uso ou

armazenar alguma informação global da lista, como o número de nós

Se o campo INFO do cabeçalho não for do mesmo tipo que o resto da lista, será necessário criar outra estrutura para ele

3 6 9 76 9 7

6

Listas Circulares O último elemento tem como próximo o primeiro

elemento da lista, formando um ciclo Útil quando:

– a busca é feita a partir de qualquer elemento– não há ordenação na lista

A rigor não existe "primeiro" ou "último" Ainda é necessário que exista um ponteiro para

algum elemento, para a localização da lista– por convenção, referência do primeiro ou do último

lista4 1 8 5

7

Listagem

void listagem (tplista *t) { tplista *p=t;if (t!=NULL)

do {printf("Info: %d", p->info);p=p->prox;

} while (p!=t);else

printf("Lista Circular vazia!");}

8

Lista Circular

Inserção?

Remoção?

9

Lista Circular - Pilha Por definição, uma Lista Circular não tem

primeiro nem último elemento Uma convenção útil para implementar

Pilhas é fazer o ponteiro apontar para o último elemento

Neste caso, o nó seguinte ao ponteiro da Pilha será o nó do topo:– Se PL é o ponteiro de uma pilha, PL->info é o

último elemento e PL->prox->info é o elemento do topoE M R V

PLTopo

10

int push_circ (tplista **t, tpitem e) {tplista *novo; novo=aloca(sizeof(tplista));if (novo==NULL) // sem espaço

return 0;else {

novo->info=e;if (*t==NULL) // primeiro

*t= novo;else // não é o

primeironovo->prox=(*t)->prox;

(*t)->prox=novo;return 1;

}}

Exemplo com Pilha - Push

11

Lista Duplamente Encadeada Útil quando é preciso percorrer a lista

na ordem inversa Remoção de um elemento não precisa

guardar anterior Remoção de um elemento cujo

ponteiro é informado não precisar percorrer a fila toda

Um conjunto maior de ligações precisam ser atualizadas

12

Cada nó possui dois ponteiros: um para o elemento anterior e outro para o próximo elemento (ant e prox)

proxant

a b c d

lista

Lista Duplamente Encadeada

13

Listas Duplamente Encadeada

typedef int tpitem;

typedef struct tp_no { tpitem info;

struct tp_no *ant;struct tp_no *prox;

} tplista;

tplista *lista;

14

Busca e Listagem

Busca e Listagem:

Código igual ao que é utilizado para a Lista Simplesmente Encadeada

15

Inserção no Início

b e h

lista

a

O novo elemento é encadeado no início da lista

O seu próximo passa a ser o antigo primeiro elemento e o seu anterior é NULL– Se a lista não estiver vazia, o anterior do o

antigo primeiro passa a ser o novo elemento O ponteiro da lista é passado por referência

e atualizado para apontar para o novo nó A função retornar 1 ou zero indicando o

sucesso da inclusão

16

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

tplista *novo;novo = aloca(sizeof(tplista));if (!novo) return 0;else {

novo->info = valor;novo->prox = *t;novo->ant = NULL;if ( (*t)!=NULL )

(*t)->ant=novo;(*t)=novo;

}}

17

Remoção

A remoção é mais trabalhosa, pois é preciso acertar a cadeia nos dois sentidos

Em compensação, pode-se retirar um elemento conhecendo-se apenas o ponteiro para ele

Utiliza-se uma função de busca para localizar o elemento e em seguida o encadeamento é ajustado

Ao final, o elemento é liberado

18

Remoção Sendo p o ponteiro para o elemento a ser

excluído, se o elemento estiver no meio da lista, devemos fazer:

p->ant->prox = p->prox;p->prox->ant = p->ant;

Caso o elemento esteja em um extremo da lista, existem outras condições:– se p for o primeiro, não se pode referenciar p-

>ant, pois ele é NULL; o mesmo acontece para p->prox quando é o último

– além disso, se for o primeiro, é preciso atualizar o ponteiro da lista

19

Remoção

e h

lista

a b

e h

lista

a b

p

p

20

Remoção

Código?

No Laboratório!!

22

Cada nó possui dois ponteiros: um para o elemento anterior e outro para o próximo elemento (ant e prox)

O anterior do primeiro é o último e o próximo do último é o primeiro

a b c d

lista

Lista Duplamente Encadeada e Circular

Recommended