whyyouhitme_ 2018-04-29 13:16 采纳率: 50%
浏览 525
已采纳

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

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条回答 默认 最新

  • maxos 2018-04-29 14:44
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 数据库一张以时间排好序的表中,找出多次相邻的那些行
  • ¥50 关于DynamoRIO处理多线程程序时候的问题
  • ¥15 kubeadm部署k8s出错
  • ¥15 Abaqus打不开cae文件怎么办?
  • ¥20 双系统开机引导中windows系统消失问题?
  • ¥15 小程序准备上线,软件开发公司需要提供哪些资料给甲方
  • ¥15 关于生产日期批次退货退款,库存回退的问题
  • ¥15 手机应用的时间可以修改吗
  • ¥15 docker 运行OPEN-webui异常
  • ¥15 麒麟系统如何删除光盘刻录痕迹