C语言实现头插法建立单链表(含完整代码与图解)

Ivy
Ivy
发布时间:2026-10-13| 4人浏览过
原创

头插法构建单链表的核心在于将新结点始终插入到当前链表的最前端(头结点之后),这会导致最终链表中数据的存储顺序与输入顺序正好相反。掌握其关键在于理解指针指向更新的先后顺序:必须先让新结点的指针域指向原首元结点,再让头结点的指针域指向新结点,以防止链表断裂。

头插法的基本原理

在单链表中,每个结点包含数据域和指针域。使用头插法时,我们假设已经存在一个带头结点的空链表。所谓“头插”,就是将新生成的结点直接插入到头结点和原来的第一个结点(或NULL)之间。

这种方法的直观结果是:最后输入的数据会出现在链表的头部(紧接头结点),而最先输入的数据会位于链表的尾部。因此,利用头插法建立的单链表,其输出结果往往是逆序的。

核心操作步骤

要将一个新结点 p 插入到头结点 head 的后面,必须严格按照以下逻辑进行指针修改:

  1. 断开旧连接并建立新连接:首先设置新结点 p 的指针域,让它指向原来头结点所指向的结点(即 head->next)。
  2. 更新头结点指向:然后将头结点的指针域修改为指向新结点 p。

这一过程的代码如下:

p->next = head->next; // 第一步:p指向原先的头指针指向的结点
head->next = p;       // 第二步:头指针改为指向新结点p

这一步骤可以通过图示直观展示:

第1步:初始化与准备

  • 目的:构建一个仅带头结点的空链表,作为插入的基础。
  • 动作:申请内存创建头结点,并将其指针域 next 设为 NULL。此时 head->next 为空,表示链表尚未有实际数据。

第2步:循环插入新结点

  • 入口:获取待插入的数据值(如通过循环读取整数)。
  • 动作:
    1. 为新数据申请空间生成结点 p。
    2. 赋值数据域 p->data = n。
    3. 执行关键两步链接(如上所述)。
  • 完成状态:每执行一次循环,链表的有效数据长度加1,且最新数据总是位于最靠近头结点的位置。

执行完上述逻辑后,新增的结点就会稳固地链接在头结点之后:

注意事项与排错

严禁颠倒指针赋值顺序

这是头插法最容易出错的地方。如果你先写 head->next = p;,再写 p->next = head->next;,会发生严重错误:

  1. head->next 变成了 p。
  2. 接着执行 p->next = head->next;,实际上变成了 p->next = p;。

这将导致新结点形成自环,且原本链表中的后续结点全部丢失(内存泄漏),头结点无法正确连接到任何后续有效数据。必须严格遵守先挂后连的原则:先让新结点 p 抓住旧的头指针所指对象,再让头指针松开旧对象去抓 p。

C语言完整实现代码

以下代码展示了完整的头插法建立过程及遍历输出。代码中包含详细的注释,帮助你理解每一步的操作。

#include <stdio.h>
#include <stdlib.h>

// 定义单链表结点结构体
typedef struct Node {
    int data;             // 数据域
    struct Node *next;    // 指针域
} Node;

int main() {
    Node *head, *p;
    int n;

    // 1. 初始化头结点
    head = (Node *)malloc(sizeof(Node));
    if (!head) {
        fprintf(stderr, "Memory allocation failed!\n");
        return 1;
    }
    head->next = NULL; // 初始为空表

    printf("请输入整数,以非整数结束输入:\n");

    // 2. 循环插入新结点
    // 提示:这里使用 while(scanf...) 结构以便处理任意数量的输入
    while (scanf("%d", &n) == 1) {
        // 分配新结点
        p = (Node *)malloc(sizeof(Node));
        if (!p) {
            fprintf(stderr, "Memory allocation failed!\n");
            return 1;
        }
        p->data = n;

        // 头插法核心逻辑
        p->next = head->next; // 新结点指向原首元结点
        head->next = p;       // 头结点指向新结点
    }

    // 3. 遍历并输出链表
    // 注意:由于是头插法,输出顺序与输入顺序相反
    printf("链表中的数据(逆序): \n");
    p = head->next;
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");

    // 建议在实际项目中增加释放链表内存的代码
    free(head); 

    return 0;
}

简要总结

头插法利用头结点作为锚点,通过不断将新结点前置来构建链表。其最大优点是操作简单、无需维护尾指针;主要缺点是得到的是逆序链表。若需要保持原始输入顺序,可结合“尾插法”或使用双向链表。以上就是C语言如何实现头插法建立单链表的详细内容,更多关于数据结构单链表资料的关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。