whyyouhitme_ 2018-04-29 13:16 采纳率: 57.1%
浏览 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 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料