7-listas duplamente encadeadas

17
Listas Listas lineares 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

Upload: juliana-sandis

Post on 24-Jan-2016

228 views

Category:

Documents


7 download

DESCRIPTION

Programação, listas encadeadas

TRANSCRIPT

Page 1: 7-Listas Duplamente Encadeadas

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

Page 2: 7-Listas Duplamente Encadeadas

Listas Listas lineareslineares

Listas lineares Listas lineares duplamente duplamente encadeadasencadeadas

Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato

Page 3: 7-Listas Duplamente Encadeadas

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

Page 4: 7-Listas Duplamente Encadeadas

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;

Page 5: 7-Listas Duplamente Encadeadas

AlgoritmoAlgoritmo: criar lista circular: criar lista circularLista* Cria_lista(void)Lista* Cria_lista(void)

Lista* Cria_lista(void){ return NULL;}

Page 6: 7-Listas Duplamente Encadeadas

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

Page 7: 7-Listas Duplamente Encadeadas

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

Page 8: 7-Listas Duplamente Encadeadas

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)

Page 9: 7-Listas Duplamente Encadeadas

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

Page 10: 7-Listas Duplamente Encadeadas

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)

Page 11: 7-Listas Duplamente Encadeadas

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

Page 12: 7-Listas Duplamente Encadeadas

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; } }

Page 13: 7-Listas Duplamente Encadeadas

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;}

Page 14: 7-Listas Duplamente Encadeadas

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

Page 15: 7-Listas Duplamente Encadeadas

#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

Page 16: 7-Listas Duplamente Encadeadas

LL duplamente encadeada circular

Considere uma Lista duplamente Considere uma Lista duplamente encadeada circularencadeada circular

PtLista

L1 L2 L3 L4

Page 17: 7-Listas Duplamente Encadeadas

Exercício Exercício

Implemente o TAD Lista para a lista circular duplamente encadeada. Teste no programa do jogo baseado no problema de Josephus