A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

ESTRUTURA DE DADOS Aula 10 – Listas Duplamente Encadeadas.

Apresentações semelhantes


Apresentação em tema: "ESTRUTURA DE DADOS Aula 10 – Listas Duplamente Encadeadas."— Transcrição da apresentação:

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

5

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

10

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

13

14

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;

43

44

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)

47

48

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)

51

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

56

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


Carregar ppt "ESTRUTURA DE DADOS Aula 10 – Listas Duplamente Encadeadas."

Apresentações semelhantes


Anúncios Google