View
245
Download
0
Category
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