Lista duplamente encadeada

1. Lista duplamente encadeada

doom load
doomload

(usa Ubuntu)

Enviado em 02/04/2017 - 12:06h

Bom dia caros colegas, venho mais uma vez recorrer a ajuda de vocês para um problema que eu estou tendo.

Eu estou estudando listas duplamente encadeadas, e estou fazendo as funções e testando.

Eu fiz uma função para remover um elemento se ele for encontrado, até aí funcionou perfeitamente, mas quando eu coloco um elemento que não esta na lista, ele ao invés de sair do loop while e exibir uma mensagem de elemento não encontrado, ele simplesmente da core dumped, eu olhei aqui e não consegui entender o porque, se alguém puder me ajudar por favor. Obrigado.

Segue o código:


//ListaDuplEncad.h

#include <stdio.h>
#include <stdlib.h>

struct no
{
no *ant;
int item;
no *prox;
};

struct TipoLista
{
no *inicio;
no *fim;
};

void Inicializa(TipoLista *lista)
{
lista->inicio = lista->fim = NULL;
}

int Vazia(TipoLista *lista)
{
return (lista->inicio == NULL && lista->fim == NULL);
}


//Insere no fim da lista
void Insere_Fim(int elem, TipoLista *lista)
{
no *novo;
novo = (no *)malloc(sizeof(no));
novo->ant = novo->prox = NULL;
novo->item = elem;
if (Vazia(lista))
{
lista->inicio = novo;
}
else
{
lista->fim->prox = novo;
novo->ant = lista->fim;
}
lista->fim = novo;
}

//Insere o elemento na posição indicada
void Insere_Pos(int elem, int pos, TipoLista *lista)
{
no *novo;
novo = (no *)malloc(sizeof(no));
novo->ant = novo->prox = NULL;
novo->item = elem;
if (pos == 0)
{
novo->prox = lista->inicio;
lista->inicio = novo;
}
else
{
int contador = 0; //contador de posicoes
no *aux, *proximo, *anterior; //declaracao de ponteiros
aux = proximo = anterior = NULL; //no inicio todos são nulos
aux = lista->inicio; //auxiliar aponta para o inicio da fila
while(contador < pos && aux->prox != NULL)
{
contador++;
anterior = aux; //auxiliar passa a ser anterior
aux = aux->prox; //atualiza o endereço do auxiliar para o proximo
proximo = aux->prox; //indica quem vem a frente do auxiliar atualizado
}
if (contador == pos)
{
novo->ant = anterior;
anterior->prox = novo;
novo->prox = aux;
aux->ant = novo;

/*

anterior->prox = novo; //atualiza o prox do anterior para apontar para o novo item
novo->ant = anterior; //aponta para o item anterior
novo->prox = aux; //aponta para o item que entrou na frente
aux->ant = novo; //faz o item da posicao ocupada apontar seu ant para o novo

*/

}
}
}

//Imprime a lista
void Imprime(TipoLista *lista)
{
no *aux;
aux = lista->inicio;
int contador = 0;
while(aux != NULL)
{
printf("pos %d - item %d\n", contador, aux->item);
contador++;
aux = aux->prox;
}
}


//Remove o elemento indicado se houver
void Remove_Elem(int elem, TipoLista *lista)
{
no *aux, *anterior, *proximo;
aux = anterior = proximo = NULL;
aux = lista->inicio;
proximo = aux->prox;
int busca, contador;
busca = contador = 0;

while(aux->item != elem && aux != NULL)
{
anterior = aux;
aux = aux->prox;
proximo = aux->prox;
contador++;
}

if (contador == 0 && busca == 0)
{
lista->inicio = proximo;
proximo->ant == NULL;
busca = 1;
puts("Removido elemento da posicao 0");
getchar();
}
else
if (elem == aux->item && aux->prox == NULL && busca == 0)
{
lista->fim = anterior;
anterior->prox = NULL;
busca = 1;
free(aux);
printf("Removido elemento da posicao %d - Fim da fila alterado\n", contador);
getchar();
}
else
if(aux->item == elem && aux->prox != NULL && busca == 0)
{
anterior->prox = proximo;
proximo->ant = anterior;
busca = 1;
free(aux);
printf("Removido o elemento da posicao %d\n", contador);
getchar();
}

if(busca == 0)
{
puts("Elemento nao encontrado");
getchar();
}
}



Testado da seguinte forma:


//Temp.cpp

#include <stdio.h>
#include <stdlib.h>
#include "ListaDuplEncad.h"

int main()
{
TipoLista lista;
Inicializa(&lista);
Insere_Fim(1, &lista);
Insere_Fim(2, &lista);
Insere_Fim(3, &lista);
Insere_Pos(8, 0, &lista);
Insere_Pos(9, 1, &lista);
Insere_Pos(8, 4, &lista);
if(Vazia(&lista))
{
puts("Lista Vazia");
getchar();
}
else
{
puts("Lista contem itens");
getchar();
}
Imprime(&lista);
Remove_Elem(10, &lista);
Imprime(&lista);

}



  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts