whyyouhitme_ 2018-04-29 13:16 采纳率: 22.2%
浏览 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条)

报告相同问题?

悬赏问题

  • ¥30 Matlab打开默认名称带有/的光谱数据
  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格