Você está na página 1de 20

Lista Encadeada Circular Lista Duplamente Encadeada

Estruturas Compostas

Um n em uma Lista Encadeada possui basicamente dois itens:


ponteiro para o prximo informao armazenada

Caso a informao no seja um dado simples:


criar vrios campos, um para cada informao

Ex.: cdigo, preo e quantidade de um produto


2

Estruturas Compostas
typedef 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;

Ns de Cabealho

N adicional no incio da lista que substitui o ponteiro para a lista A parte INFO pode ficar sem uso ou armazenar alguma informao global da lista, como o nmero de ns Se o campo INFO do cabealho no for do mesmo tipo que o resto da lista, ser necessrio criar outra estrutura para ele
6 9 7 3 6 9 7

Listas Circulares

O ltimo elemento tem como prximo o primeiro elemento da lista, formando um ciclo til quando:

a busca feita a partir de qualquer elemento no h ordenao na lista

A rigor no existe "primeiro" ou "ltimo" Ainda necessrio que exista um ponteiro para algum elemento, para a localizao da lista

por conveno, referncia do primeiro ou do ltimo


lista

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!"); }

Lista Circular

Insero? Remoo?
8

Lista Circular - Pilha


Por definio, uma Lista Circular no tem primeiro nem ltimo elemento Uma conveno 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 topo


Topo

PL

Exemplo com Pilha - Push


int push_circ (tplista **t, tpitem e) { tplista *novo; novo=aloca(sizeof(tplista)); if (novo==NULL) // sem espao return 0; else { novo->info=e; if (*t==NULL) // primeiro *t= novo; else // no o primeiro novo->prox=(*t)->prox; (*t)->prox=novo; return 1; } }

10

Lista Duplamente Encadeada

til quando preciso percorrer a lista na ordem inversa Remoo de um elemento no precisa guardar anterior Remoo de um elemento cujo ponteiro informado no precisar percorrer a fila toda Um conjunto maior de ligaes precisam ser atualizadas

11

Lista Duplamente Encadeada

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

lista

a
12

Listas Duplamente Encadeada


typedef int tpitem;

typedef struct tp_no { tpitem info; struct tp_no *ant; struct tp_no *prox; } tplista; tplista *lista;
13

Busca e Listagem

Busca e Listagem:

Cdigo igual ao que utilizado para a Lista Simplesmente Encadeada

14

Insero no Incio

O novo elemento encadeado no incio da lista O seu prximo passa a ser o antigo primeiro elemento e o seu anterior NULL

Se a lista no estiver vazia, o anterior do o antigo primeiro passa a ser o novo elemento

O ponteiro da lista passado por referncia e atualizado para apontar para o novo n A funo retornar 1 ou zero indicando o sucesso da incluso
lista

15

Insero no Incio
int 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; } }

16

Remoo

17

A remoo mais trabalhosa, pois preciso acertar a cadeia nos dois sentidos Em compensao, pode-se retirar um elemento conhecendo-se apenas o ponteiro para ele Utiliza-se uma funo de busca para localizar o elemento e em seguida o encadeamento ajustado Ao final, o elemento liberado

Remoo

Sendo p o ponteiro para o elemento a ser excludo, 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 condies:

18

se p for o primeiro, no se pode referenciar p->ant, pois ele NULL; o mesmo acontece para p->prox quando o ltimo alm disso, se for o primeiro, preciso atualizar o ponteiro da lista

Remoo
lista p

lista

19

Remoo

Cdigo?

No Laboratrio!!
20

Lista Duplamente Encadeada e Circular

Cada n possui dois ponteiros: um para o elemento anterior e outro para o prximo elemento (ant e prox) O anterior do primeiro o ltimo e o prximo do ltimo o primeiro

a
lista

22

Você também pode gostar