2013-02-17 69 views
3

我試圖減去兩個連續的節點並將結果放在一個新的節點之前。 但我得到分段錯誤,然後程序停止響應。在減去鏈接列表元素時的分段錯誤

這裏LinkList是一種結構。

void subtract_node(LinkList **p) 
{ 
    LinkList *q,*temp=NULL,*r; 
    int i=0; 
    q=r=*p; 
    temp=(LinkList*)malloc(sizeof(LinkList)); 
    while(q!=NULL) 
    { 
     temp->item=q->next->item-q->item; 
     temp->next=q; 
     if(i==0) 
     { 
      *p=r=temp; 
      r=r->next->next; 
      q=q->next->next; 
     } 
     else 
     { 
      r->next=temp; 
      temp=r; 
      r=r->next->next; 
      q=q->next->next; 
     } 
     printf("%d",i++); 
    } 
} 
+0

要求人們在代碼中發現錯誤不是特別富有成效。您應該使用調試器(或添加打印語句)來隔離問題,然後構造一個[最小測試用例](http://sscce.org)。 – 2013-02-17 18:05:25

+0

你可以給我們結構定義本身而不是寫'這裏LinkList是一個結構.' – 2013-02-17 18:05:57

+0

當你的列表中有奇數個節點時,你認爲在算法的結尾會發生什麼? – WhozCraig 2013-02-17 18:11:22

回答

1

你不能取消引用next指針鏈表沒有先空檢查其內容。具體地,當q->nextNULL這個表達式

q->next->item - q->item 

將失敗。你做檢查q在循環的頭NULL,但你還需要檢查q->next避免碰撞:

while((q!=NULL) && (q->next != NULL)) { 
    ... 
}