请问这个删除节点函数有什么问题,编译链接通过运行崩溃

void elete(void)
{
int i,number;
struct part *cur,*prev;//两个指针,一前一后
printf("Enter part number:");//输入零件编号
scanf("%d",&number);
i=find_part(number);//调用之前的查重函数
if(i>=0){//i>=0代表此零件存在
for(cur=first,prev=NULL;cur!=NULL && cur->number!=number;prev=cur,cur=cur->next)//两个指针跟着向后移动,cur==NULL停,cur->number==number也停
;
}
if(cur==NULL)//到最后节点没找到此编号
printf("Not found");
if(prev==NULL)//删除节点为首节点的特殊情况
first=first->next;
else
prev->next=cur->next;//删除首节点以外节点的情况
free(cur); //释放
}

另外一下是插入零件的函数,插入的时候自动形成链表。是不是插入函数有错?
void insert(void)
{
int i=0,part_number;//struct part temp;
if(num_parts==max_parts){
max_parts+=1;
inventory=realloc(inventory,max_parts
(sizeof(struct part)));
/*if(temp==NULL){
printf("Insufficient memory;?can't add more parts.\n");
return;
}*/
//inventory=temp;
}
printf("Enter part number:");
scanf("%d",&part_number);
if(find_part(part_number)>=0){
printf("Part already exists.\n");
return;
}

inventory[num_parts].number=part_number;
printf("Enter part name:");
read_line(inventory[num_parts].name,NAME_LEN);
printf("Enter quantity on hand:");
scanf("%d",&inventory[num_parts].on_hand);
printf("Enter price:");
scanf("%f",&inventory[num_parts].price);
inventory[num_parts].next=first;
first=inventory;
(num_parts)++;

}

找了半天实在找不到错误了。此为书上习题,在加入elete函数之前是正常运行的。后来书上要求加一个删除函数,可以从数据库中删除零件。

2个回答

你的Delete()函数中有如下问题:
if(cur==NULL)//到最后节点没找到此编号
printf("Not found");
这个printf可以打印,但打印后,就需要return返回,不要再做后面的事了,
(因为你的目标结点都没有找到,就啥事都不用干了。)
应该改成如下:
if(cur==NULL)//到最后节点没找到此编号
{
printf("Not found");
return;
}
你的崩溃也是这个原因,如果cur真的等于空了,你后面又调用了一句:prev->next=cur->next;
cur为空的时候,是不能调用 cur->next 的,这叫“调用空指针”,会崩溃的。

maxos
maxos 回复whyyouhitme_: 从你这个代码片段,我没有看出你有读数据库。而且你的代码片段粘贴的不完整,一般很难帮到你,就连Delete()函数名的首字母都粘贴丢了,想帮到忙,成本很高。你如果把完整代码发出来,并且用“插入代码”的方式粘贴,而不是直接粘贴成文本,会更容易得到帮助。
一年多之前 回复
whyyouhitme_
whyyouhitme_ 可是我运行的时候都是挑数据库中存在的零件编号输入啊。。比如有零件1,2,3,我输入2,就崩
一年多之前 回复

if(cur==NULL)//到最后节点没找到此编号
printf("Not found");
//要么这里加exit(1);--------------------------------------------解决的两种办法-------------------------------
//要么后面的部分加入到else{ }内
if(prev==NULL)//删除节点为首节点的特殊情况
first=first->next;
else
prev->next=cur->next;//删除首节点以外节点的情况

free(cur); //释放
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问

相似问题

4
c语言程序设计-将文件内容赋到一个链表里 然后写一个增加节点的函数 将新增加的节点连到那个链表后面
4
easyui中的tree,有什么方法能拿到选择节点的所有父节点,下有详细
1
mpi在多节点上的运行问题
1
ORACLE 12g双节点遇到的问题
3
写一个删除链表的倒数第n个节点的问题能通过,但是提交答案显示出错
5
区块链节点和区块链有什么关系和区别
2
请问tensorflow或者keras中想在神经网络同一层不同节点中设置不同激活函数该怎么实现?
1
在Autoware 中编译yolo3节点时,发生darknet: ./src/cuda.c:36: check_error: Assertio `0' failed.
1
多节点运行cuda+mpi时报错 cudaEvent报错
3
C# 查找xml文件中指定节点下的子节点集合
0
rabbitmq双节点报错问题问题
1
一个函数可以查询所有的父节点与子节点
1
给出一个n叉树,一个叶子节点值,不用递归,怎样求这个叶子节点的路径?
0
pyechats 树图如何实现点击节点超链接跳转,以及修改鼠标浮动至节点上显示的内容
1
tensorflow如何在每个节点增加阈值判断?
0
PHP DOMDocument如何遍历所有节点并获取name、value(如果有)、attributes(键值对)?
1
链表操作中即使函数传入的是链表指针,若根节点没有改变,链表也会改变?
0
数据结构问题树的双亲表示法查找兄弟节点的时间性能是多少?
1
activiti实现同一节点多人驳回问题
1
k8s集群中flannel给容器提供的ip在master节点上ping不通