7-listas duplamente encadeadas
DESCRIPTION
Programação, listas encadeadasTRANSCRIPT
Listas Listas lineareslineares
Denise GuliatoFaculdade de Computação – UFUwww.facom.ufu.br/~guliato
Vários slides foram adaptados de Nina Edelwais e Renata GalanteEstrutura de Dados – Série de Livros Didáticos - Informática - UFRGS
Listas Listas lineareslineares
Listas lineares Listas lineares duplamente duplamente encadeadasencadeadas
Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato
LL duplamente encadeadas
PtLista
L1 L2 L3 L4
• Cada nodo tem 2 campos de elo
• A lista pode ser percorrida nas duas direções
LL duplamente encadeadasLL duplamente encadeadas
Anterior Info Próximo
Nodo genérico
Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato
LL duplamente encadeadas
OperaçõesOperações• Criar e inicializar uma lista
• Inserir novo nodo
• Remover um nodo
• Consultar um nodo
• Destruir lista
AlgoritmosAlgoritmos
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;
AlgoritmoAlgoritmo: criar lista circular: criar lista circularLista* Cria_lista(void)Lista* Cria_lista(void)
Lista* Cria_lista(void){ return NULL;}
LL duplamente encadeadas
Inserção de um novo nodo no Inserção de um novo nodo no meio da listameio da lista
PtLista
Novo nodo
L3 L4L2L1
L5
PtLista
L1 L2 L3 L4
L5
Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato
Inserção de um novo nodo Inserção de um novo nodo no inicio da listano inicio da lista
PtLista
L1 L2 L3 L4
PtLista
L5
L1 L2 L3 L4L5
Adaptado de Nina Edelwais e Renata Galante Denise Guliato
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; return Ptl;}
Algoritmo: Algoritmo: inserir um nodo no inicio da listaLista* Insere_elem(Lista* Ptl,int elem)
LL duplamente encadeadas
Remoção de novo nodoRemoção de novo nodo
A B
PtLista
C D
A B
PtLista
C D
Remover
Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato
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 return Ptl; 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); return Ptl; }
Algoritmo:Algoritmo:Remover um nodo de LL Duplamente EncadeadaLista* Remove_elem(Lista *Ptl, int elem)
LL duplamente encadeadas
Consulta à listaConsulta à 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: Algoritmo: Consulta K-esimo nodo da Listaint Consulta_nodo(Lista Ptl, int pos,int *elem)
LL encadeada circularLL encadeada circular
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) return 0; else { *elem=pt->info; return 1; } }
AlgoritmoAlgoritmo: destruir lista circulardestruir lista circularLista* Libera_lista(Lista *Ptl)Lista* Libera_lista(Lista *Ptl)
Lista* Libera_lista(Lista *Ptl){ Lista *aux; while (Ptl!= NULL) { aux = Ptl; Ptl = Ptl->prox; free(aux); } return NULL;}
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.h
#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
LL duplamente encadeada circular
Considere uma Lista duplamente Considere uma Lista duplamente encadeada circularencadeada circular
PtLista
L1 L2 L3 L4
Exercício Exercício
Implemente o TAD Lista para a lista circular duplamente encadeada. Teste no programa do jogo baseado no problema de Josephus