调用insert_start函数后head指针未指向新节点的问题咨询
链表头插函数的逻辑bug分析与修复
问题根源
你的代码存在两个关键问题导致头插功能失效:
- 参数传递错误:
insert_start函数接收的是person*类型的指针参数,C语言中这是值传递——函数内部的point只是main函数里head指针的副本。修改point = newnode只会改变副本的指向,完全不会影响原head的地址。 - 变量名拼写错误:函数里
newnode->nextnode = p;中的p是未定义的变量,应该改为参数名point,否则编译都会报错。
修复方案
方案一:使用指针的指针(推荐)
通过传递head指针的地址(即person**类型),让函数可以直接修改原指针的指向:
#include<stdio.h> #include<stdlib.h> typedef struct person{ int age; struct person* nextnode; }person; void insert_start(person** point, int x); int main(){ person* head = NULL; person p1 = {2, NULL}; person p2 = {5, NULL}; head = &p1; p1.nextnode = &p2; insert_start(&head, 14); // 传入head的地址 printf("%d\n", head->age); // 此时会输出14 return 0; } void insert_start(person** point, int x){ person* newnode = malloc(sizeof(person)); newnode->age = x; newnode->nextnode = *point; // 指向原来的头节点 *point = newnode; // 修改原指针的指向,让它指向新节点 }
方案二:让函数返回新的头指针
通过函数返回值把新的头节点地址传回main函数,重新赋值给head:
#include<stdio.h> #include<stdlib.h> typedef struct person{ int age; struct person* nextnode; }person; person* insert_start(person* point, int x); int main(){ person* head = NULL; person p1 = {2, NULL}; person p2 = {5, NULL}; head = &p1; p1.nextnode = &p2; head = insert_start(head, 14); // 接收返回的新头指针 printf("%d\n", head->age); // 输出14 return 0; } person* insert_start(person* point, int x){ person* newnode = malloc(sizeof(person)); newnode->age = x; newnode->nextnode = point; // 修正变量名错误 return newnode; // 返回新的头节点 }
额外注意事项
- 记得在程序结束时释放
malloc分配的内存,避免内存泄漏。 - 检查
malloc的返回值是否为NULL,防止内存分配失败导致的崩溃。
内容的提问来源于stack exchange,提问作者JOHN BOURAS
相关产品推荐
相关产品推荐

