Post on 13-Jul-2020
Lista Duplamente Ligada(Lista Duplamente Encadeada)
Prof. Gláucya Boechatgcbcht@gmail.com
2
Lista Duplamente LigadaLista Duplamente Ligada
lista
6 8 3
\
\
3
Lista Duplamente LigadaLista Duplamente Ligada
● Cada nó na lista duplamente ligada possui um ponteiro para o nó precessor e outro para o nó sucessor.
● Permite percurso nas duas direções.– Direita
– Esquerda.
4
Lista Duplamente LigadaLista Duplamente Ligada
typedef struct no { int valor; struct no* ant; struct no* prox; }No;
5
Insere no inicio da lista duplamente ligada
Insere no inicio da lista duplamente ligada
void insere_lista_duplamente_ligada(No** lista, int v){
No* no; no = (No*) malloc(sizeof(No)); no>valor = v;
if(*lista == NULL){
no>ant = NULL;no>prox = NULL;
}else{
no>prox = *lista;no>ant = NULL;(*lista)>ant = no;
}
*lista = no; }
6
Insere no inicio da lista duplamente ligada
Insere no inicio da lista duplamente ligada
void main() {
No* lista_dl;
lista_dl = NULL;
insere_lista_duplamente_ligada(&lista_dl, 7); imprime_lista_duplamente_ligada(lista_dl);
}
7
Insere no inicio da listaInsere no inicio da lista
lista
6 8 3
\\
X = 7
a
8
Insere no inicio da listaInsere no inicio da lista
lista
6 8 3
\\
X = 7
a
lista
6 8 3
\\
7
\b
9
Insere no inicio da listaInsere no inicio da lista
lista
6 8 3
\\
7
\c
lista
6 8 3
\\
7
\b
10
Insere no inicio da listaInsere no inicio da lista
lista
6 8 3
\\
7
\c
lista
6 8 3\
7
\d
11
Insere no inicio da listaInsere no inicio da lista
lista
6 8 3\
7
\d
6 8 3\
7
\e
lista
12
Lista Duplamente LigadaLista Duplamente Ligada
inicio fim
6 8 3
\\
13
Lista Duplamente LigadaLista Duplamente Ligada
typedef struct no { int valor; struct no* ant; struct no* prox;}No;
typedef struct lista{ No *inicio, *fim;}Lista_dl;
14
Imprime listaImprime lista
void imprime_lista(Lista_dl lista){ No *aux = lista.inicio; while (aux != NULL) { printf("%d ", aux>valor); aux = aux>prox; }
printf("\n");}
15
Inicializa listaInicializa lista
void inicia(Lista_dl *lista){
lista>inicio = lista>fim = NULL;}
16
Inicializa listaInicializa lista
void main() {
Lista_dl lista_dl;
inicia(&lista_dl);
/...
}
19
Insere no início da listaInsere no início da listavoid insere_fim(Lista_dl* lista, int v){
No* no; no = (No*) malloc(sizeof(No)); no>valor = v; no>prox = NULL;
if(lista>inicio == NULL){ no>ant = NULL; lista>inicio = lista>fim = no; }else{
no>ant = lista>fim; (lista>fim)>prox = no; lista>fim = no; }}
20
Insere no fim da listaInsere no fim da lista
void main() {
Lista_dl lista_dl;
inicia(&lista_dl);
insere_fim(&lista_dl, 3);imprime_lista(lista_dl);
/...
}
21
Insere no fim da listaInsere no fim da lista
inicio fim
6 8 3
\\
X = 7
22
Insere no fim da listaInsere no fim da lista
inicio fim
6 8 3
\\
X = 7
inicio fim
6 8 3
\\
X = 7
7\
a
23
Insere no fim da listaInsere no fim da lista
inicio fim
6 8 3
\\
X = 7
7\
a
inicio fim
6 8 3
\\
7\
b
24
Insere no fim da listaInsere no fim da lista
inicio fim
6 8 3
\\
7\
b
inicio fim
6 8 3
\
7\
c
25
Insere no fim da listaInsere no fim da lista
inicio fim
6 8 3
\
7\
c
inicio fim
6 8 3
\
7\
d
28
Remove no fim da listaRemove no fim da listaint remove_fim(Lista_dl *lista) { No *no; int v; if (lista>inicio == NULL) return 1; no = lista>fim; if(lista>inicio == lista>fim)
lista>inicio = lista>fim = NULL; else{ lista>fim = no>ant; (lista>fim)>prox = NULL; } v = no>valor; free(no); return v;}
29
Remove no fim da listaRemove no fim da lista
void main() {
/...
remove_fim(&lista_dl);imprime_lista(lista_dl);
}
30
Remove no fim da listaRemove no fim da lista
inicio fim
6 8 3
\
7\
31
Remove no fim da listaRemove no fim da lista
inicio fim
6 8 3
\
7\
a
inicio fim
6 8 3
\
7\
no
X = 7
32
Remove no fim da listaRemove no fim da lista
inicio fim
6 8 3
\
7\
a
no
X = 7
X = 7
fim
6 8 3
\
7\
b
inicio no
33
Remove no fim da listaRemove no fim da lista
X = 7
fim
6 8 3
\
7\
b
inicio no
X = 7
fim
6 8 3
\\
7\
inicio
c
no
34
Remove no fim da listaRemove no fim da lista
X = 7
fim
6 8 3
\\
7\
inicio
c
no
X = 7
inicio fim
6 8 3
\\
d
35
Lista Duplamente CircularLista Duplamente Circular
lista
6 8 3