Lista Duplamente Encadeada em C: Implementação Completa

Design e Engenharia3,66 KB

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() e conio.h, específicos de ambientes Windows/MS-DOS.
  • Em criar_nodo_inicio, o parâmetro h é passado por valor; a atualização da cabeça ocorre através do valor de retorno.
  • A opção default foi corrigida (antes escrita como defaut) e a chamada getch sem parênteses nos casos 4 e 5 foi corrigida para getch().

Baixar

PDF Word HTML