Seu Ip é

sexta-feira, 23 de julho de 2010

Lista Duplamente Encadeada em C

#include "stdio.h"

/*Objetivo: criação de uma lista duplamente encadeada e fazer operações de pesquisa, remoção e listagem de elementos*/

typedef struct nodo
{ int info;
struct nodo *prox;
struct nodo *ant;
} T_lista;

typedef struct cab_lista
{ struct nodo *inicio;
struct nodo *fim;
int qtd;
} T_cabeca;
T_cabeca *cabeca;

void inserir(int n);
T_lista *obtem_endereco();
int pesquisa(int n);
void remover(int n);
void mostra();
T_cabeca *ini_cabeca();

main()
{ int n;
char opcao;
cabeca= ini_cabeca();
do
{ printf("\n (I)ncluir (E)xcluir (C)onsultar (F)inalisar : ");
scanf("%c",&opcao);
if ((opcao != 'f') && (opcao != 'F'))
{ printf("\n Entre com a informacao : ");
scanf("%d",&n);
if ((opcao == 'i') || (opcao == 'I'))
{ inserir(n);
}
else if ((opcao == 'e') || (opcao == 'E'))
{ remover(n);
}
else if ((opcao == 'c') || (opcao == 'C'))
{ if (consulta(n) != -1)
printf("\n Elemento Encontrado");
else
printf("\n Elemento Nao Encontrado");
getchar();
getchar();
}
mostra();
}
} while ((opcao != 'f') && (opcao != 'F'));
}

T_cabeca *ini_cabeca()
{ cabeca=(T_cabeca *) malloc(sizeof(struct cab_lista));
if (cabeca == NULL)
{ printf("\n Memória insuficiente para alocar estrutura");
exit(1);
}
cabeca->inicio=NULL;
cabeca->fim=NULL;
cabeca->qtd=0;
return cabeca;
}

T_lista *obtem_endereco()
{ T_lista *novo;
novo=(T_lista *) malloc(sizeof(struct nodo));
if (novo == NULL)
{ printf("\n Memória insuficiente para alocar estrutura");
exit(1);
}
return(novo);
}

void mostra()
{ T_lista *aux = cabeca->inicio;
printf("\n Dados atuais da lista \n");
while (aux != NULL)
{ printf("\n %d",aux->info);
aux=aux->prox;
}
getchar();
getchar();
}

int consulta(int n)
{ T_lista *atual = cabeca->fim;
while ((atual != NULL) && (atual->info != n))
atual = atual->ant;
if (atual == NULL)
return -1; // indica pesquisa mal sucedida
else
return atual->info; // indica pesquisa bem sucedida
}

void inserir(int n)
{ T_lista *novo = obtem_endereco();
T_lista *atual, *aux;
if (cabeca->inicio == NULL) // inserção no início da lista
{ cabeca->fim = novo;
cabeca->inicio = novo;
novo->prox=NULL;
novo->ant=NULL;
}
else
{ atual = cabeca->inicio;
aux = cabeca->inicio;
while ((atual != NULL) && (atual->info < n))
{ aux = atual;
atual=atual->prox;
}
if ((atual != NULL) && (atual->info == n)) // informação já existe
{ printf("\n Elemento ja existente");
return;
}
else if (atual == cabeca->inicio) // antes do 1º
{ novo->prox=cabeca->inicio;
atual->ant=novo;
cabeca->inicio = novo;
}
else if (atual == NULL) // no final
{ novo->prox = NULL;
novo->ant = aux;
cabeca->fim->prox = novo;
cabeca->fim = novo;
}
else // no meio
{ novo->prox = atual;
novo->ant = aux;
aux->prox = novo;
atual->ant = novo;
}
}
cabeca->qtd++;
novo->info=n;
}

void remover(int n)
{ T_lista *atual=cabeca->inicio;
T_lista *anterior, *posterior;
while ((atual != NULL) && (atual->info != n))
atual=atual->prox;
if (atual == NULL) // não encontrou o elemento
{ printf("\n Elemento ja existente");
return;
}
if (atual == cabeca->inicio) // rem do 1º da lista
{ cabeca->inicio=atual->prox;
if (atual == cabeca->fim) // rem. do único
cabeca->fim=NULL;
else // atualiza o novo início
cabeca->inicio->ant=NULL;
}
else if (atual == cabeca->fim) // rem. do último
{ cabeca->fim=cabeca->fim->ant;
cabeca->fim->prox=NULL;
}
else // rem. no meio da lista
{ anterior=atual->ant;
posterior=atual->prox;
anterior->prox=posterior;
posterior->ant=anterior;
}
cabeca->qtd--;
}

Nenhum comentário:

Página Anterior Próxima Página Home