7-listas duplamente encadeadas

Post on 24-Jan-2016

228 Views

Category:

Documents

7 Downloads

Preview:

Click to see full reader

DESCRIPTION

Programação, listas encadeadas

TRANSCRIPT

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

top related