Simply Chained List in C - Do not compile correctly

Asked

Viewed 60 times

-1

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

typedef struct nodo Nodo;

struct nodo{
  int valor;
  Nodo *proximo;
};

void cria_lista(Nodo **pp_ini, Nodo **pp_fim) {
  *pp_ini = NULL;
  *pp_fim = NULL;
  puts("Lista Criada!");
}

void destroi_lista(Nodo **pp_ini, Nodo **pp_fim) {
  Nodo *nodo_aux;
  nodo_aux = *pp_ini;
  while (nodo_aux) {
    *pp_ini = (*pp_ini)->proximo;
    free(nodo_aux);
    nodo_aux = (*pp_ini);
  }
  *pp_fim = NULL;
}

void imprime_lista_inicio(Nodo *p_ini) {
  Nodo *p = p_ini;
  if (p_ini == NULL) {
    printf("Lista vazia.\n");
    return;
  }
  while (p) {
    printf("Valor do nodo = %d\n", p->valor);
    p = p->proximo;
  }
}

void insere_inicio(Nodo **pp_ini, Nodo **pp_fim, int valor) {
  Nodo *nodo_aux;
  nodo_aux = (Nodo*)malloc(sizeof(Nodo));
  if (nodo_aux) {
    nodo_aux->valor = valor;
    nodo_aux->proximo = *pp_ini;
    if (*pp_ini == NULL) {
      *pp_fim = nodo_aux;
    }
    *pp_ini = nodo_aux;
  }
}

void insere_fim(Nodo **pp_ini, Nodo **pp_fim, int valor) {
  Nodo *nodo_aux;
  nodo_aux = (Nodo*)malloc(sizeof(Nodo));
  if (nodo_aux) {
    nodo_aux->valor = valor;
    nodo_aux->proximo = NULL;
    Nodo *p_fim, *p_ini;
    p_ini = *pp_ini;
    p_fim = *pp_fim;
    if (p_ini == NULL) {
      p_ini = nodo_aux;
      p_fim = nodo_aux;
    }
    else {
      p_fim->proximo = nodo_aux;
      p_fim = nodo_aux;
    }
    *pp_ini = p_ini;
    *pp_fim = p_fim;
  }
}

void remove_inicio(Nodo **pp_ini, Nodo **pp_fim){
    Nodo *nodo_aux;
    if(*pp_ini){
        if(*pp_ini==*pp_fim){
            destroi_lista(pp_fim, pp_fim);
        }else{
            nodo_aux = *pp_ini;
            nodo_aux = nodo_aux->proximo;
            *pp_ini = nodo_aux;
            free(nodo_aux);
        }
    }else{
        printf("Nodo Inexistente");
    }
}

//void remove_fim(Nodo **pp_ini, Nodo **pp_fim){
//    Nodo *nodo_aux, *x;
//    if(*pp_fim){
//        if(*pp_ini == *pp_fim){
//            destroi_lista(pp_fim, pp_fim);
//        }else{
//            x = *pp_ini;
//            while(x){
//                x = x->proximo;
//            }
//        }
//    }
//    else{
//        printf("Nodo Inexistente");
//    }
//}


int main(int argc, char *argv[]) {
    setlocale(LC_ALL, "Portuguese");

Nodo *nodo_inicio, *nodo_fim;

puts("");
puts("1)");
cria_lista(&nodo_inicio, &nodo_fim);

puts("");
puts("2)");
insere_inicio(&nodo_inicio, &nodo_fim, 7);
insere_inicio(&nodo_inicio, &nodo_fim, 6);
insere_inicio(&nodo_inicio, &nodo_fim, 5);
imprime_lista_inicio(nodo_inicio);

puts("");
puts("3)");
imprime_lista_inicio(nodo_inicio);

puts("");
puts("4)");
insere_inicio(&nodo_inicio, &nodo_fim, 4);
imprime_lista_inicio(nodo_inicio);

puts("");
puts("5)");
insere_fim(&nodo_inicio, &nodo_fim, 77);
imprime_lista_inicio(nodo_inicio);

puts("");
puts("6)");
remove_inicio(&nodo_inicio, &nodo_fim);
imprime_lista_inicio(nodo_inicio);

puts("");
puts("7)");
insere_inicio(&nodo_inicio, &nodo_fim, 33);
imprime_lista_inicio(nodo_inicio);

return 0;
}
  • If you remove the last part (7) it compiles normally, I believe the problem is in the remove_start function.

  • paste the error message, usually in the message is shown also the line that gave error...moreover, without the error message it is difficult for anyone to try to help

  • n has error message, it just loops in, printing values non-stop...

  • but the title of your question is "error when compiling"...

  • Okay, now you can help me?

2 answers

0

In remove_start(), the code section below is giving rise to an eternal loop for the subsequent function you are using (start() there at the end of main)

     nodo_aux = *pp_ini;
     nodo_aux = nodo_aux->proximo;
     *pp_ini = nodo_aux;
     free(nodo_aux);

Replace with:

     nodo_aux = (*pp_ini)->proximo;
     free(*pp_ini);
     *pp_ini = nodo_aux;

Your code has other problems and is unnecessarily complex for a simple list, but it looks like exercise for you :)

-1

in the remove_start function, I removed "free(nodo_aux);" and compiled correctly.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.