0

將節點添加到升序鏈接列表

我在這裏看到了一些類似的東西,但沒有幫助我。所以請糾正我,無論我錯了。分段錯誤

 #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"); 
     } 

在運行該代碼O/P是:

分段錯誤(核心轉儲)

請大家幫幫我,怎麼解決這個問題

+1

不是您的問題的原因,但[請不要在C](http://stackoverflow.com/a/605858/28169)中投射'malloc()'的返回值。 – unwind

+0

也許你應該看看這裏,並比較實施http://www.thegeekstuff.com/2012/08/c-linked-list-example/ –

+0

@unwind但如果我沒有使用鑄造它會給出錯誤。我剛剛看到您的評論,並得到以下錯誤。 「無效轉換從'void *'到'node *' – user1745866

回答

4

罪魁禍首是這一行:

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

你是不是檢查temp->link不是NULL評估之前。將其更改爲:

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

通過利用短路評估使其安全。