【C/C++】关于链表插入函数可能的错误

在C语言中,以下两个函数PushFront的意图都是在链表的头部插入一个新的节点,但是它们之间有一个关键的差异,这导致了第二个函数不能正确地工作。

首先,让我们看看第一个函数:

cpp 复制代码
void PushFront(List** ps, int x) {
    List* Newnode = BuyNewNode(x);
    Newnode->next = *ps;
    *ps = Newnode;
}

这个函数正确地执行了以下步骤:

  1. 使用BuyNewNode(x)创建一个新的节点Newnode,其中x是要存储在新节点中的数据。
  2. 将新节点的next指针指向当前链表的头部(即*ps)。
  3. 更新头指针*ps,使其指向新节点Newnode。

这样,新节点就被正确地插入到了链表的头部。

现在,让我们看看第二个函数:

cpp 复制代码
void PushFront(List** ps, int x) {
    List* pps = *ps;
    List* Newnode = BuyNewNode(x);
    Newnode->next = pps;
    pps = Newnode;
}

这个函数的问题在于最后一步。它创建了一个局部变量pps,这个变量是头指针*ps的一个副本。然后,它尝试通过修改pps来更新头指针,但这是不正确的。因为pps只是一个局部变量,它的作用域仅限于这个函数内部。当函数执行完毕后,pps的生命周期就结束了,它对头指针*ps的修改并不会反映到原始的头指针上。

正确的做法是直接通过解引用头指针的指针 (即*ps)来更新头指针,就像第一个函数那样。

因此,第二个函数不会正确地更新链表的头指针,而第一个函数则会。如果你使用第二个函数来尝试在链表头部插入节点,你会发现链表并没有按照预期被更新。

总结来说,第一个PushFront函数是正确的,而第二个则是错误的,因为它试图通过一个局部变量来更新头指针,而这是不可能的。

相关推荐
麻瓜老宋15 分钟前
AI开发C语言应用按步走,表达式计算器calc的第四步,交互式 REPL 模式
c语言·开发语言·atomcode
奶人五毛拉人一块41 分钟前
二分算法以及习题讲解
数据结构·算法·二分
十月的皮皮1 小时前
stm20260719-STM32F103RCT6_HAL库_三人抢答器
c语言·stm32·单片机·嵌入式硬件·stm32cubemx·hal库
Zachery Pole1 小时前
CCF-CSP备战NO.6【栈】
算法·深度优先
LJHclasstore_luo1 小时前
【C++题解】112354.平行时空
数据结构·c++·算法
YYYing.2 小时前
【C++大型项目之高性能服务器框架 (九) 】协议抽象与Http服务器模块
服务器·c++·http·高性能·c/c++·后端框架
梅雅达编程笔记2 小时前
编程启蒙|Scratch 转 Python 系列第10天:问答闯关游戏实战(AI题库管理+随机出题实战)
人工智能·python·游戏·青少年编程
wuyk5552 小时前
53.嵌入式开发中栈溢出的深度解析:从HardFault到解决方案
c语言·stm32·单片机
ch0sen1pm2 小时前
不太懂 atomic?我花了一下午从 freelist 写到 CAS 无锁栈
c++
手写码匠3 小时前
MCP协议从零实现:手写一个完整的 Model Context Protocol 服务器与客户端
开发语言·数据结构