A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

1 Lista Encadeada Circular Lista Duplamente Encadeada.

Apresentações semelhantes


Apresentação em tema: "1 Lista Encadeada Circular Lista Duplamente Encadeada."— Transcrição da apresentação:

1 1 Lista Encadeada Circular Lista Duplamente Encadeada

2 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 3 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;

4 4 Estruturas Compostas typedef struct tp_no { TP_PROD *info; struct tp_no *prox; } TP_LISTA; TP_LISTA *lista; Outra opção: campo da informação como um ponteiro para a estrutura Para criar um nó, fazer duas alocações: uma para a estrutura do produto e outra para a estrutura do nó TP_LISTA* aloca(void) { TP_PROD *pr=(TP_PROD*) malloc(sizeof(TP_PROD)); TP_LISTA *lst=(TP_LISTA*) malloc(sizeof(TP_LISTA)); lst->info = pr; lst->prox = NULL; return lst; } TP_LISTA* aloca(void) { TP_PROD *pr=(TP_PROD*) malloc(sizeof(TP_PROD)); TP_LISTA *lst=(TP_LISTA*) malloc(sizeof(TP_LISTA)); lst->info = pr; lst->prox = NULL; return lst; } p->info->precop->info->preco Se p for um ponteiro para um dado elemento desta lista, como acessar o Preço deste nó?

5 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

6 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 lista 418 5

7 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 8 Lista Circular Inserção? Remoção?

9 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 topo EMR V PL Topo

10 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 primeiro novo->prox=(*t)->prox; (*t)->prox=novo; return 1; } Exemplo com Pilha - Push

11 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 12 Cada nó possui dois ponteiros: um para o elemento anterior e outro para o próximo elemento (ant e prox) proxant abcd lista Lista Duplamente Encadeada

13 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 14 Busca e Listagem Busca e Listagem: Código igual ao que é utilizado para a Lista Simplesmente Encadeada

15 15 Inserção no Início beh 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 16 Inserção no Início 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; }

17 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 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 19 Remoção eh lista a b eh a b p p

20 20 Remoção Código? No Laboratório!!

21 21 Remoção int retira (tplista **t, int valor) { tplista *p; p=busca(*t,valor); if (p == NULL) return 0; /* não achou o elemento */ if (*t == p) *t=p->prox; /* primeiro elemento */ else p->ant->prox=p->prox; /* não é o primeiro */ if (p->prox!=NULL) /* não é o último */ p->prox->ant=p->ant; free(p); return 1; }

22 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 abcd lista Lista Duplamente Encadeada e Circular


Carregar ppt "1 Lista Encadeada Circular Lista Duplamente Encadeada."

Apresentações semelhantes


Anúncios Google