2013-02-17 70 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)) { 
    ... 
}