Autor Tópico: Lista encadeada com erro  (Lida 2319 vezes)

Offline Alex_Sigma

  • Usuário Ubuntu
  • *
  • Mensagens: 8
    • Ver perfil
Lista encadeada com erro
« Online: 11 de Setembro de 2012, 18:10 »
Olá, bom eu fiz um código sobre lista simplesmente encadeada para um trabalho da facu, mas infelizmente estou tendo problemas com o erro: segmentation fault, que como já pesquisei refere-se quando tento acessar um local da memória não permitido, o problema é que acho estranho pois tem vezes que o código funciona e outras dá esse erro, eis o código:
Código: [Selecionar]
typedef struct L
{
    int valor;
    struct L *prox;
}LISTA;

LISTA *concatena(LISTA **L1, LISTA **L2)
{
    LISTA *lista3 = NULL; // Declara lista 3
    LISTA *aux1 = *L1;
    LISTA *aux2 = *L2;
    LISTA *ant = NULL;
    int pos = 0;
    if(aux1 == NULL)
    {
        printf("Lista 1 esta vazia!");
        printf("Imprimindo Lista 2: ");
        imprime(L2);
    }
    else if(aux2 == NULL)
    {
        printf("Lista 2 esta vazia!");
        printf("Imprimindo Lista 1: ");
        imprime(L1);
    }
    do
    {
        if(aux2 == NULL)
        {
            insere_meio(pos, aux1->valor, &lista3);
            aux1 = aux1->prox;
        }
        else if(aux1 == NULL && aux2 != NULL)
        {
            insere_meio(pos, aux2->valor, &lista3);
            aux2 = aux2->prox;
        }
        else if(aux1->valor == aux2->valor)
        {
            if(ant == NULL)  // Executa somente uma vez
            {
                insere_meio(pos, aux1->valor, &lista3);
                aux1 = aux1->prox;
                aux2 = aux2->prox;
                ant = lista3;
            }
            else if(aux1->valor == ant->valor && aux2->valor == ant->valor)
            {
                aux1 = aux1->prox;
                aux2 = aux2->prox;
            }
            else
            {
                insere_meio(pos, aux1->valor, &lista3);
                aux1 = aux1->prox;
                aux2 = aux2->prox;
                ant = ant->prox;
            }
        }
        else if(aux1->valor > aux2->valor)
        {
            if(aux2->valor == ant->valor)
            {
                insere_meio(pos, aux1->valor, &lista3);
                aux1 = aux1->prox;
                aux2 = aux2->prox;
            }
            else
            {
                insere_meio(pos, aux2->valor, &lista3);
                aux2 = aux2->prox;
            }
        }
        else
        {
            if(aux1->valor == ant->valor)
            {
                insere_meio(pos, aux2->valor, &lista3);
                aux1 = aux1->prox;
                aux2 = aux2->prox;
            }
            else
            {
                insere_meio(pos, aux1->valor, &lista3);
                aux1 = aux1->prox;
            }
        }
        pos++;
    }while(aux1 != NULL || aux2 != NULL);
    return(lista3);
}

main()
{
      LISTA *lista1 = NULL;
      LISTA *lista2 = NULL;
      LISTA *lista3;
     
      int n1, n2, n3, n4, m1, m2, m3, m4;
      printf("Valor LISTA 01 N1: ");
      scanf("%d", &n1);
     
      printf("Valor LISTA 01 N2: ");
      scanf("%d", &n2);
      printf("Valor LISTA 01 N3: ");
      scanf("%d", &n3);
      printf("Valor LISTA 01 N4: ");
      scanf("%d", &n4);
     
      printf("\nValor LISTA 02 N1: ");
      scanf("%d", &m1);
      printf("Valor LISTA 02 N2: ");
      scanf("%d", &m2);
      printf("Valor LISTA 02 N3: ");
      scanf("%d", &m3);
      printf("Valor LISTA 02 N4: ");
      scanf("%d", &m4);
     
      insere_ordenada(n1, &lista1);
      insere_ordenada(n2, &lista1);
      insere_ordenada(n3, &lista1);
      insere_ordenada(n4, &lista1);
     
      printf("\nLista 1: ");
      imprime(&lista1);
      printf("\nLista 2: ");
     
      insere_ordenada(m1, &lista2);
      insere_ordenada(m2, &lista2);
      insere_ordenada(m3, &lista2);
      insere_ordenada(m4, &lista2);
      imprime(&lista2);
     
      lista3 = concatena(&lista1, &lista2);  // ATENÇÃO!
      printf("\nLista 3: ");
      imprime(&lista3);

      getch();
}

eis o código, não coloquei as outras funções pois elas estão funcionando normalmente, como podem ver na lista que tem o coment "ATENÇÃO!", se eu comentar essa linha a lista 2 é imprimida e dá o erro de segmentação em seguida, mas se eu deixar do jeito q está, o erro de segmentação já acontece depois de imprimir a lista 1, como resolver isso? li em alguns tópicos aqui mesmo[erros parecidos com o meu] pra rodar o programa com debugador, como faz isso? Se alguém souber como resolver isso ajude, pq tá tenso isso .-.

Uso Code::Blocks e Ubuntu 12.04 ^^'

Offline fpissarra

  • Usuário Ubuntu
  • *
  • Mensagens: 246
    • Ver perfil
    • Lost in the e-Jungle
Re: Lista encadeada com erro
« Resposta #1 Online: 11 de Setembro de 2012, 22:32 »
Se seu objetivo é criar uma "lista ordenada", não seria melhor usar uma árvore binária?

Ou isso ai é trabalho de escola?

Offline Alex_Sigma

  • Usuário Ubuntu
  • *
  • Mensagens: 8
    • Ver perfil
Re: Lista encadeada com erro
« Resposta #2 Online: 12 de Setembro de 2012, 00:34 »
sim é um trabalho da faculdade, e é preciso ser feito em lista simplesmente encadeada, e a minha função já recebe duas listas ordenadas, eu tenho que concatenar elas em uma terceira lista, sendo que nesta terceira não pode haver elementos repetidos.