链表初始化时指针没置空,程序直接崩溃
刚学C语言链表的时候,最容易犯的错误就是定义头指针后没初始化。比如写了个 Node* head; 就开始往里面插数据,这时候 head 是个野指针,访问 next 的时候程序分分钟崩给你看。正确的做法是声明的同时赋值为 NULL:
Node* head = NULL;这就像你租房前得先确认房子存在,不能直接往空气里放家具。插入节点时顺序搞反,数据丢了也查不到
在链表头部插入节点时,新手常犯的逻辑错误是先改 head 指针。比如这样写:
new_node->next = head;
head = new_node;
head->next = new_node; // 错了!顺序乱了结果就是新节点的 next 指向了自己,原来的链表还挂在旧地址上,彻底丢了。记住口诀:先接儿子,再当爹。先把 new_node 的 next 指向原 head,再让 head 指向 new_node。遍历链表忘记判空,循环停不下来
写 while 循环遍历链表时,条件只写 p != head 是不行的,尤其是插入操作打乱结构后。一定要用 p != NULL 作为终止条件。不然可能陷入死循环,CPU 直接跑满,风扇狂转,还以为电脑中病毒了。
内存释放不彻底,造成泄漏像漏水的桶
用 malloc 开辟的节点,删的时候必须一个个 free。有人图省事只 free 头节点,后面一串全丢了。正确做法是用临时指针记录下一个节点,再释放当前节点:
while (head != NULL) {
Node* temp = head->next;
free(head);
head = temp;
}这就跟拆快递一样,一层层拆,不能一刀砍下去,不然里头的东西全毁了。调试建议:打印指针地址辅助排查
当链表行为异常时,可以在插入、删除后打印每个节点的地址和 next 值。比如:
printf("Node %d at %p, next %p\n", p->data, p, p->next);通过地址对比,能快速发现是否成环、断链或指向已释放内存。这就像修水管时加个摄像头,哪里堵了看得明明白白。