You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:12:28