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

链表元素删除函数异常及传感器存在性验证功能失效问题

链表操作问题修复:删除函数异常与存在性验证失效

一、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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:05:26