链表元素删除函数异常及传感器存在性验证功能失效问题
链表操作问题修复:删除函数异常与存在性验证失效
一、suppression_capt函数的问题与修复
你的删除函数存在多处指针逻辑错误,导致删除节点时破坏链表结构,引发其他元素值异常:
核心问题点:
- 指针关联未维护:删除节点时仅修改
precedent指向,未处理双向链表的suivant和precedent指针关联,造成链表断裂 - 野指针访问:节点被
free后仍执行courant=courant->suivant,访问已释放的内存空间 - 初始指针赋值错误:
precedent初始化为courant,删除第一个节点时无法正确更新链表头 - 链表头未更新:若删除的是首个节点,未修改
liste->premier,导致链表头失效
修复后的代码:
void suppression_capt(Liste* liste) { char id_capt_user[10]; Element *courant = liste->premier; Element *precedent = NULL; printf("donner id_capt= "); scanf("%s", id_capt_user); while (courant != NULL) { if (strcmp(courant->capt.id_capt, id_capt_user) == 0) { // 处理前驱节点的后继指针 if (precedent != NULL) { precedent->suivant = courant->suivant; } else { // 删除首个节点时更新链表头 liste->premier = courant->suivant; } // 处理后继节点的前驱指针(双向链表特性) if (courant->suivant != NULL) { courant->suivant->precedent = precedent; } // 临时保存后继节点,避免野指针 Element *temp = courant; courant = courant->suivant; free(temp); printf("Capteur supprimé avec succès!\n"); // 如需删除所有匹配节点可移除break,仅删第一个则保留 break; } else { precedent = courant; courant = courant->suivant; } } if (courant == NULL) { printf("Capteur avec id %s non trouvé!\n", id_capt_user); } printf("\n"); }
关键修复说明:
- 新增
temp指针暂存待删除节点,避免free后访问野指针 - 完整维护双向链表的前后指针关联,防止链表结构损坏
- 单独处理首个节点删除场景,更新链表头指针
- 增加未找到目标节点的提示逻辑
二、传感器存在性验证逻辑的问题与修复
你的验证代码存在初始化缺失、循环逻辑错误,导致无法正常运行:
核心问题点:
- 指针未初始化:直接调用
courant->suivant会触发空指针崩溃 - 循环逻辑错位:首次输入后立即移动
courant,跳过首个节点的检查 - 无边界处理:链表为空或找不到目标时,会进入无限循环或崩溃
修复后的验证逻辑:
void verifier_capteur_existant(Element *premier) { char id_capt_user[10]; Element *courant; int trouve = 0; do { printf("donner id_capt= "); scanf("%s", id_capt_user); // 每次输入后从链表头重新遍历 courant = premier; trouve = 0; while (courant != NULL) { if (strcmp(courant->capt.id_capt, id_capt_user) == 0) { trouve = 1; break; } courant = courant->suivant; } if (!trouve) { printf("Capteur non trouvé! Veuillez réessayer.\n"); } } while (!trouve); printf("Capteur avec id %s existe!\n", id_capt_user); }
关键修复说明:
- 每次输入后从链表头重新遍历,避免指针错位
- 新增
trouve标记位,明确判断是否找到目标 - 处理链表为空或找不到的场景,提示用户重新输入
- 初始化
courant为链表头,避免空指针访问
补充说明
你的结构体定义显示这是双向链表(Element包含suivant和precedent指针),所有链表操作必须同时维护前后指针,否则会导致链表结构损坏,出现数据异常或程序崩溃。
内容的提问来源于stack exchange,提问作者skander
相关产品推荐
相关产品推荐

