春风吹又生.c 2023-10-09 13:43 采纳率: 54.8%
浏览 5

三个删除代码哪里不同。

(1)(2)(3)这三个删除q结点的方法有什么区别啊
为什么只有(3)是对的
(3)的那个if语句是在判断什么啊?求解。


               
               
               //(1)
               /*
                if (q != NULL)
                {
                    q->prior->next = q->next;
                    q->next->prior = q->prior;
                }
                else
                    q->prior->next = NULL;
                free(q);
                */

               //(2) 
                /*
                temp = q;
                q = q->next;
                temp->prior->next = q;
                q->prior = temp->prior;
                free(temp);
                */
                


                //(3)
               
                temp = q;
                q = q->next;
                temp->prior->next = q;
                if (q != NULL)
                {
                    q->prior = temp->prior;
                }
                free(temp);
  • 写回答

2条回答 默认 最新

  • 老僧& 2023-10-09 14:54
    关注

    这三个方法都是用来删除链表中的节点 q。
    方法 (1):
    这个方法首先检查 q 是否为 NULL,如果不是,它将调整前后节点的指针,然后释放 q。如果 q 是链表的最后一个节点,那么在尝试访问 q->next 时可能会导致问题。这是因为它没有检查 q->next 是否为 NULL。

    方法 (2):
    这个方法似乎有一些问题。它将 q 赋值给 temp,然后将 q 向前移动,最后释放 temp。然而,这个方法中并没有检查 q 是否为 NULL,因此在 q 是最后一个节点时可能导致问题。

    方法 (3):
    这个方法与方法 (2) 非常相似,但它在释放 temp 之前检查了 q 是否为 NULL。这是一个很重要的检查,因为它避免了在访问 q->prior 或 q->prior->next 时出现问题,如果 q 是最后一个节点,这些指针可能为 NULL。

    为什么只有方法 (3) 是正确的呢?因为它在删除节点之前检查了 q 是否为 NULL,并且在访问与 q 相关的指针之前进行了有效性检查,避免了潜在的问题。方法 (1) 和方法 (2) 在这方面都存在潜在的问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月9日

悬赏问题

  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥15 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
  • ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?