Listas lineares Denise Guliato Faculdade de Computação – UFU www.facom.ufu.br/~guliato Vários slides foram adaptados de Nina Edelwais e Renata Galante Estrutura de Dados – Série de Livros Didáticos - Informática - UFRGS
Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato Listas lineares Listas lineares duplamente encadeadas Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato
Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato LL duplamente encadeadas LL duplamente encadeadas Cada nodo tem 2 campos de elo A lista pode ser percorrida nas duas direções Anterior Info Próximo Nodo genérico PtLista L1 L2 L3 L4 Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato
Operações Algoritmos Criar e inicializar uma lista Inserir novo nodo LL duplamente encadeadas Operações Criar e inicializar uma lista Inserir novo nodo Remover um nodo Consultar um nodo Destruir lista Algoritmos Semelhantes a LL encadeada simples Tipo de nodo utilizado nos algoritmos: struct no { struct no* ant; int info; struct no* prox; } typedef struct no Lista;
Algoritmo: criar lista circular Lista* Cria_lista(void) { return NULL; }
Inserção de um novo nodo no meio da lista LL duplamente encadeadas Inserção de um novo nodo no meio da lista Novo nodo PtLista L1 L2 L3 L4 L5 PtLista L5 L1 L2 L3 L4 Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato
Inserção de um novo nodo no inicio da lista PtLista L1 L2 L3 L4 PtLista L1 L2 L3 L4 L5 Adaptado de Nina Edelwais e Renata Galante Denise Guliato
Algoritmo: inserir um nodo no inicio da lista Lista* Insere_elem(Lista* Ptl,int elem) Lista* Insere_elem(Lista *Ptl, int elem) { Lista *Ptnodo; Ptnodo = (Lista*)malloc(sizeof(Lista)); if (Ptnodo == NULL) return Ptl; Ptnodo->info = elem; Ptnodo->prox = Ptl; Ptnodo->ant = NULL; if(Ptl != NULL) Ptl->ant = Ptnodo; Ptl = Ptnodo; }
Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato LL duplamente encadeadas Remoção de novo nodo PtLista Remover A B C D PtLista A B C D Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato
Algoritmo:Remover um nodo de LL Duplamente Encadeada Lista* Remove_elem(Lista *Ptl, int elem) Lista* Remove_elem(Lista *Ptl, int elem) { Lista *atual; if (Ptl == NULL) return Ptl; atual = Ptl; while (atual != NULL && elem != atual->info) atual = atual->prox; } if (atual == NULL)// não achou if (atual == Ptl)// primeiro nodo a ser removido Ptl = atual->prox; else // nodo removido do meio ou do final da lista atual->ant->prox = atual->prox; if (atual->prox != NULL) atual->prox->ant = atual->ant; free(atual);
Adaptado de Nina Edelwais e Renata Galante Denise Guliato LL duplamente encadeadas Consulta à lista Acesso sempre pelo primeiro nodo da lista A lista pode ser percorrida nas duas direções Adaptado de Nina Edelwais e Renata Galante Denise Guliato
Algoritmo: Consulta K-esimo nodo da Lista LL encadeada circular LL encadeada circular Algoritmo: Consulta K-esimo nodo da Lista int Consulta_nodo(Lista Ptl, int pos,int *elem) int Consulta_nodo(Lista *Ptl, int pos, int *elem) { int cont = 1; Lista *pt; pt = Ptl; if (pos <= 0 || pt == NULL) return 0; while(pt != NULL && cont < pos) pt=pt->prox; cont++; } if (pt == NULL) else { *elem=pt->info; return 1;
Algoritmo: destruir lista circular Lista* Libera_lista(Lista *Ptl) { Lista *aux; while (Ptl!= NULL) aux = Ptl; Ptl = Ptl->prox; free(aux); } return NULL;
lladae2d.h typedef struct no Lista; Lista* Cria_lista(void); Lista* Libera_lista(Lista* Ptl); int E_vazia(Lista* Ptl); int E_cheia(Lista* Ptl); Lista* Insere_elem(Lista* Ptl, int elem); Lista* Remove_elem(Lista* Ptl, int elem); int Tamanho_lista(Lista* Ptl); int Consulta_nodo(Lista* Ptl, int pos, int *elem);
lladae2d.c #include <stdio.h> #include <stdlib.h> #include "lladae2d.h“ struct no { struct no* ant; int info; struct no* prox; }; Lista* Cria_lista(void) {……..} Lista* Libera_lista(Lista *Ptl) {…….} int E_vazia(Lista *Ptl) int E_cheia(Lista *Ptl) Lista* Insere_elem(Lista *Ptl, int elem) {.......} Lista* Remove_elem(Lista *Ptl, int elem) int Tamanho_lista(Lista Ptl) int Consulta_nodo(Lista *Ptl, int pos,int *elem) {……} lladae2d.c
Considere uma Lista duplamente encadeada circular LL duplamente encadeada circular Considere uma Lista duplamente encadeada circular PtLista L1 L2 L3 L4
Exercício Implemente o TAD Lista para a lista circular duplamente encadeada. Teste no programa do jogo baseado no problema de Josephus