Você está na página 1de 6

Lista Duplamente Encadeada em C

Contem todas as funes de uma lista dupla bsica e exemplos das mesmas na funo principal. Ermesom Lourenco Graduando em Cincias da Computao UFG
#include <stdlib.h> #include <stdio.h> typedef int elemento; typedef struct no { elemento valor; struct no* proximo; struct no* anterior; } No; typedef struct lista{ No* inicio; No* fim; int quantidade; } Lista; void erro_lista_vazia(){ printf("Erro: Lista vazia!\n"); exit(1); } void erro_lista_posicao(){ printf("Erro: Posio invlida!\n"); exit(1); }

void lista_inicializar(Lista* l){ l->inicio = NULL; l->fim = NULL; l->quantidade = 0; }

void lista_inserir_inicio(Lista* l, elemento e){

No* aux = malloc(sizeof(No)); aux->valor = e; aux->proximo = l->inicio;

l->inicio=aux; aux->anterior=NULL; l->quantidade++; } elemento lista_remover_inicio(Lista* l){ if (l->inicio == NULL) erro_lista_vazia(); No* aux = l->inicio; l->inicio = aux->proximo; elemento e = aux->valor; free(aux); if(l->inicio != NULL){ l->inicio->anterior = NULL; } l->quantidade--; return e; } elemento lista_inicio(Lista l){ if (l.inicio == NULL) erro_lista_vazia(); No* aux = l.inicio; return aux->valor; } void lista_inserir_fim(Lista* l, elemento e){ No* aux = malloc(sizeof(No)); aux->valor = e; aux->proximo = NULL; if (l->inicio == NULL) l->inicio = aux; else { No* n = l->inicio; while (n->proximo != NULL) n = n->proximo; n->proximo = aux; aux->anterior = n; } l->quantidade++; } elemento lista_remover_fim(Lista* l){

if (l->inicio == NULL) erro_lista_vazia(); No* aux = l->inicio; if (aux->proximo == NULL){ l->inicio = NULL; } else { No* n = l->inicio; aux = n->proximo; while (aux->proximo != NULL){ n = n->proximo; aux = n->proximo; } n->proximo = NULL; }

elemento e = aux->valor; free(aux); l->quantidade--; return e; } elemento lista_fim(Lista l){ if (l.inicio == NULL) erro_lista_vazia(); No* aux = l.fim;

return aux->valor; } void lista_inserir_posicao(Lista* l, int posicao, elemento e){ int qtd = l->quantidade; if ((posicao < 0) || (posicao > qtd)) erro_lista_posicao(); No* aux = malloc(sizeof(No)); aux->valor = e; aux->proximo = NULL; No* n; if (posicao == 0) { aux->proximo = l->inicio; l->inicio = aux;

} else if (posicao == qtd-1){ n = l->fim; n->anterior->proximo = aux; aux->anterior = n->anterior; aux->proximo = n; } else if(posicao <= qtd/2){

n = l->inicio; int c = 0; while (c < posicao - 1){ n = n->proximo; c++; } } else { n = l->fim; int c = qtd; while (c > posicao - 1){ n = n->anterior; c--; } } aux->proximo = n->proximo; n->proximo->anterior = aux; n->proximo = aux; aux->anterior = n; l->quantidade++; }

elemento lista_remover_posicao(Lista* l, int posicao){ if (l->inicio == NULL) erro_lista_vazia(); if ((posicao < 0) || (posicao >= l->quantidade)) erro_lista_posicao(); No* aux; if (posicao == 0) { aux = l->inicio; l->inicio = aux->proximo; l->inicio->anterior = NULL; } else { No* n = l->inicio; aux = n->proximo; int c = 0;

while (c < posicao - 1){ n = n->proximo; aux = n->proximo; c++; } n->proximo = aux->proximo; }

elemento e = aux->valor; free(aux); l->quantidade--; return e; } elemento lista_posicao(Lista l, int posicao){ if (l.inicio == NULL) erro_lista_vazia(); int qtd = l.quantidade; if ((posicao < 0) || (posicao > qtd)) erro_lista_posicao(); No* aux = l.inicio; int c = 0; while(c < posicao){ aux = aux->proximo; c++; } return aux->valor; } void lista_imprimir(Lista l){ No* aux = l.inicio; while(aux != NULL){ printf("%d\n", aux->valor); aux = aux->proximo; } printf("----------------------\n"); } int main() { Lista l; lista_inicializar(&l); lista_inserir_inicio(&l, 101);

lista_imprimir(l); lista_inserir_inicio(&l, 102); lista_imprimir(l); lista_inserir_fim(&l, 103); lista_imprimir(l); lista_inserir_posicao(&l, 0, 104); lista_imprimir(l); lista_remover_fim(&l); lista_imprimir(l); lista_inserir_posicao(&l, 2 , 106); lista_imprimir(l); lista_remover_inicio(&l); lista_imprimir(l); lista_remover_fim(&l); lista_imprimir(l); lista_inserir_posicao(&l, 0, 104); lista_imprimir(l); lista_inserir_posicao(&l, 0, 104); lista_imprimir(l); lista_remover_posicao(&l, 3); lista_imprimir(l); return 0; }