Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouSabrina Duarte Alterado mais de 9 anos atrás
1
ESTRUTURA DE DADOS Aula 10 – Listas Duplamente Encadeadas
2
Atenção aos Temas Principais dessa Aula
3
Conteúdo Programático desta aula
Compreender o conceito de Lista Duplamente Encadeada; Compreender operações com LDE sem ou com descritor;
4
Direto ao Assunto
6
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.
7
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.
8
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.
9
Algumas operações realizadas com uma LDE
Criar lista Liberar lista Verificar se a lista está vazia Inserir na primeira posição Inserir na última posição Remover o primeiro elemento da lista Remover o último elemento da lista Remover um elemento por busca Exibir 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
11
struct listaDE { int info; struct listaDE* ant; struct listaDE* prox; }; Definido a struct Para entendimento das funções
12
Inicialização listaDE *lista= NULL; Definido a struct Para entendimento das funções struct listaDE { int info; struct listaDE* ant; struct listaDE* prox; };
15
insereInicio novo
16
insereInicio novo 23
17
insereInicio novo 23 LISTA
18
insereInicio novo NULL 23 LISTA
19
insereInicio novo NULL 23 LISTA if
20
lista = insere(lista, valor);
insereInicio novo NULL 23 LISTA lista = insere(lista, valor);
21
insereInicio
22
insereFim novo
23
insereFim novo 23
24
insereFim novo NULL 23
25
insereFim novo NULL 23 LISTA if
26
insereFim novo NULL 23 LISTA if
27
insereFim novo NULL 23 aux LISTA else
28
insereFim novo NULL 23 aux LISTA else
29
insereFim novo NULL 23 aux LISTA else
30
lista = insere(lista, valor);
insereFim novo NULL 23 aux LISTA else lista = insere(lista, valor);
31
insereFim
32
exibeIpF
33
exibeIpF
34
exibeFpI
35
exibeFpI
36
contaNós
37
contaNós
38
busca
39
remove
40
remove
41
remove
42
A REMOÇÃO DE UM NÓ - Um ponto crítico nas LDE
p->ant->prox = p->prox; p->prox->ant = p->ant;
45
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)
46
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)
49
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)
50
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)
52
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
53
struct listaDE { int info; struct listaDE* ant; struct listaDE* prox; }; 1) Definindo a struct
54
struct DE { int tam; listaDE* prim; listaDE* ult; }; 2) Definindo a struct
55
ptrDesc->prim=NULL; ptrDesc->ult=NULL; ptrDesc->tam=0;
DE *ptrDesc=new DE; ptrDesc->prim=NULL; ptrDesc->ult=NULL; ptrDesc->tam=0; 3) Inicialização NULL
57
insereInicio ptAux
58
insereInicio ptAux 23
59
insereInicio ptAux 23 ptrDesc
60
insereInicio ptAux NULL 23 ptrDesc
61
insereInicio ptAux NULL 23 ptrDesc +=1
62
insereInicio ptAux NULL 23 ptrDesc +=1 NULL ? if
63
insereInicio ptAux NULL 23 ptrDesc +=1 if
64
insereInicio ptAux NULL 23 ptrDesc +=1 else
65
insereInicio ptAux NULL 23 ptrDesc +=1
66
insereInicio
67
insereFim ptAux
68
insereFim ptAux 23
69
insereFim ptAux NULL 23
70
insereFim ptAux ptrDesc NULL 23 +=1
71
insereFim ptAux ptrDesc NULL 23 +=1 if
72
insereFim ptAux ptrDesc NULL 23 +=1 if
73
insereFim ptAux ptrDesc NULL 23 +=1 if
74
insereFim ptAux ptrDesc NULL 23 +=1 if
75
insereFim ptUlt ptrDesc +=1 else ptAux NULL 23
76
insereFim ptUlt ptrDesc +=1 else ptAux NULL 23
77
insereFim ptUlt ptrDesc +=1 else ptAux NULL 23
78
insereFim ptUlt ptrDesc +=1 else ptAux NULL 23
79
insereFim ptUlt ptrDesc +=1 else ptAux NULL 23
80
insereFim
81
Exibe Inicio - Fim ptrDesc ptr
82
Exibe Inicio - Fim
83
Exibe Fim – Inicio ptrDesc ptr
84
Exibe Fim – Inicio
85
removeInicio aux ptrDesc if
86
removeInicio aux ptrDesc if
87
removeInicio aux ptrDesc if NULL
88
removeInicio aux ptrDesc if NULL
89
removeInicio aux ptrDesc if NULL -=1
90
removeInicio aux ptrDesc if NULL
91
removeInicio aux ptrDesc else
92
removeInicio aux ptrDesc else NULL prim
93
removeInicio aux ptrDesc else NULL prim
94
removeInicio aux ptrDesc else NULL prim -=1
95
removeInicio
96
removeFim aux ptrDesc if
97
removeFim aux ptrDesc if
98
removeFim aux ptrDesc if NULL
99
removeFim aux ptrDesc if NULL
100
removeFim aux ptrDesc if NULL -=1
101
removeFim aux ptrDesc if NULL
102
removeFim aux ptrDesc else
103
removeFim aux ptrDesc else
104
removeFim aux ptrDesc else NULL
105
removeFim aux ptrDesc else NULL
106
removeFim aux ptrDesc else NULL -=1
107
removeFim
108
Libera
109
Resumindo
110
Menu LDE sem Descritor #include <iostream>
#include <cstdlib> using namespace std; struct listaDE { int info; struct listaDE* ant; struct listaDE* prox; }; //Protótipos listaDE *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
111
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( ( ) ) ( ( ) ) ( ( ) ) ( ( ) )\n"; cin>>op;
112
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: "; lista = insereFim(lista, valor); 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); }
113
case 4: if(!lista) cout << "\n\nLista vazia\n"; else exibeIpF(lista); break; case 5: if(!lista) exibeFpI(lista); case 6:if(!lista) cout<<"\nTotal de nos: "<< contaNos(lista);
114
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"; default:cout<<"\nOpcao Invalida\n"; cout<<"\n\n"; system("pause"); } while(op !=8); return 0;
115
// 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;
116
//insere no fim listaDE *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;
117
// exibe lista IpF void 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 TpF void 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) ptr=ptr->ant;
118
// 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; }
119
// busca valor na lista listaDE *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 Lista int contaNos(listaDE *LISTA) int conta = 0; while (LISTA != NULL) conta++; LISTA = LISTA->prox; return conta;
120
//libera void libera(listaDE *LISTA) { delete LISTA; LISTA=0; }
121
Menu LDE com Descritor #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
122
//Protótipos DE *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;
123
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( ( ) ) ( ( ) ) ( ( ) ) ( ( ) )\n"; cin>>op;
124
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); case 3: if(ptrDesc->tam == 0) cout << "\n\nLista vazia\n"; else removerInicio(ptrDesc);
125
case 4: if(ptrDesc->tam == 0)
cout << "\n\nLista vazia\n"; else removerFim(ptrDesc); break; case 5: if(ptrDesc->tam == 0) exibeIpF(ptrDesc); case 6: if(ptrDesc->tam == 0) exibeTpF(ptrDesc);
126
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"; default: cout<<"\nOpcao Invalida\n"; cout<<"\n\n"; system("pause"); } while(op !=8); return 0;
127
//insere no inicio DE *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);}
128
//insere no fim DE *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; return ptrDesc;
129
//remove do inicio void 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 ptrDesc->prim->prox->ant = NULL; ptrDesc->prim = ptrDesc->prim->prox; cout<<"\nRemovido: "<<aux->info;
130
//remove do fim void 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; cout<<"\nRemovido: "<<aux->info;
131
// exibe lista IpF void 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 TpF void 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--) ptr=ptr->ant;
132
//libera void libera(DE *ptrDesc) { delete ptrDesc; ptrDesc=0; }
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.