Fórum Ubuntu Linux - PT
19 de Junho de 2013, 12:51 *
Olá, Visitante. Faça o login ou registre-se.
Perdeu o seu e-mail de ativação?

Login com nome de usuário, senha e duração da sessão
Notícias: Sejam todos bem-vindos e fiquem atentos às regras de utilização do fórum e política de privacidade.
 
   Home   Ajuda Regras Pesquisa Login Registre-se  
Anúncios
Páginas: [1]   Ir para o fundo
  Imprimir  
Autor Tópico: Lista encadeada com erro  (Lida 587 vezes)
Alex_Sigma
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 8


Ver Perfil
« em: 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:
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 ^^'
Registrado
fpissarra
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 246



Ver Perfil WWW
« Responder #1 em: 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?
Registrado
Alex_Sigma
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 8


Ver Perfil
« Responder #2 em: 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.
Registrado
Páginas: [1]   Ir para o topo
  Imprimir  
 
Ir para:  

Powered by MySQL Powered by PHP Tema desenvolvido por FaBMak e n3t0
Powered by SMF 1.1.18 | SMF © 2006-2009, Simple Machines
© 2013 Canonical Ltd. Ubuntu e Canonical são marcas registradas da Canonical Ltd.
XHTML 1.0 válido! CSS válido!