ESTRUTURA DE DADOS Aula 10 – Listas Duplamente Encadeadas.

Post on 22-Apr-2015

124 views 0 download

Transcript of ESTRUTURA DE DADOS Aula 10 – Listas Duplamente Encadeadas.

ESTRUTURA DE DADOS

Aula 10 – Listas Duplamente Encadeadas

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

Atenção aos Temas Principais dessa Aula

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

Conteúdo Programático desta aula

Compreender o conceito de Lista Duplamente

Encadeada;

Compreender operações com LDE sem ou com

descritor;

Compreender o conceito de Lista Duplamente

Encadeada;

Compreender operações com LDE sem ou com

descritor;

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

Direto ao Assunto

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

Nas listas duplamente ligadas, cada nó possui dois ponteiros, sendo que um aponta para o nó anterior e o outro, para o nó posterior. Sendo assim, a lista pode ser “percorrida” começando por qualquer extremidade.

Um ponteiro ant aponta para o nó que precede enquanto que o ponteiro prox, aponta para o

nó que o sucede.

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

Os algoritmos de algumas operações com LDE(listas ligadas) têm um certo grau de complexidade, mas facilitam na manipulação da LDE.

 A LDE é indicada quando precisarmos percorrer a lista do fim para o início.

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

Quando usamos LDE sem descritor, as funções básicas de inserção, remoção, busca, conta nós e impressão, quase não têm diferença para as LE exceto pelo ponteiro anterior.

Não existe a necessidade de dimensionar o número de nós porque a alocação vai sendo feita de acordo com a necessidade.

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

Criar listaLiberar listaVerificar se a lista está vaziaInserir na primeira posiçãoInserir na última posiçãoRemover o primeiro elemento da listaRemover o último elemento da listaRemover um elemento por buscaExibir lista do primeiro para o último nóExibir lista do último para o primeiro nóContar número de nós, etc.

Algumas operações realizadas com uma LDE

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

struct listaDE { int info; struct listaDE* ant; struct listaDE* prox;};

Definido a struct

Para entendimento das funções

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

Inicialização

listaDE *lista= NULL;

Definido a struct

Para entendimento das funções

struct listaDE { int info; struct listaDE* ant; struct listaDE* prox;};

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereInicio

novonovo

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereInicio

novonovo

2323

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereInicio

novonovo

2323 LISTALISTA

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereInicio

novonovo

NULLNULL 2323 LISTALISTA

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereInicio

novonovo

NULLNULL 2323 LISTALISTA

LISTALISTA

ifif

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereInicio

novonovo

NULLNULL 2323 LISTALISTA

LISTALISTAlista = insere(lista, valor);

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereInicio

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

novonovo

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

novonovo

2323

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

novonovo

NULLNULL2323

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

novonovo

NULLNULL2323LISTALISTA

ifif

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

novonovo

NULLNULL2323LISTALISTA

LISTALISTA

ifif

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

novonovo

NULLNULL2323

auxaux

LISTALISTAelseelse

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

novonovo

NULLNULL2323

auxaux

LISTALISTA

novonovo

elseelse

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

novonovo

NULLNULL2323auxaux

auxaux

LISTALISTA

novonovo

elseelse

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

novonovo

NULLNULL2323auxaux

auxaux

LISTALISTA

novonovo

elseelse

lista = insere(lista, valor);

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

exibeIpF

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

exibeIpF

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

exibeFpI

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

exibeFpI

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

contaNós

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

contaNós

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

busca

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

remove

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

remove

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

remove

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

A REMOÇÃO DE UM NÓ - Um ponto crítico nas LDE

p->ant->prox = p->prox;p->prox->ant = p->ant;

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

1) Através de seu ponteiro ant, p apontava para o nó anterior cuja representação é: p->ant. 2) Esse endereço foi copiado para o ponteiro ant do próximo nó acessado por p->prox->ant. (linha verde) 3) Sendo assim, após a remoção de p, p->prox ->ant apontará para o nó anterior ao que foi removido.(seta azul)

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

1) Através de seu ponteiro ant, p apontava para o nó anterior cuja representação é: p->ant. 2) Esse endereço foi copiado para o ponteiro ant do próximo nó acessado por p->prox->ant. (linha verde) 3) Sendo assim, após a remoção de p, p->prox ->ant apontará para o nó anterior ao que foi removido.(seta azul)

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

1) Através de seu ponteiro prox, p apontava para o próximo nó cuja representação é: p->prox. 2) Esse endereço foi copiado para o ponteiro prox do nó anterior acessado por p->ant->prox. (linha verde)  3) Sendo assim, após a remoção de p, p->ant->prox apontará para o nó seguinte ao que foi removido.(seta azul)

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

1) Através de seu ponteiro prox, p apontava para o próximo nó cuja representação é: p->prox. 2) Esse endereço foi copiado para o ponteiro prox do nó anterior acessado por p->ant->prox. (linha verde)  3) Sendo assim, após a remoção de p, p->ant->prox apontará para o nó seguinte ao que foi removido.(seta azul)

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

O nó descritor é criado para fazer referências ao primeiro e/ou ao ultimo nó. Por essa razão, seu uso facilita o acesso aos nós da lista. Seja para inserir, no início ou no fim, remover, do início ou do fim, etc.

Como o nó descritor pode conter, também, outras informações, optei por ter o total de nós da lista.

A única preocupação fica em ter que atualizá-lo na inserção e na remoção de um nó na lista, uma vez que o acesso a um nó da lista será feito através dele.

DESCRITOR

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

struct listaDE { int info; struct listaDE* ant; struct listaDE* prox;};

1) Definindo a struct

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

struct DE{ int tam; listaDE* prim; listaDE* ult;};

2) Definindo a struct

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

DE *ptrDesc=new DE; ptrDesc->prim=NULL; ptrDesc->ult=NULL; ptrDesc->tam=0;

3) Inicialização

NULLNULL NULLNULL00

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereInicio

ptAuxptAux

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereInicio

ptAuxptAux

2323

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereInicio

ptAuxptAux

2323

ptrDescptrDesc

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereInicio

ptAuxptAux

NULLNULL 2323

ptrDescptrDesc

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereInicio

ptAuxptAux

NULLNULL 2323

ptrDescptrDesc

+=1+=1

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereInicio

ptAuxptAux

NULLNULL 2323

ptrDescptrDesc

+=1+=1NULL ?NULL ?

ifif

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereInicio

ptAuxptAux

NULLNULL 2323

ptrDescptrDesc

+=1+=1

ifif

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereInicio

ptAuxptAux

NULLNULL 2323

ptrDescptrDesc

+=1+=1

elseelse

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereInicio

ptAuxptAux

NULLNULL 2323

ptrDescptrDesc

+=1+=1

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereInicio

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

ptAuxptAux

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

ptAuxptAux

2323

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

ptAuxptAux

NULLNULL2323

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

ptAuxptAux

ptrDescptrDesc

NULLNULL2323

+=1+=1

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

ptAuxptAux

ptrDescptrDesc

NULLNULL2323

+=1+=1

ifif

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

ptAuxptAux

ptrDescptrDesc

NULLNULL2323

+=1+=1

ifif

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

ptAuxptAux

ptrDescptrDesc

NULLNULL2323

+=1+=1

ifif

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

ptAuxptAux

ptrDescptrDesc

NULLNULL2323

+=1+=1

ifif

NULLNULL

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

ptUltptUltptrDescptrDesc

+=1+=1

elseelse

ptAuxptAux

NULLNULL2323

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

ptUltptUltptrDescptrDesc

+=1+=1

elseelse

ptAuxptAux

NULLNULL2323

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

ptUltptUltptrDescptrDesc

+=1+=1

elseelse

ptAuxptAux

NULLNULL2323

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

ptUltptUltptrDescptrDesc

+=1+=1

elseelse

ptAuxptAux

NULLNULL2323

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

ptUltptUltptrDescptrDesc

+=1+=1

elseelse

ptAuxptAux

NULLNULL2323

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

insereFim

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

Exibe Inicio - Fim

ptrDescptrDesc

ptrptr

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

Exibe Inicio - Fim

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

Exibe Fim – Inicio

ptrDescptrDesc

ptrptr

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

Exibe Fim – Inicio

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeInicio

auxaux

ptrDescptrDesc

ifif

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeInicio

auxaux

ptrDescptrDesc

ifif

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeInicio

auxaux

ptrDescptrDesc

ifif

NULLNULL

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeInicio

auxaux

ptrDescptrDesc

ifif

NULLNULL NULLNULL

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeInicio

auxaux

ptrDescptrDesc

ifif

NULLNULL-=1-=1NULLNULL

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeInicio

auxaux

ptrDescptrDesc

ifif

NULLNULL00NULLNULL

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeInicio

auxaux

ptrDescptrDesc

elseelse

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeInicio

auxaux

ptrDescptrDesc

elseelse

NULL

NULL

primprim

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeInicio

auxaux

ptrDescptrDesc

elseelse

NULL

NULL

primprim

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeInicio

auxaux

ptrDescptrDesc

elseelse

NULL

NULL

primprim

-=1-=1

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeInicio

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeFim

auxaux

ptrDescptrDesc

ifif

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeFim

auxaux

ptrDescptrDesc

ifif

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeFim

auxaux

ptrDescptrDesc

ifif

NULLNULL

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeFim

auxaux

ptrDescptrDesc

ifif

NULLNULL NULLNULL

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeFim

auxaux

ptrDescptrDesc

ifif

NULLNULL NULLNULL-=1-=1

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeFim

auxaux

ptrDescptrDesc

ifif

NULLNULL NULLNULL 0 0

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeFim

auxaux

ptrDescptrDesc

elseelse

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeFim

auxaux

ptrDescptrDesc

elseelse

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeFim

auxaux

ptrDescptrDesc

elseelse

NULL

NULL

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeFim

auxaux

ptrDescptrDesc

elseelse

NULL

NULL

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeFim

auxaux

ptrDescptrDesc

elseelse

NULL

NULL

-=1-=1

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

removeFim

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

Libera

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

Resumindo

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

#include <iostream>#include <cstdlib>using namespace std;struct listaDE { int info; struct listaDE* ant; struct listaDE* prox;};//ProtótiposlistaDE *insere(listaDE *LISTA, int valor);listaDE *insereFim(listaDE *LISTA, int valor);void exibeIpF(listaDE *LISTA);void exibeFpI(listaDE *LISTA);listaDE *remove(listaDE *LISTA, int valor);listaDE *busca (listaDE *LISTA, int valor);int contaNos(listaDE *LISTA);void libera(listaDE *LISTA);

#include <iostream>#include <cstdlib>using namespace std;struct listaDE { int info; struct listaDE* ant; struct listaDE* prox;};//ProtótiposlistaDE *insere(listaDE *LISTA, int valor);listaDE *insereFim(listaDE *LISTA, int valor);void exibeIpF(listaDE *LISTA);void exibeFpI(listaDE *LISTA);listaDE *remove(listaDE *LISTA, int valor);listaDE *busca (listaDE *LISTA, int valor);int contaNos(listaDE *LISTA);void libera(listaDE *LISTA);

Menu LDE sem Descritor

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

int main(){ int op, valor; struct listaDE *lista= NULL; //inicializa a lista duplamente encadeada do { system("cls"); system("color 2f"); cout<<"\n\n( () ) Alocacao Dinamica ( () )"; cout<<"\n( )"; cout<<"\n( 1- Insere no Inicio )"; cout<<"\n( 2- Insere no Fim )"; cout<<"\n( 3- Remove da Lista DE )"; cout<<"\n( 4- Exibe a Lista DE IpF )"; cout<<"\n( 5- Exibe a Lista DE TpF )"; cout<<"\n( 6- Conta Nos da Lista DE )"; cout<<"\n( 7- Libera a Lista DE )"; cout<<"\n( 8- Sai )"; cout<<"\n( Opcao: )"; cout<<"\n( )"; cout<<"\n( ( ) ) ( ( ) ) ( ( ) ) ( ( ) )\n"; cin>>op;

int main(){ int op, valor; struct listaDE *lista= NULL; //inicializa a lista duplamente encadeada do { system("cls"); system("color 2f"); cout<<"\n\n( () ) Alocacao Dinamica ( () )"; cout<<"\n( )"; cout<<"\n( 1- Insere no Inicio )"; cout<<"\n( 2- Insere no Fim )"; cout<<"\n( 3- Remove da Lista DE )"; cout<<"\n( 4- Exibe a Lista DE IpF )"; cout<<"\n( 5- Exibe a Lista DE TpF )"; cout<<"\n( 6- Conta Nos da Lista DE )"; cout<<"\n( 7- Libera a Lista DE )"; cout<<"\n( 8- Sai )"; cout<<"\n( Opcao: )"; cout<<"\n( )"; cout<<"\n( ( ) ) ( ( ) ) ( ( ) ) ( ( ) )\n"; cin>>op;

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

system("cls");system("color f2");switch(op) { case 1:cout<<"\nDigite valor a ser inserido: "; cin>>valor; lista = insere(lista, valor); break;

case 2:cout<<"\nDigite valor a ser inserido: "; cin>>valor; lista = insereFim(lista, valor); break; case 3:if(!lista) cout << "\n\nNada a remover. Lista vazia\n"; else { cout<<"\nDigite valor a ser removido: "; cin>>valor; lista=remove(lista, valor); } break;

system("cls");system("color f2");switch(op) { case 1:cout<<"\nDigite valor a ser inserido: "; cin>>valor; lista = insere(lista, valor); break;

case 2:cout<<"\nDigite valor a ser inserido: "; cin>>valor; lista = insereFim(lista, valor); break; case 3:if(!lista) cout << "\n\nNada a remover. Lista vazia\n"; else { cout<<"\nDigite valor a ser removido: "; cin>>valor; lista=remove(lista, valor); } break;

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

case 4: if(!lista) cout << "\n\nLista vazia\n"; else exibeIpF(lista); break; case 5: if(!lista) cout << "\n\nLista vazia\n"; else exibeFpI(lista); break;

case 6:if(!lista) cout << "\n\nLista vazia\n"; else cout<<"\nTotal de nos: "<< contaNos(lista); break;

case 4: if(!lista) cout << "\n\nLista vazia\n"; else exibeIpF(lista); break; case 5: if(!lista) cout << "\n\nLista vazia\n"; else exibeFpI(lista); break;

case 6:if(!lista) cout << "\n\nLista vazia\n"; else cout<<"\nTotal de nos: "<< contaNos(lista); break;

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

case 7: if(lista) cout<<"\nTem elementos na Lista\n"; else { libera(lista); cout<<"\nLiberando Memoria"; } break; case 8: cout<<"Fechando Lista Duplamente Encadedada\n"; break; default:cout<<"\nOpcao Invalida\n"; } cout<<"\n\n"; system("pause"); } while(op !=8); return 0;}

case 7: if(lista) cout<<"\nTem elementos na Lista\n"; else { libera(lista); cout<<"\nLiberando Memoria"; } break; case 8: cout<<"Fechando Lista Duplamente Encadedada\n"; break; default:cout<<"\nOpcao Invalida\n"; } cout<<"\n\n"; system("pause"); } while(op !=8); return 0;}

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

// insere no início listaDE *insere(listaDE *LISTA, int valor){ listaDE* novo = new listaDE; novo->info = valor; novo->prox = LISTA; novo->ant = NULL; if (LISTA) { LISTA->ant = novo; } return novo;}

// insere no início listaDE *insere(listaDE *LISTA, int valor){ listaDE* novo = new listaDE; novo->info = valor; novo->prox = LISTA; novo->ant = NULL; if (LISTA) { LISTA->ant = novo; } return novo;}

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

//insere no fimlistaDE *insereFim(listaDE *LISTA, int valor){ listaDE *novo, *aux; novo = new listaDE; novo->info = valor; novo->prox = NULL; if (LISTA == NULL) { novo->ant = LISTA; LISTA = novo; } else { aux = LISTA; while (aux->prox != NULL) aux = aux->prox; aux->prox = novo; novo->ant = aux; } return LISTA;}

//insere no fimlistaDE *insereFim(listaDE *LISTA, int valor){ listaDE *novo, *aux; novo = new listaDE; novo->info = valor; novo->prox = NULL; if (LISTA == NULL) { novo->ant = LISTA; LISTA = novo; } else { aux = LISTA; while (aux->prox != NULL) aux = aux->prox; aux->prox = novo; novo->ant = aux; } return LISTA;}

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

// exibe lista IpFvoid exibeIpF(listaDE *LISTA){ listaDE* ptr; cout<<"\nExibe a lista do primeiro para o ultimo\n"; for (ptr=LISTA; ptr != NULL; ptr=ptr->prox) cout<<"\n"<<ptr->info;} // exibe lista TpFvoid exibeFpI(listaDE *LISTA){ listaDE* ptr=LISTA; cout<<"\nExibe a lista do ultimo para o primeiro \n"; while(ptr->prox) { ptr=ptr->prox; } while(ptr!=LISTA) { cout<<"\n"<<ptr->info; ptr=ptr->ant; } cout<<"\n"<<ptr->info;}

// exibe lista IpFvoid exibeIpF(listaDE *LISTA){ listaDE* ptr; cout<<"\nExibe a lista do primeiro para o ultimo\n"; for (ptr=LISTA; ptr != NULL; ptr=ptr->prox) cout<<"\n"<<ptr->info;} // exibe lista TpFvoid exibeFpI(listaDE *LISTA){ listaDE* ptr=LISTA; cout<<"\nExibe a lista do ultimo para o primeiro \n"; while(ptr->prox) { ptr=ptr->prox; } while(ptr!=LISTA) { cout<<"\n"<<ptr->info; ptr=ptr->ant; } cout<<"\n"<<ptr->info;}

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

// remove um elemento da lista listaDE *remove(listaDE* LISTA, int valor){ listaDE *p = busca(LISTA,valor); if (!p) { cout<< "\nValor nao achado\n"; return LISTA; } // nao achou o elemento

// retira elemento do encadeamento if (LISTA == p) LISTA = p->prox; else p->ant->prox = p->prox; if (p->prox ) p->prox->ant = p->ant; cout<<"\nValor removido\n"; delete p; return LISTA;}

// remove um elemento da lista listaDE *remove(listaDE* LISTA, int valor){ listaDE *p = busca(LISTA,valor); if (!p) { cout<< "\nValor nao achado\n"; return LISTA; } // nao achou o elemento

// retira elemento do encadeamento if (LISTA == p) LISTA = p->prox; else p->ant->prox = p->prox; if (p->prox ) p->prox->ant = p->ant; cout<<"\nValor removido\n"; delete p; return LISTA;}

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

// busca valor na listalistaDE *busca (listaDE *LISTA, int valor){ listaDE *ptr; for (ptr=LISTA; ptr != NULL; ptr=ptr->prox) if (ptr->info == valor) return ptr; return NULL; // nao achou o elemento }

//conta nós da Listaint contaNos(listaDE *LISTA){ int conta = 0; while (LISTA != NULL) { conta++; LISTA = LISTA->prox; } return conta;}

// busca valor na listalistaDE *busca (listaDE *LISTA, int valor){ listaDE *ptr; for (ptr=LISTA; ptr != NULL; ptr=ptr->prox) if (ptr->info == valor) return ptr; return NULL; // nao achou o elemento }

//conta nós da Listaint contaNos(listaDE *LISTA){ int conta = 0; while (LISTA != NULL) { conta++; LISTA = LISTA->prox; } return conta;}

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

//liberavoid libera(listaDE *LISTA){ delete LISTA; LISTA=0;}

//liberavoid libera(listaDE *LISTA){ delete LISTA; LISTA=0;}

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

#include <iostream>#include <cstdlib>using namespace std;

struct listaDE { int info; listaDE* ant; listaDE* prox;};

struct DE{ int tam; listaDE* prim; listaDE* ult;};

#include <iostream>#include <cstdlib>using namespace std;

struct listaDE { int info; listaDE* ant; listaDE* prox;};

struct DE{ int tam; listaDE* prim; listaDE* ult;};

Menu LDE com Descritor

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

//ProtótiposDE *insereFim(DE *ptrDesc, int valor);DE *insereInicio(DE *ptrDesc, int valor);void exibeIpF(DE *ptrDesc);void exibeTpF(DE *ptrDesc);void libera(DE *ptrDesc);void removerFim(DE *ptrDesc);void removerInicio(DE *ptrDesc);

int main(){ int op, valor; //inicializa a lista duplamente encadeada DE *ptrDesc=new DE; ptrDesc->prim=NULL; ptrDesc->ult=NULL; ptrDesc->tam=0;

//ProtótiposDE *insereFim(DE *ptrDesc, int valor);DE *insereInicio(DE *ptrDesc, int valor);void exibeIpF(DE *ptrDesc);void exibeTpF(DE *ptrDesc);void libera(DE *ptrDesc);void removerFim(DE *ptrDesc);void removerInicio(DE *ptrDesc);

int main(){ int op, valor; //inicializa a lista duplamente encadeada DE *ptrDesc=new DE; ptrDesc->prim=NULL; ptrDesc->ult=NULL; ptrDesc->tam=0;

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

do { system("cls"); system("color 2f"); cout<<"\n\n( () ) Alocacao Dinamica ( () )"; cout<<"\n( )"; cout<<"\n( 1- Insere no Inicio )"; cout<<"\n( 2- Insere no Fim )"; cout<<"\n( 3- Remove no Inicio )"; cout<<"\n( 4- Remove no Fim )"; cout<<"\n( 5- Exibe a Lista DE IpF )"; cout<<"\n( 6- Exibe a Lista DE TpF )"; cout<<"\n( 7- Libera a Lista DE )"; cout<<"\n( 8- Sai )"; cout<<"\n( Opcao: )"; cout<<"\n( )"; cout<<"\n( ( ) ) ( ( ) ) ( ( ) ) ( ( ) )\n"; cin>>op;

do { system("cls"); system("color 2f"); cout<<"\n\n( () ) Alocacao Dinamica ( () )"; cout<<"\n( )"; cout<<"\n( 1- Insere no Inicio )"; cout<<"\n( 2- Insere no Fim )"; cout<<"\n( 3- Remove no Inicio )"; cout<<"\n( 4- Remove no Fim )"; cout<<"\n( 5- Exibe a Lista DE IpF )"; cout<<"\n( 6- Exibe a Lista DE TpF )"; cout<<"\n( 7- Libera a Lista DE )"; cout<<"\n( 8- Sai )"; cout<<"\n( Opcao: )"; cout<<"\n( )"; cout<<"\n( ( ) ) ( ( ) ) ( ( ) ) ( ( ) )\n"; cin>>op;

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

system("cls"); system("color f2");switch(op){ case 1:cout<<"\nDigite valor a ser inserido no Inicio: "; cin>>valor; ptrDesc=insereInicio(ptrDesc, valor); break; case 2:cout<<"\nDigite valor a ser inserido no Fim: "; cin>>valor; ptrDesc=insereFim(ptrDesc, valor); break; case 3: if(ptrDesc->tam == 0) cout << "\n\nLista vazia\n"; else removerInicio(ptrDesc); break;

system("cls"); system("color f2");switch(op){ case 1:cout<<"\nDigite valor a ser inserido no Inicio: "; cin>>valor; ptrDesc=insereInicio(ptrDesc, valor); break; case 2:cout<<"\nDigite valor a ser inserido no Fim: "; cin>>valor; ptrDesc=insereFim(ptrDesc, valor); break; case 3: if(ptrDesc->tam == 0) cout << "\n\nLista vazia\n"; else removerInicio(ptrDesc); break;

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

case 4: if(ptrDesc->tam == 0) cout << "\n\nLista vazia\n"; else removerFim(ptrDesc); break; case 5: if(ptrDesc->tam == 0) cout << "\n\nLista vazia\n"; else exibeIpF(ptrDesc); break;

case 6: if(ptrDesc->tam == 0) cout << "\n\nLista vazia\n"; else exibeTpF(ptrDesc); break;

case 4: if(ptrDesc->tam == 0) cout << "\n\nLista vazia\n"; else removerFim(ptrDesc); break; case 5: if(ptrDesc->tam == 0) cout << "\n\nLista vazia\n"; else exibeIpF(ptrDesc); break;

case 6: if(ptrDesc->tam == 0) cout << "\n\nLista vazia\n"; else exibeTpF(ptrDesc); break;

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

case 7: if(ptrDesc->tam != 0) cout<<"\nTem elementos na Lista\n"; else { libera(ptrDesc); cout<<"\nLiberando Memoria"; } break; case 8: cout<<"Fechando Lista Duplamente Encadedada\n"; break; default: cout<<"\nOpcao Invalida\n"; } cout<<"\n\n"; system("pause"); } while(op !=8); return 0;}

case 7: if(ptrDesc->tam != 0) cout<<"\nTem elementos na Lista\n"; else { libera(ptrDesc); cout<<"\nLiberando Memoria"; } break; case 8: cout<<"Fechando Lista Duplamente Encadedada\n"; break; default: cout<<"\nOpcao Invalida\n"; } cout<<"\n\n"; system("pause"); } while(op !=8); return 0;}

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

//insere no inicioDE *insereInicio(DE *ptrDesc, int valor){ listaDE *ptAux=new listaDE; if (ptAux != NULL) { //verifica se existe memória disponível ptAux->info = valor; ptAux->prox = ptrDesc->prim; ptAux->ant = NULL; ptrDesc->tam=ptrDesc->tam+1; if (ptrDesc->prim != NULL) { ptrDesc->prim->ant = ptAux; } else { ptrDesc->ult = ptAux; } //ajusta ponteiro para fim ptrDesc->prim=ptAux;//ajusta ponteiro início return ptrDesc; } else{ cout<<"\nSem memoria\n"; exit(-1);} }

//insere no inicioDE *insereInicio(DE *ptrDesc, int valor){ listaDE *ptAux=new listaDE; if (ptAux != NULL) { //verifica se existe memória disponível ptAux->info = valor; ptAux->prox = ptrDesc->prim; ptAux->ant = NULL; ptrDesc->tam=ptrDesc->tam+1; if (ptrDesc->prim != NULL) { ptrDesc->prim->ant = ptAux; } else { ptrDesc->ult = ptAux; } //ajusta ponteiro para fim ptrDesc->prim=ptAux;//ajusta ponteiro início return ptrDesc; } else{ cout<<"\nSem memoria\n"; exit(-1);} }

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

//insere no fimDE *insereFim(DE *ptrDesc, int valor){ listaDE *ptAux=new listaDE; listaDE *ptUlt; ptAux->info = valor; ptAux->prox = NULL; ptrDesc->tam=ptrDesc->tam+1; if (ptrDesc->ult == NULL) { ptrDesc->ult=ptAux; ptrDesc->prim=ptrDesc->ult; ptAux->ant=NULL; } else { ptUlt=ptrDesc->ult; ptUlt->prox=ptAux; ptAux->ant=ptUlt; ptrDesc->ult=ptAux; } return ptrDesc;}

//insere no fimDE *insereFim(DE *ptrDesc, int valor){ listaDE *ptAux=new listaDE; listaDE *ptUlt; ptAux->info = valor; ptAux->prox = NULL; ptrDesc->tam=ptrDesc->tam+1; if (ptrDesc->ult == NULL) { ptrDesc->ult=ptAux; ptrDesc->prim=ptrDesc->ult; ptAux->ant=NULL; } else { ptUlt=ptrDesc->ult; ptUlt->prox=ptAux; ptAux->ant=ptUlt; ptrDesc->ult=ptAux; } return ptrDesc;}

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

//remove do iniciovoid removerInicio(DE *ptrDesc){ listaDE *aux=new listaDE; if (ptrDesc->prim == ptrDesc->ult) { //lista com um elemento aux->info=ptrDesc->prim->info; ptrDesc->prim = NULL; ptrDesc->ult = NULL; ptrDesc->tam=ptrDesc->tam - 1; } else { //lista com mais de um elemento aux->info=ptrDesc->prim->info; ptrDesc->prim->prox->ant = NULL; ptrDesc->prim = ptrDesc->prim->prox; ptrDesc->tam=ptrDesc->tam - 1; } cout<<"\nRemovido: "<<aux->info;}

//remove do iniciovoid removerInicio(DE *ptrDesc){ listaDE *aux=new listaDE; if (ptrDesc->prim == ptrDesc->ult) { //lista com um elemento aux->info=ptrDesc->prim->info; ptrDesc->prim = NULL; ptrDesc->ult = NULL; ptrDesc->tam=ptrDesc->tam - 1; } else { //lista com mais de um elemento aux->info=ptrDesc->prim->info; ptrDesc->prim->prox->ant = NULL; ptrDesc->prim = ptrDesc->prim->prox; ptrDesc->tam=ptrDesc->tam - 1; } cout<<"\nRemovido: "<<aux->info;}

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

//remove do fimvoid removerFim(DE *ptrDesc){ listaDE *aux=new listaDE; if (ptrDesc->prim == ptrDesc->ult) { //lista com um elemento aux->info=ptrDesc->prim->info; ptrDesc->prim = NULL; ptrDesc->ult = NULL; ptrDesc->tam=ptrDesc->tam - 1; } else { //lista com mais de um elemento aux->info=ptrDesc->ult->info; ptrDesc->ult->ant->prox = NULL; ptrDesc->ult = ptrDesc->ult->ant; ptrDesc->tam=ptrDesc->tam - 1; } cout<<"\nRemovido: "<<aux->info;}

//remove do fimvoid removerFim(DE *ptrDesc){ listaDE *aux=new listaDE; if (ptrDesc->prim == ptrDesc->ult) { //lista com um elemento aux->info=ptrDesc->prim->info; ptrDesc->prim = NULL; ptrDesc->ult = NULL; ptrDesc->tam=ptrDesc->tam - 1; } else { //lista com mais de um elemento aux->info=ptrDesc->ult->info; ptrDesc->ult->ant->prox = NULL; ptrDesc->ult = ptrDesc->ult->ant; ptrDesc->tam=ptrDesc->tam - 1; } cout<<"\nRemovido: "<<aux->info;}

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

// exibe lista IpFvoid exibeIpF(DE *ptrDesc){ listaDE* ptr=ptrDesc->prim; cout<<"\nExibe a lista do primeiro para o ultimo\n"; for (int i=1; i<=ptrDesc->tam; i++) { cout<<"\n"<<ptr->info; ptr=ptr->prox; }}

// exibe lista TpFvoid exibeTpF(DE *ptrDesc){ listaDE* ptr=ptrDesc->ult; cout<<"\nExibe a lista do ultimo para o primeiro \n"; for (int i=ptrDesc->tam; i>=1; i--) { cout<<"\n"<<ptr->info; ptr=ptr->ant; }}

// exibe lista IpFvoid exibeIpF(DE *ptrDesc){ listaDE* ptr=ptrDesc->prim; cout<<"\nExibe a lista do primeiro para o ultimo\n"; for (int i=1; i<=ptrDesc->tam; i++) { cout<<"\n"<<ptr->info; ptr=ptr->prox; }}

// exibe lista TpFvoid exibeTpF(DE *ptrDesc){ listaDE* ptr=ptrDesc->ult; cout<<"\nExibe a lista do ultimo para o primeiro \n"; for (int i=ptrDesc->tam; i>=1; i--) { cout<<"\n"<<ptr->info; ptr=ptr->ant; }}

ESTRUTURA DE DADOS

Listas Duplamente Encadeadas– Aula10

//liberavoid libera(DE *ptrDesc){ delete ptrDesc; ptrDesc=0;}

//liberavoid libera(DE *ptrDesc){ delete ptrDesc; ptrDesc=0;}