1. Requisitos
2. INTRODUO
3. Definio
4. A construo do prottipo de um
elemento da lista
5. Operaes em listas duplamente
encadeadas
1. Inicializao
2. Insero de um elemento na
lista
1. Insero em uma lista
vazia
2. Insero no incio da lista
3. Insero no fim da lista
4. Insero antes de um
elemento da lista
5. Insero depois de um
elemento da lista
3. Remoo de um elemento da
lista
1. Remoo na lista
4. Exibio da lista
5. Destruio da lista
6. Exemplo completo
1. dlista.h
2. dlista_function.h
3. dlista.c
7. Veja tambm
8. Veja tambm: Retirada de lista
duplamente encadeada em c
Requisitos
Os tipos de dados As estruturas O uso do typedef Os ponteiros As funes do usurio As listas simplesmente encadeadas
(facultativo)
INTRODUO
Este artigo mostrar como fazer as listas duplamente ligadas. A escolha da implementao ser dependente das suas
necessidades e seu desempenho. As listas duplamente encadeadas podem ser usadas quando vrias operaes de
http://br.ccm.net/faq/10254-lista-duplamente-encadeada 1/16
30/06/2017 Lista duplamente encadeada
Definio
As listas duplamente encadeadas so estruturas de dados semelhantes s listas simplesmente encadeadas. A alocao da
memria feita durante a execuo. No entanto, em comparao com as listas simplesmente encadeadas a conexo entre os
elementos feita atravs de dois ponteiros (um que aponta para o elemento anterior, e o outro, para o seguinte). O ponteiro
anterior ao primeiro elemento deve apontar para NULL (o incio da lista). O ponteiro seguinte ao ltimo elemento deve
apontar para NULL (o fim da lista). Para acessar um elemento, a lista pode ser percorrida pelos dois lados: Partindo do alto,
o ponteiro seguinte permite o deslocamento para o elemento seguinte e comeando do final, o ponteiro anterior permite o
deslocamento para o elemento anterior. Em suma, o movimento feito em ambas as direes, do primeiro para o ltimo
elemento e/ou do ltimo para o primeiro.
Para o controle da lista, o melhor salvar certos elementos: o primeiro elemento, o ltimo elemento e o nmero de
elementos. Para tanto, usaremos outra estrutura (isto no obrigatrio, as variveis podem ser usadas). Veja a sua
composio:
O ponteiro inicial ter o endereo do primeiro elemento da lista. O ponteiro fim abrigar o endereo do ltimo elemento da
lista. A varivel tamanho contm o nmero de elementos. Qualquer que seja a posio na lista, os ponteiros de incio e fim
vo indicar, respectivamente, para o primeiro e o ltimo elemento. O tamanho ter o nmero de elementos da lista, seja
qual for a operao efetuada na lista.
Inicializao
Prottipo da funo: void inicializao (Lista *lista); que dever ser feita antes de qualquer outra operao da lista.
A funo inicia o ponteiro de incio e de fim, sempre atravs do ponteiro NULL e do tamanho com o valor 0. A funo
Veja o algoritmo de insero e de backup dos elementos: Declarao dos elementos a serem inseridos Alocao da memria
para o novo elemento Preenchimento do contedo do campo de dados Atualizao dos ponteiros para o elemento anterior e
o elemento seguinte A atualizao dos ponteiros com vistas do primeiro e do ltimo elemento, se necessrio. Caso
particular: em uma lista com apenas um elemento, o primeiro tambm o ltimo. Atualizao do Tamanho lista. Para
adicionar um elemento na lista, existem vrias solues: 1. Insero em uma lista vazia 2. Insero no incio da lista 3.
Insero no fim da lista 4. Insero antes de um elemento 5. Insero depois de um elemento
Prottipo da funo: int ins_na_lista_vazia (dl_Lista * lista, char *dado); A funo volta para -1, no caso de
uma falha, caso contrrio ela retorna 0. Passos: Alocao da memria para o novo elemento Preenchimento do campo de
dados do novo elemento O ponteiro anterior do novo elemento indicar o NULL O ponteiro seguinte do novo elemento
dirigir para NULL Os ponteiros de incio e de fim indicaro para o novo elemento O tamanho atualizado. A funo
Prottipo da funo: int ins_incio_lista (dl_Lista * lista, char *dado); Volta a funo -1 com falha, ela retorna
0. Passos: Alocao da memria para o novo elemento Preenchimento do campo de dados do novo elemento O ponteiro
anterior ao novo elemento aponta para NULL O ponteiro seguinte aponta para o 1 elemento O ponteiro anterior ao 1
elemento indica o novo elemento O ponteiro de incio direciona para o novo elemento O ponteiro de fim no muda O
tamanho incrementado
|300px|] A funo
Prottipo da funo: int ins_fim_lista (dl_Lista * lista, char *dado); A funo volta para -1 no caso de falha, do
contrrio ela retorna 0. Passos: Alocao da memria para o novo elemento Preenchimento do campo de dados do novo
elemento O ponteiro seguinte ao novo elemento aponta para NULL O ponteiro anterior ao novo elemento aponta para o
ltimo elemento ( o ponteiro de fim que contm, por enquanto, o seu endereo) O ponteiro seguinte em relao ao ltimo
elemento indicar o novo elemento O ponteiro de fim aponta para o novo elemento O ponteiro de incio no muda O
tamanho incrementado [Image: http://www.commentcamarche.net/faq/images/0-GkOJj4j7-dl-ins-fim-s-.png|500px|] A
funo
http://br.ccm.net/faq/10254-lista-duplamente-encadeada 3/16
30/06/2017 Lista duplamente encadeada
Prottipo da funo:
A funo aparece novamente -1 se tiver falha, se no for assim ela volta para o 0. A insero ser feita antes de uma certa
posio transformada em argumento para a funo. A posio indicada no deve ser nem o 1 nem o ltimo elemento. Neste
caso, preciso utilizar as funes de insero no incio e/ou fim da lista. Passos: Alocao da memria para o novo
elemento Preenchimento do campo de dados do novo elemento Faa a escolha de uma posio dentro da lista (a insero
ser feita depois da posio escolhida) O ponteiro seguinte ao novo elemento aponta para o elemento em andamento. O
ponteiro anterior ao novo elemento aponta para o endereo no qual aponta o ponteiro anterior do elemento em andamento.
(umaexplicao meio enrolada, esperando que a imagem os ajude a compreender melhor) O ponteiro seguinte ao elemento
que precede o elemento em andamento apontar para o novo elemento O ponteiro anterior ao elemento em andamento ponta
para o novo elemento O ponteiro de fim no muda O ponteiro de incio s muda se a posio escolhida for a posio 1 O
tamanho incrementado de uma unidade
|341px|]
|447px|] A funo
int ins_antes (dl_Lista * lista, char *dado, int pos){ int i; dl_elemento *novo_elemento, *em
andamento; if ((novo_elemento = aloc (novo_elemento)) == NULL) return -1; strcpy
(novo_elemento>dado, dado); em andamento = lista>incio; for (i = 1; i < pos; ++i) em
andamento = em andamento>seguinte; novo_elemento>seguinte = em andamento; novo_elemento> anterior
= em andamento>anterior; if(em andamento>anterior == NULL) lista>incio = novo_elemento;
else em andamento>anterior>seguinte = novo_elemento; em andamento>anterior = novo_elemento;
lista>tamanho++; return 0; }
Prottipo da funo:
Com isso volta -1 no caso de falha, se no for assim ela retorna 0. A insero ser feita aps uma determinada posio
transformada em argumento da funo. A posio indicada no deve ser o ltimo elemento. Neste caso, utilize a funo de
insero no final da lista. Passos: Alocao da memria para o novo elemento Preenchimento do campo de dados do novo
elemento Uma posio na lista deve ser selecionada (a insero ser feita depois da posio escolhida) O ponteiro seguinte
do elemento novo vai apontar para o endereo que aponta o ponteiro seguinte do elemento em andamento (veja a imagem).
O ponteiro anterior ao novo elemento aponta para o elemento em andamento. O ponteiro anterior ao elemento que sucede o
elemento em andamento apontar para o novo elemento O ponteiro seguinte ao elemento em andamento aponta para o novo
elemento O ponteiro de incio no muda O ponteiros de fim s muda se apenas a posio escolhida for a posio do ltimo
elemento (o tamanho da lista) O tamanho incrementado de uma unidade
http://br.ccm.net/faq/10254-lista-duplamente-encadeada 4/16
30/06/2017 Lista duplamente encadeada
A funo
int ins_apres (dl_Lista * lista, char *dado, int pos){ int i; dl_elemento *novo_elemento, *em
andamento; if ((novo_elemento = aloc (novo_elemento)) == NULL) return -1; strcpy
(novo_elemento>dado, dado); em andamento = lista>incio; for (i = 1; i < pos; ++i) em
andamento = em andamento>seguinte; novo_elemento>seguinte = em andamento>seguinte;
novo_elemento>anterior = em andamento; if(em andamento > seguinte == NULL) lista>fim =
novo_elemento; else em andamento >seguinte>anterior = novo_elemento; em andamento >seguinte
= novo_elemento; lista>tamanho++; return 0; }
Veja o algoritmo de remoo de um elemento da lista: Autilizao de um ponteiro temporrio para salvar o endereo dos
elementos a serem removidos O elemento a ser removido pode estar em qualquer posio da lista. Em comparao com a
lista simplesmente encadeada, onde a remoo s pode ser feita depois de um elemento designado, as listas duplamente
encadeadas so mais fceis de manipular, graas aos dois ponteiros que mantm um rastro de antes como do depois. Liberar
a memria ocupada pelo elemento removido Atualizar o tamanho da lista Para remover um elemento da lista existem vrias
solues: 1. Remoo no incio da lista 2. Remoo no fim da lista 3. Remoo antes de um elemento 4. Remoo depois de
um elemento 5. Remoo de um elemento Porm, a remoo no incio e no fim das listas duplamente encadeadas, assim
como antes ou depois de um elemento vem a ser a remoo da posio 0 (zero) ou da posio N (N = nmero de elementos
da lista) ou em outro lugar da lista. No caso das listas duplamente encadeadas, no tem problema remover em qualquer
posio , devido aos ponteiros "anterior" e "seguinte", que mantm a ligao entre os elementos da lista. por isso que
vamos criar uma nica funo. Se quisermos remover o elemento do incio da lista, vamos escolher a posio zero Se
quisermos remover o elemento do fim da lista, vamos escolher a posio N (o nmero de elementos) Se quisermos remover
um elemento qualquer, ento vamos escolher a sua posio na lista
http://br.ccm.net/faq/10254-lista-duplamente-encadeada 5/16
30/06/2017 Lista duplamente encadeada
Remoo na lista
Prottipo da funo:
Esta funo volta a se exibir -1 em caso de falha, ou ela retorna 0. Podemos distinguir vrias situaes: Remoo da posio
1 em uma lista com apenas um elemento Remoo da posio 1 em uma lista com vrios elementos Remoo da ltima
posio (o ltimo elemento) Remoo em outro lugar da lista para uma certa posio A remoo em uma lista vazia no
tem sentido Passos: A posio escolhida 1 (o caso da remoo do 1 elemento da lista) O ponteiro remove elemento
conter o endereo do 1 elemento e o ponteiro de incio integrar o endereo mantido pelo ponteiro seguinte ao 1
elemento que queremos remover (se este ponteiro equivale a NULL ento atualizaremos o ponteiro de fim j que o caso
de uma lista com apenas um elemento, se no, apontaramos o ponteiro "anterior" ao 2 elemento para NULL) A posio
escolhida igual, com o nmero de elementos da lista e o ponteiro remov elemento conter o endereo do ltimo elemento.
Ns apontaremos o ponteiro seguinte ao antepenltimo elemento ( o elemento para o qual aponta o ponteiro anterior ao
ltimo elemento), para NULL Ns atualizaremos o ponteiro de fim. A posio escolhida aleatria na lista. O ponteiro
remov_elemento conter o endereo do elemento a ser removido e o ponteiro seguinte ao elemento que precede o elemento
a ser removido aponta para o endereo mantido pelo ponteiro seguinte ao elemento a ser removido. O ponteiro anterior ao
elemento que sucede o elemento a ser removido aponta para o endereo mantido pelo ponteiro anterior ao elemento a ser
removido e o tamanho da lista ser decrementado de um elemento: A funo
Exibio da lista
Ns podemos, exibindo a lista inteira, nos posicionar no incio ou no fim da lista (o ponteiro de incio ou de fim o
permitir). Depois, utilizando o ponteiro seguinte ou anterior de cada elemento, a lista vai ser varrida do 1 ao ltimo
elemento ou do ltimo ao 1 elemento. o ponteiro seguinte do ltimo elemento que d a condio de parada e que
equivale ao NULL no caso da leitura do incio para o fim da lista, ou pelo ponteiro anterior do 1 elemento que equivale ao
NULL, no caso de uma leitura do fim para o incio da lista. As funes
Destruio da lista
Para destruir a lista inteira, utilizarei a remoo da posio 1 enquanto o tamanho for maior que zero. A funo
http://br.ccm.net/faq/10254-lista-duplamente-encadeada 6/16
30/06/2017 Lista duplamente encadeada
Exemplo completo
dlista.h
dlista_function.h
http://br.ccm.net/faq/10254-lista-duplamente-encadeada 7/16
30/06/2017 Lista duplamente encadeada
/***************************\
dlista.c
http://br.ccm.net/faq/10254-lista-duplamente-encadeada 8/16
30/06/2017 Lista duplamente encadeada
/**********************\
Veja tambm
As listas simplesmente encadeadas As listas circulares As pilhas As filas Lista duplamente encadeada
Recomendado para voc Recomendado por
Veja como fazer uma transformao Eles esto ganhando com estas 5 Cientista revela como ler 6x mais
digital de sucesso aes. Saiba o motivo rpido pode mudar seus resultados
Google Cloud Empiricus Research em provas
Estudo e Memorizao
http://br.ccm.net/faq/10254-lista-duplamente-encadeada 9/16
30/06/2017 Lista duplamente encadeada
Luciana mostra como fugir das Este app da Alemanha para Tem CNPJ? Saiba como reduzir sua
taxas abusivas dos bancos aprender idiomas j tem 1 milho conta de telefonia
Empiricus Research de usurios Celular para Empresas
Babbel
Este documento, intitulado 'Lista duplamente encadeada', est disponvel sob a licena Creative Commons. Voc pode copiar e/ou modificar o contedo
desta pgina com base nas condies estipuladas pela licena. No se esquea de creditar o CCM (br.ccm.net) ao utilizar este artigo.
Recomendado por
http://br.ccm.net/faq/10254-lista-duplamente-encadeada 10/16
30/06/2017 Lista duplamente encadeada
http://br.ccm.net/faq/10254-lista-duplamente-encadeada 11/16
30/06/2017 Lista duplamente encadeada
http://br.ccm.net/faq/10254-lista-duplamente-encadeada 12/16
30/06/2017 Lista duplamente encadeada
http://br.ccm.net/faq/10254-lista-duplamente-encadeada 13/16
30/06/2017 Lista duplamente encadeada
http://br.ccm.net/faq/10254-lista-duplamente-encadeada 14/16
30/06/2017 Lista duplamente encadeada
http://br.ccm.net/faq/10254-lista-duplamente-encadeada 15/16
30/06/2017 Lista duplamente encadeada
http://br.ccm.net/faq/10254-lista-duplamente-encadeada 16/16