MALOUDA-PSA 2024-07-07 13:15 采纳率: 96.7%
浏览 1
已结题

删除链表的前面大半部分

Dayk *p ;
... ...
//这里给p 赋值了
... ...
int p60numbers = AAAALENGTH;
    p = KLineobj->pHead;
    int k = 0;

    if (isum > p60numbers) {
        int nodes_to_remove = isum - p60numbers;

        while (nodes_to_remove > 0 && p != nullptr) {
            p = p->next; // 保存下一个节点的地址
            delete p; // 释放当前节点
            p = p->next; // 移动到下一个节点
            nodes_to_remove--; // 减少待释放的节点数
            
        }

这个代码好像运行有问题,第二次循环到p = p->next; 报错

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-07 13:15
    关注

    引自免费微信小程序:皆我百晓生

    你的代码中存在一个关键的问题,在删除节点后,你直接试图访问下一个节点(p = p->next),但由于已经删除了当前节点(delete p),所以当前节点的next指针可能已经不再有效,这会导致未定义的行为和可能的错误。

    解决此问题的一个正确方法是在删除当前节点之前先保存下一个节点的指针。修改后的代码如下:

    Dayk *p, *nextNode; // 添加一个保存下一个节点的指针变量
    ... ...
    // 这里给p赋值了
    ... ...
    int p60numbers = AAAALENGTH;
        p = KLineobj->pHead;
        int k = 0;
        nextNode = nullptr; // 初始化下一个节点指针为nullptr
    
        if (isum > p60numbers) {
            int nodes_to_remove = isum - p60numbers;
            while (nodes_to_remove > 0 && p != nullptr) {
                nextNode = p->next; // 保存下一个节点的地址,而不是当前节点的下一个节点地址
                delete p; // 删除当前节点前保存下一个节点地址,确保不会访问无效指针
                p = nextNode; // 移动到下一个节点(此时已验证了下一个节点的指针有效)并递减nodes_to_remove的值以处理剩下的节点数量减少的问题。继续删除操作的话请按照类似方式操作,并确保不会再遇到未定义行为。如果您仍然遇到问题或有其他问题要解答,请随时向我提问。
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月15日
  • 已采纳回答 7月7日
  • 创建了问题 7月7日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?