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

为何这段C语言链表头节点删除程序无法输出预期结果?

问题排查与修正:链表头节点删除异常

核心问题分析

你的代码存在两个关键错误,导致删除操作未达到预期:

1. 删除逻辑完全错误

你的链表采用**带头节点(哑节点)**的设计:主函数中head指向的是一个初始化好的空节点(仅作为链表的起始标记),真正存储数据的节点都挂在head->next之后。但FirstNodeDeletion函数却错误地把这个头节点当成了要删除的第一个数据节点:

  • 函数内执行temp = head,把空的头节点赋值给temp,然后head = head->next试图移动头指针,但这只是修改了函数内的局部head副本,主函数中的head完全不受影响。
  • 你free了头节点,导致主函数中的head变成野指针,后续display操作行为未定义,但实际输出仍显示1->NULL,是因为主函数的head还是原来的地址,而你删除的不是存储1的那个数据节点。

2. 传值调用无法修改外部指针

C语言中参数传递是值传递,FirstNodeDeletion(struct node *head)中的head是主函数head的副本,函数内对head的任何赋值都不会同步到主函数。即使你的删除逻辑正确,也无法通过这种方式修改链表的头指针。

修正方案

针对带头节点的链表,我们需要修改FirstNodeDeletion的逻辑,直接操作head->next来删除第一个数据节点;如果要支持不带头节点的场景,才需要传指针的指针。这里基于你现有的带头节点设计,修正代码:

修正后的FirstNodeDeletion函数

void FirstNodeDeletion(struct node *head)
{
    // 检查链表是否为空(头节点之后没有数据节点)
    if (head->next == NULL)
    {
        printf(" There are no node in the list.");
        return;
    }
    
    // 要删除的是第一个数据节点,即head->next
    struct node *temp = head->next;
    // 把头节点指向第二个数据节点
    head->next = temp->next;
    printf("\n Data of node 1 which is being deleted is :  %d\n", temp->data);
    free(temp);  
}

其他潜在问题修正

你的search函数也有逻辑错误:循环条件是p->next != NULL,会漏掉最后一个数据节点的检查,修正为:

int search(struct node *pp,int data)
{
    struct node *p = pp->next; // 从第一个数据节点开始遍历
    
    while(p != NULL){ // 遍历到最后一个节点
        if (p->data == data){
            return 1;
        }
        p = p->next;
    }
    
    return 0;
}

测试验证

输入规模3,元素1、2、3时:

  • 初始display输出:1->2->3->NULL
  • 删除第一个数据节点后,display输出:2->3->NULL,符合预期。

内容的提问来源于stack exchange,提问作者Hari Nivash R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:30:53