2017-10-20 7 views
-2

chaque fois que j'exécute cette boucle, j'obtiens une erreur de segmentation dans la deuxième itération de la boucle.Obtention d'une erreur de segmentation dans le tri d'une liste chaînée

node *new,*new1; 

new=(node*) malloc(sizeof(node)); 
new1=(node*) malloc(sizeof(node)); 
new = start->next; 

for(;new->next != NULL;new = new->next) 
{ 
    for(new1=new->next;new1 != NULL;new1=new1->next) 
    { //printf("LOOP\n"); 
     if(new->data > new1->data) 
     { 
      printf("\n Swapping - new:%d and new1:%d\n",new->data,new1->data); 
      temp = (node*) malloc(sizeof(node)); 
      temp1 = (node*) malloc(sizeof(node)); 
      temp1 = new->next; 
      temp = new1->next; 
      new->next = temp; 
      printf("Temp var : %d\n",temp->data); 
      printf("Temp1 var : %d\n",temp1->data); 
      new1->next = new; 

      new1 = new; 
      new = temp1; 
      printf("After swapping , new:%d and new1 : %d\n",new->data,new1->data); 
      //  free(temp); 
      //  free(temp1); 
     } 
    } 
} 

Chaque fois que je lui donne une liste - par ex. 4,1,9,6 il échange seulement 4 et 1, quand c'est l'itération à échanger 9 et 6, il montre et la faute de segmentation.

+4

Je vous recommande de prendre le temps de lire [Comment déboguer des petits programmes] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs /) par Eric Lippert, et apprenez comment utiliser un débogueur pour intercepter des plantages comme celui-ci. Cela va au moins vous aider à localiser où dans votre code le crash se produit. L'étape suivante consiste à parcourir votre code, ligne par ligne, dans un débogueur pour déterminer * pourquoi * cela peut arriver. Il y a très probablement un pointeur que vous ne mettez pas à jour correctement ou qui ne s'initialise pas du tout. –

+0

Probablement sans rapport, mais vous perdez de la mémoire (les deux 'malloc's pour' temp' et 'temp1') – UnholySheep

+2

Parler de pointeurs,' new = start-> next; 'conduira à une * fuite de mémoire *. Vous faites d'abord un nouveau point sur un peu de mémoire, puis vous faites pointer vers un autre * autre * mémoire, perdant le pointeur d'origine. Je vous recommande également de lire [cette vieille question et ses réponses] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc), à propos de la conversion du résultat de 'malloc'. –

Répondre

0

Après l'exécution temp = new1->next;, temp pourrait être NULL si new1 était le dernier noeud de la liste. Alors que temp est NULL, il soulèverait une erreur de segment lorsque vous visitez son domaine dans cette ligne printf("Temp var : %d\n",temp->data);

+0

Juste ce dont j'avais besoin. sais, merci. – Aditya