You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言链表删除指定名称功能异常:输入不存在名称时误删最后一个节点

C语言链表删除功能问题修复

问题根因

原删除函数的遍历逻辑没有校验是否真的找到匹配姓名,当待删除姓名不存在时,遍历结束后指针会停在链表最后一个节点,后续的删除逻辑会直接误删该节点。除此之外代码还存在多处边界问题:

  • 未判断链表为空的情况,空链表下直接访问temp->next会触发段错误
  • previous指针未初始化,若待删除节点是链表头节点,野指针访问会引发不可预知的错误
  • 函数名remove是C标准库中已定义的函数,重名会引发编译或运行冲突
  • 遍历条件temp->next != NULL会跳过对最后一个节点的姓名匹配校验,就算最后一个节点是待删除目标也无法正常命中

修复后代码

结构体保持不变:

struct node
{
    char name[50];
    struct node *next;
}*node;

修改后的删除函数:

// 更换函数名避免和标准库remove函数冲突
void remove_name(){
   char nameToDelete[50];
   struct node *temp, *previous = NULL;
   int found = 0; // 标记是否找到匹配项
   temp = node;

   // 先判断链表是否为空
   if(temp == NULL){
       printf("当前没有录入任何姓名,无法执行删除操作\n");
       return;
   }

   printf("What is the name you wish to delete?\n");
   scanf("%s", nameToDelete);

   // 遍历所有节点,包括最后一个节点
   for ( ; temp != NULL; temp = temp->next )
   {
      if(strcmp(nameToDelete, temp->name)==0)
      {
         found = 1;
         break;
      }
      previous = temp; // 匹配失败再记录前驱节点,避免匹配到第一个节点时前驱错误
   }

   if(!found){
       printf("未找到姓名为%s的记录,删除失败\n", nameToDelete);
       return;
   }

   if ( previous == NULL ) // 匹配到的是头节点
   {
      node = temp->next;
   }
   else
   {
      previous->next = temp->next;
   }

   free(temp);
   printf("%s was deleted successfully\n", nameToDelete);
}

修复说明

  1. 新增链表空校验,避免空链表下的非法内存访问
  2. 新增found标记位,只有匹配到对应姓名才执行删除逻辑,未匹配直接返回提示
  3. 调整遍历条件为temp != NULL,覆盖所有节点的匹配校验
  4. 初始化previous为NULL,调整前驱节点赋值时机,避免野指针问题
  5. 更换函数名避免和C标准库函数冲突

内容的提问来源于stack exchange,提问作者Thorsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:12:00