用于在链表中按升序添加和删除节点的C程序

用于在链表中按升序添加和删除节点的C程序,c,linked-list,C,Linked List,当我执行下面的代码时,我得到了分段错误。 仅当我在数据大于第一个节点项的节点中添加项时,才会出现分段错误 在这段代码中,当我尝试添加20时,我遇到了一个分段错误,因为20大于第一个节点中的项。 为什么会发生这种情况以及如何防止这种错误 代码: #包括 结构节点 { int数据; 结构节点*链接; }; int main() { 结构节点*p; p=零; 加上(&p,10); 添加(p&p,9); 加上(&p,1); 加上(&p,20); 显示器(p); printf(“\n链表中没有元素=%d”

当我执行下面的代码时,我得到了分段错误。 仅当我在数据大于第一个节点项的节点中添加项时,才会出现分段错误

在这段代码中,当我尝试添加20时,我遇到了一个分段错误,因为20大于第一个节点中的项。 为什么会发生这种情况以及如何防止这种错误

代码:
#包括
结构节点
{
int数据;
结构节点*链接;
};
int main()
{
结构节点*p;
p=零;
加上(&p,10);
添加(p&p,9);
加上(&p,1);
加上(&p,20);
显示器(p);
printf(“\n链表中没有元素=%d”,计数(p));
删除(&p,7);
删除(&p,4);
删除(&p,5);
删除(&p,9);
显示器(p);
printf(“\n链表中没有元素=%d”,计数(p));
}
/*将节点添加到升序链表中*/
添加(结构节点**q,整数)
{
结构节点*r,*temp=*q;
r=malloc(sizeof(struct node));
r->data=num;
/*如果列表为空,或者如果要在之前插入新节点*/
if(*q==NULL | |(((*q)->数据)>num))
{
*q=r;
(*q)->链路=温度;
}
其他的
{
/*遍历列表以搜索要插入新节点的位置*/
while(temp!=NULL)
{
如果(临时->数据链接->数据->数值|临时->链接==NULL))
{
r->link=temp->link;
温度->链接=r;
返回;
}
temp=temp->link;/*转到下一个节点*/
}
}       
}
显示(结构节点*q)
{
printf(“\n”);
while(q!=NULL)
{
printf(“%d”,q->data);
q=q->link;
}
}
计数(结构节点*q)
{
int c=0;
while(q!=NULL)
{
q=q->link;
C++;
}
返回c;
}
删除(结构节点**q,整数)
{
结构节点*old,*temp;
温度=*q;
while(temp!=NULL)
{
如果(临时->数据==num)
{
如果(温度==*q)
{
*q=温度->链接;
免费(临时);
返回;
}
其他的
{
旧->链接=临时->链接;
免费(临时);
返回;
}   
}
其他的
{
旧=临时;
温度=温度->链接;
}
}
printf(“\n未找到元素%d”,num);
}
更改行

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

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

这将解决您的问题(它不会尝试从不存在的节点访问数据)

在您的
add
方法中,尝试更改行:

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

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

由于C是布尔表达式,NULL check将在另一个运算符之前计算,并在为true时停止执行。

使用valgrind和/或debugger,您会找到它。猜测作业将要迟到(再次?)。您正在
add()
中取消对NULL指针的引用。看看这个:
temp->link->data
,问问自己当
temp
指向列表中的最后一个元素时会发生什么。你认为
temp=>link
指向什么?lrn2dbgftw。你的代码有太多的特殊情况,把它们处理掉。哎呀,我的答案似乎和Matthieu的一样,在发帖前没有看到。你显然没有复制他的答案,所以不必担心。
if(temp->data <=num && (temp->link == NULL || temp->link->data > num))
if(temp->data <=num && (temp->link->data > num || temp->link == NULL))
if(temp->data <=num && (temp->link == NULL || temp->link->data > num))