0

Ajoute un noeud à une liste chaînée ordonnée ascendante

J'ai déjà vu des éléments similaires mais cela ne m'a pas aidé. Alors s'il vous plaît corrigez-moi où je me trompe.Erreur de segmentation

 #include<stdio.h> 
     #include<stdlib.h> 
     struct node 
     { 
      int data; 
      struct node* link; 
     }; 
     struct node* head = NULL; 
     void add(int); 
     void print(); 
     int main() 
     { 
      add(1); print(); 
      add(2); print(); 
      add(5); print(); 
      add(4); print(); 
      add(3); print(); 
     return 0; 
     } 
***/* if list is empty or if new node is to be inserted before the first node*/*** 
     void add(int num) 
     { 
      struct node* temp; 
      temp = head; 
      struct node* newNode = (struct node*)malloc(sizeof(struct node)); 
      newNode->data = num; 
      newNode->link = NULL; 
      if((head == NULL)||(head->data > num)) 
       { 
       newNode->link = head; 
       head = newNode; 
       } 
      else 
       { 
    ***/* traverse the entire linked list to search the position to insert the new node*/*** 
       while(temp!=NULL) 
       { 
       if(temp->data <= num && (temp->link->data > num || temp->link == NULL)) 
        { 
         newNode->link = temp->link; 
         temp->link = newNode; 
         return; 
        } 
        temp= temp->link; 
       } 
       } 
      } 
    ***/*Display the content of the linked list*/***  
      void print() 
     { 
      struct node* temp; 
      temp = head; 
      while(temp!=NULL) 
      { 
       printf("%d", temp->data); 
       temp=temp->link; 
      } 
      printf("\n"); 
     } 

Pendant l'exécution de ce code o/p est:

Segmentation Fault (core dumped)

S'il vous plaît aidez-moi, comment résoudre ce problème

+1

Ce n'est pas la raison de vos problèmes, mais [ne lancez pas la valeur de retour de 'malloc()' dans C] (http://stackoverflow.com/a/605858/28169). – unwind

+0

peut-être vous devriez jeter un oeil ici et comparer les implémentations http://www.thegeekstuff.com/2012/08/c-linked-list-example/ –

+0

@unwind Mais si je n'ai pas utilisé le casting, il donne une erreur. Je l'ai juste fait en voyant votre commentaire et j'ai eu une erreur de suivi. "Invalid conversion from 'void *' en 'node *' – user1745866

Répondre

4

Le coupable est cette ligne:

if(temp->data <= num && (temp->link->data > num || temp->link == NULL)) 

Vous ne vérifiez pas que temp->link n'est pas NULL avant de l'évaluer. Changez-le pour:

if(temp->data <= num && (temp->link == NULL || temp->link->data > num)) 

pour être sûr en profitant de l'évaluation des courts-circuits.