news 2026/7/10 19:29:27

C 语言链表常见 10 大坑位(90% 初学者必踩)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C 语言链表常见 10 大坑位(90% 初学者必踩)

链表本身不难,难的是:指针、内存、边界条件
下面这 10 个坑,基本覆盖初学者 90% 的崩溃现场。

坑 1:忘了给next置 NULL(野指针串链)

错误:

Node* n = malloc(sizeof(Node)); n->data = x; // n->next 未初始化

**后果:**遍历时跑飞、随机崩溃。

正确:

n->next = NULL;

坑 2:把“局部变量地址”当节点返回(悬空指针)

错误:

Node* create(int x) { Node n; // 栈变量 n.data = x; n.next = NULL; return &n; // 返回栈地址:函数结束就失效 }

**正确:**必须malloc

Node* create(int x){ Node* n = malloc(sizeof(Node)); n->data = x; n->next = NULL; return n; }

坑 3:忘了判空就解引用(*head 直接炸)

错误:

Node* cur = head; while (cur->next) { ... } // head 可能是 NULL

正确:

for (Node* cur=head; cur!=NULL; cur=cur->next) { ... }

坑 4:删除节点后继续用它(Use-After-Free)

错误:

free(cur); cur = cur->next; // cur 已释放,还在用

正确:

Node* next = cur->next; free(cur); cur = next;

坑 5:删除头节点没处理(头指针没更新)

**典型 bug:**删值命中第一个节点时,链表“看起来没变”。

正确思路:

  • 如果删的是头:*head = (*head)->next;

坑 6:插入/删除想改 head,却只传了Node* head(改不动)

错误:

void push_front(Node* head, int x) { Node* n = create(x); n->next = head; head = n; // 只改了形参 }

**正确:**传二级指针

void push_front(Node** head, int x){ Node* n = create(x); n->next = *head; *head = n; }

坑 7:遍历条件写错导致漏最后一个节点

错误:

while (cur->next != NULL) { printf("%d", cur->data); cur=cur->next; } // 最后一个没打印

正确:

while (cur != NULL) { ... }

坑 8:尾插没处理空链表(head==NULL)

错误:

Node* cur = head; // head 为 NULL while (cur->next) ...

正确:

if (*head == NULL) { *head = newNode; return; }

坑 9:内存泄漏(忘记 destroy / 只 free 头)

错误:

free(head); // 只释放了头,其余节点泄漏

正确:

while (head) { Node* next=head->next; free(head); head=next; }

坑 10:打印/调试把指针当 int(格式化输出错)

错误:

printf("%d\n", head); // 64位平台会错

正确:

printf("%p\n", (void*)head);

附:一份“安全版本”的链表骨架(建议你直接收藏)

typedef struct Node { int data; struct Node* next; } Node; Node* create_node(int x){ Node* n = (Node*)malloc(sizeof(Node)); if(!n) return NULL; n->data = x; n->next = NULL; return n; } void push_front(Node** head, int x){ Node* n = create_node(x); n->next = *head; *head = n; } void append(Node** head, int x){ Node* n = create_node(x); if(*head == NULL){ *head = n; return; } Node* cur = *head; while(cur->next) cur = cur->next; cur->next = n; } void destroy_list(Node* head){ while(head){ Node* next = head->next; free(head); head = next; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/9 19:38:06

缓存与数据库一致性解决方案深度解析

一、业务场景与挑战1.1 12306余票查询场景在12306系统中,用户需要实时查询列车不同站点、不同座位类型的余票信息。为提升查询性能,我们将余票信息缓存在Redis中。但在用户下单支付时,需要同时更新数据库和缓存中的余票数据。核心挑战&#x…

作者头像 李华
网站建设 2026/7/10 4:30:33

消息队列真仙:我的道念支持最终一致性

瑶池圣地,飞升台。九天罡风如刀,撕扯着白玉砌成的古老平台。万丈雷云在头顶凝聚,电蛇狂舞,酝酿着最后一重、也是最凶险的“九霄寂灭神雷”。台下,瑶池众仙娥、各方观礼道友,皆屏息凝神,目光聚焦…

作者头像 李华
网站建设 2026/7/9 17:57:20

Spring Boot项目推送Gitee全流程(进阶)

对于国内的Java开发者而言,将Spring Boot项目托管到Gitee是一个常见且高效的选择。本文将以IntelliJ IDEA为开发环境,手把手带你完成从项目初始化到代码成功推送的全过程,并澄清关键概念、解释核心命令,助你彻底掌握。 一、核心概…

作者头像 李华
网站建设 2026/7/6 12:23:28

Java毕设项目:基于Springboot大学校园自习室教室座位预约网站设计与实现基于springboot高校自习室预约系统的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/7/10 6:15:37

JAVA打造同城羽馆预约,一键畅享运动

利用 JAVA 开发同城羽毛球馆预约系统,可以结合 高并发处理、实时交互、多端适配 等特性,打造一个 “一键预约、智能匹配、全流程数字化” 的运动服务平台,让用户轻松畅享羽毛球运动的乐趣。以下是具体实现方案与核心功能设计:一、…

作者头像 李华
网站建设 2026/7/8 11:36:44

经验贴 | 科学制定招聘需求与预算:HR 必看的逻辑与实操要点

招聘是企业补充人才、保障发展的核心环节,而科学制定招聘需求与预算则是招聘工作高效落地的前提。不少 HR 在实际工作中会陷入 “需求模糊导致招聘偏差”“预算失控造成资源浪费” 的困境,既影响招聘效率,也难以匹配业务发展诉求。本文结合实…

作者头像 李华