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); }
修复说明
- 新增链表空校验,避免空链表下的非法内存访问
- 新增
found标记位,只有匹配到对应姓名才执行删除逻辑,未匹配直接返回提示 - 调整遍历条件为
temp != NULL,覆盖所有节点的匹配校验 - 初始化
previous为NULL,调整前驱节点赋值时机,避免野指针问题 - 更换函数名避免和C标准库函数冲突
内容的提问来源于stack exchange,提问作者Thorsen
相关产品推荐
相关产品推荐

