estrutura de dados aula 10 – listas duplamente encadeadas
TRANSCRIPT
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;}