2011-10-27 83 views
0

我有一個函數,它應該採取兩個鏈表並將它們放在一起。C兩個鏈表添加並排序

void Append(struct node** aRef, struct node** bRef){ 
    struct node* first = *aRef; 
    struct node* second = *bRef; 
    struct node* temp = NULL; 

    while(first != NULL || second != NULL){ 
      Push(&temp, first->data); 
      Push(&temp, second->data); 
      first = first->next; 
      second = second->next; 
    } 

    *aRef = temp; 
    DeleteList(&second); 
} 

我想對它進行排序,但我不斷收到分段錯誤,當我更換這個while循環:

while(first != NULL || second != NULL){ 
     if(first->data < second->data){ 
      Push(&temp, first->data); 
      first = first->next; 
     } 
     else{ 
      Push(&temp, second->data); 
      second = second->next; 
     } 
} 

的推送()函數只是增加了一些數據到結構節點:

void Push(struct node** headRef, int data){ 
    struct node* new = malloc(sizeof(struct node)); 
    new->data = data; 
    new->next = *headRef; 
    *headRef = new; 
} 

struct node{ 
    int data; 
    struct node* next; 
}; 
+0

我剛剛意識到這將不會完全排序列表 –

回答

2

這可以解決您的問題。因爲如果你沒有測試兩者,你不能執行第一次比較。

while(first != NULL || second != NULL){ 
     if((first != NULL && second != NULL && first->data < second->data) || (first != NULL && second == NULL)){ 
      Push(&temp, first->data); 
      first = first->next; 
     } 
     else if (second != NULL) { 
      Push(&temp, second->data); 
      second = second->next; 
     } 
} 
+0

啊,好吧謝謝。我應該聽取老師的意見並編寫測試計劃 –

0
while(first != NULL || second != NULL){ 

這將保持迭代,只要他們中任何一個!= NULL,所以要麼你必須改變你的條件&&while體內檢查,如果其中一方是NULL

0

由於您要單獨移動到next節點,因此其中一個節點在算法結束之前達到NULL。當發生這種情況時,您的if條件崩潰,因爲您嘗試訪問data屬性NULL