20723885-lista-duplamente
TRANSCRIPT
![Page 1: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/1.jpg)
228
Listas Duplamente Encadeadas
Como vimos, uma lista circular possui vantagens sobre uma lista linear, contudo esta ainda possui limitações.
Por exemplo, não podemos percorrê-la no sentido contrário ou ainda para inserirmos ou retirarmos um k-ésimoelemento temos que ter um ponteiro para seu antecessor.
Com o objetivo de sanar estas limitações surgiram as listas duplamente encadeadas.
![Page 2: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/2.jpg)
229
Listas Duplamente Encadeadas
Em uma lista duplamente encadeadaos elementos possuem três campos: o campo inf o qual contém a informação, o campo ant que possui um ponteiro para o elemento antecessor e o campo prox que é uma referência para o elemento que sucede.
L
λλλλ
ant
λλλλ
prox
inf
![Page 3: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/3.jpg)
230
Listas Duplamente EncadeadasDefiniremos agora o TAD LISTA_DUP_ENC:typedef struct nodo{
int inf;struct nodo * ant;struct nodo * prox;
}NODO;typedef NODO * LISTA_DUP_ENC;void cria_lista (LISTA_DUP_ENC *);int eh_vazia (LISTA_DUP_ENC);int tam (LISTA_DUP_ENC);void ins (LISTA_DUP_ENC *, int, int);int recup (LISTA_DUP_ENC, int);void ret (LISTA_DUP_ENC *, int);
![Page 4: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/4.jpg)
231
void cria_lista (LISTA_DUP_ENC *pl){
*pl=NULL;}int eh_vazia (LISTA_DUP_ENC l){
return (l == NULL);}int tam (LISTA_DUP_ENC l){
int cont;for (cont=0; l!= NULL; cont++)
l = l->prox;return (cont); }
![Page 5: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/5.jpg)
232
Esquema do processo da inserção de um nó da lista duplamente encadeada. (situação um)
Listas Duplamente Encadeadas
L
Novo
v. . .
L
Nodo 1
v. . .
![Page 6: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/6.jpg)
233
Esquema do processo da inserção de um nó da lista duplamente encadeada. (situação dois)
Listas Duplamente Encadeadas
L
Nodo 1 Nodo 2 Nodo 3
Novo
v
..
.X
L
Nodo 2 Nodo 3 Nodo 4
Nodo 1
v
..
.
![Page 7: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/7.jpg)
234
Esquema do processo da inserção de um nó da lista duplamente encadeada. (situação três)
Listas Duplamente Encadeadas
L
Nodo 1 Nodo 2
Novo
v
..
.
L
Nodo 1 Nodo 2
Nodo 3
v
..
.
![Page 8: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/8.jpg)
235
Esquema do processo da inserção de um nó da lista duplamente encadeada. (situação quatro)
Listas Duplamente Encadeadas
L
Nodo 1 Nodo 2 Nodo 3
Novo
v
.. XX
L
Nodo 1 Nodo 3 Nodo 4
Nodo 2
v
..
![Page 9: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/9.jpg)
236
void ins (LISTA_DUP_ENC *pl, int v, int k){
NODO *novo;if (k < 1 || k > tam(*pl)+1){
printf ("\nERRO! Posição invalida parainsercao.\n");exit (1);
}novo = (NODO *) malloc (sizeof(NODO));if (!novo){
printf ("\nERRO! Memoria insuficiente!\n");exit (2); }
![Page 10: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/10.jpg)
237
novo->inf = v;if (k==1){
novo->ant = NULL;novo->prox = *pl;*pl = novo;if ((*pl)->prox)
(*pl)->prox->ant=novo;}else{
LISTA_DUP_ENC aux;for (aux=*pl; k>2; aux=aux->prox, k--);
![Page 11: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/11.jpg)
238
novo->prox = aux->prox;aux->prox = novo; novo->ant=aux;if (novo->prox)
novo->prox->ant=novo;}
}
![Page 12: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/12.jpg)
239
int recup (LISTA_DUP_ENC l, int k){
if (k < 1 || k > tam(l)){
printf ("\nERRO! Consulta invalida.\n");exit (3);
}for (;k>1;k--)
l=l->prox;return (l->inf);
}
![Page 13: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/13.jpg)
240
Esquema do processo da retirada de um nó da lista duplamente encadeada. (situação um)
Listas Duplamente Encadeadas
L
Nodo 1
. . .
L
Aux
.
X
![Page 14: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/14.jpg)
241
Esquema do processo da retirada de um nó da lista duplamente encadeada. (situação dois)
Listas Duplamente Encadeadas
L
Nodo 1 Nodo 2 Nodo 3Aux
..X
X
L
Nodo 1 Nodo 2
..
![Page 15: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/15.jpg)
242
Esquema do processo da retirada de um nó da lista duplamente encadeada. (situação três)
Listas Duplamente Encadeadas
L
Nodo 1 Nodo 2 Nodo 3
Aux
..X
L
Nodo 1 Nodo 2
..
![Page 16: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/16.jpg)
243
Esquema do processo da retirada de um nó da lista duplamente encadeada. (situação quatro)
Listas Duplamente Encadeadas
L
Nodo 1 Nodo 2 Nodo 3
Aux
..X
X
L
Nodo 1 Nodo 2
..
![Page 17: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/17.jpg)
244
void ret (LISTA_DUP_ENC *pl, int k){
NODO *aux;if (k < 1 || k > tam(*pl)){
printf ("\nERRO! Posição invalida pararetirada.\n");exit (4);
}if (k==1){
aux = *pl;*pl = aux->prox;
![Page 18: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/18.jpg)
245
if (*pl)(*pl)->ant=NULL;
free (aux);}else{
for (aux=(*pl)->prox; k>2; k--, aux=aux->prox);aux->ant->prox = aux->prox;if (aux->prox)
aux->prox->ant = aux->ant;free (aux);
}}
![Page 19: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/19.jpg)
246
Implemente, no TAD LISTA_DUP_ENC, a seguinte operação:
void inverter_lista (LISTA_DUP_ENC *pl);
a qual recebe uma referência para uma lista duplamente encadeada e inverte a ordem de seus elementos.
Listas Duplamente Encadeadas – Exercício
![Page 20: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/20.jpg)
248
Listas Duplamente Encadeadas
Também podemos construir listas circulares duplamente encadeadasou listas circulares duplamente encadeadas com nó cabeçalho.
2
Lista circular duplamente encadeada
Lista circular duplamente encadeada com nó cabeçalho
![Page 21: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/21.jpg)
249
Listas Duplamente EncadeadasPara uma melhor fixação definiremos agora o
TAD LISTA_CIR_DUP_ENC_ NC.typedef struct nodo{
int inf;struct nodo * ant;struct nodo * prox;
}NODO;typedef NODO * LISTA_CIR_DUP_ENC_NC;void cria_lista (LISTA_CIR_DUP_ENC_NC *);int eh_vazia (LISTA_CIR_DUP_ENC_NC);int tam (LISTA_CIR_DUP_ENC_NC);void ins (LISTA_CIR_DUP_ENC_NC, int, int);int recup (LISTA_CIR_DUP_ENC_NC, int);void ret (LISTA_CIR_DUP_ENC_NC, int);
![Page 22: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/22.jpg)
250
void cria_lista (LISTA_CIR_DUP_ENC_NC *pl){
NODO *novo;novo = (NODO *) malloc (sizeof(NODO));if (!novo){
printf ("\nERRO! Memoria insuficiente!\n");exit (2);
}novo->inf=0;*pl=novo->ant=novo->prox=novo;
}
![Page 23: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/23.jpg)
251
int eh_vazia (LISTA_CIR_DUP_ENC_NC l){
return (l->inf == 0);}
int tam (LISTA_CIR_DUP_ENC_NC l){
return (l->inf);}
![Page 24: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/24.jpg)
252
Esquema do processo da inserção de um nó da lista circular duplamente encadeada com nó cabeçalho.
Listas Duplamente Encadeadas
2
L
NC Nodo 1 Nodo 2 Novo
X
X
v
3
L
NC Nodo 1 Nodo 2 Nodo 3
v
![Page 25: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/25.jpg)
253
void ins (LISTA_CIR_DUP_ENC_NC l, int v, int k){
LISTA_CIR_DUP_ENC_NC aux, novo;if (k < 1 || k > tam(l)+1){
printf ("\n%d %d\n",tam(l)+1,k);printf ("\nERRO! Posição invalida para
insercao.\n");exit (1);
}novo = (NODO *) malloc (sizeof(NODO));if (!novo){
printf ("\nERRO! Memoria insuficiente!\n");exit (2);
}
![Page 26: 20723885-lista-duplamente](https://reader033.vdocuments.mx/reader033/viewer/2022060112/5571f7b849795991698bde74/html5/thumbnails/26.jpg)
254
novo->inf = v;for (aux=l; k>1; aux=aux->prox, k--);novo->prox = aux->prox;novo->ant = aux; aux->prox = novo;novo->prox->ant=novo;l->inf++;
}