Sei sulla pagina 1di 16

Lista Encadeada Circular

Lista Duplamente
Encadeada

Relembrando listas
encadeadas
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

Relembrando listas
encadeadas
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;

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?
6

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
7

conjunto maior de ligaes


precisam ser atualizadas

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
8

Listas Duplamente
Encadeada
typedef int tpitem;
typedef struct tp_no {
tpitem info;
struct tp_no *ant;
struct tp_no *prox;
} tplista;

tplista *lista;

Busca e Listagem
Busca

e Listagem:

Cdigo igual ao que utilizado para


a Lista Simplesmente Encadeada

10

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
lista
sucesso da incluso

11

Insero

12

int insere(tplista **t, tpitem e){


tplista *novo;
novo = aloca();
if (!novo)
return 0;
novo->info = e;
novo -> ant = NULL;
novo -> prox = *t;
if ((*t) != NULL)
(*t) -> ant = novo;
*t = novo;
return 1;
}

Remoo
A

13

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:

14

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
p

lista

lista

a
15

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

17

Potrebbero piacerti anche