Lista Duplamente Encadeada em C: Implementação Completa
A seguir, apresenta-se uma implementação de lista duplamente encadeada em linguagem C, com funções para inserção, remoção, contagem e impressão de nodos, além de um menu interativo para manipulação da lista.
Código-fonte
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct nodo{
int info;
struct nodo *next;
struct nodo *previous;
}*tlista;
tlista criar_nodo_inicio(tlista h, int valor){
tlista novo;
novo=(tlista)malloc(sizeof(struct nodo));
novo->info= valor;
if(h == NULL){
novo->next= NULL;
novo->previous = NULL;
h= novo;
}else{
novo->next=h;
h->previous = novo;
h = novo;
}
return h;
}
tlista criar_nodo_final(tlista h, int valor){
tlista novo=(tlista)malloc(sizeof(struct nodo));
tlista aux=h;
novo->info=valor;
novo->next= NULL;
novo->previous= NULL;
if(h == NULL){
h=novo;
}else{
while(aux->next != NULL){
aux=aux->next;
}
aux->next= novo;
novo->previous=aux;
}
return h;
}
int tamanho_lista(tlista h){
tlista aux=h;
int count=0;
if(h == NULL){
puts("lista vazia");
}else{
while(aux != NULL){
count++;
aux= aux->next;
}
}
return count;
}
tlista remover_nodo_inicio(tlista h){
tlista lixo;
if(h == NULL){
puts("lista vazia");
}else{
lixo = h;
h = h->next;
h->previous = NULL;
free(lixo);
}
return h;
}
tlista remover_nodo_final(tlista h){
tlista lixo, aux;
aux=h;
if(h == NULL){
puts("lista vazia");
}else if(tamanho_lista(h) == 1){
h= remover_nodo_inicio(h);
}else{
while(aux->next != NULL){
aux = aux->next;
}
lixo = aux;
aux->previous->next=NULL;
free(lixo);
puts("Nodo removido com sucesso");
}
return h;
}
void imprimir_lista(tlista h){
tlista aux=h;
if(aux==NULL){
puts("lista vazia");
}else{
while(aux != NULL){
printf("%d\n",aux->info);
aux=aux->next;
}
}
}
int main(){
tlista h = NULL;
int opcao, valor;
for( ; ; ){
system("cls");
puts("[1]- Criar nodo inicio -");
puts("[2]- Criar nodo final:");
puts("[3]- Tamanho lista");
puts("[4]- Remover nodo inicio:");
puts("[5]- Remover nodo final:");
puts("[6]- Imprimir lista");
puts("[7]- Sair");
printf("opcao: ");
scanf("%d",&opcao);
puts("---------------------------------------");
switch(opcao){
case 1:
puts("Digite um valor a ser inserido para o nodo");
scanf("%d",&valor);
h = criar_nodo_inicio(h, valor);
puts("nodo inserido com sucesso");
break;
case 2:
puts("Digite um valor a ser inserido para o nodo");
scanf("%d",&valor);
h = criar_nodo_final(h, valor);
puts("nodo inserido com sucesso");
getch();
break;
case 3:
printf("%d", tamanho_lista(h));
getch();
break;
case 4:
h = remover_nodo_inicio(h);
puts("nodo removido com sucesso");
getch();
break;
case 5:
h = remover_nodo_final(h);
puts("nodo removido com sucesso");
getch();
break;
case 6:
imprimir_lista(h);
getch();
break;
case 7:
exit(1);
default:
exit(1);
break;
}
}
return 0;
}Observações
- O programa utiliza
system("cls"),getch()econio.h, específicos de ambientes Windows/MS-DOS. - Em
criar_nodo_inicio, o parâmetrohé passado por valor; a atualização da cabeça ocorre através do valor de retorno. - A opção
defaultfoi corrigida (antes escrita comodefaut) e a chamadagetchsem parênteses nos casos 4 e 5 foi corrigida paragetch().