建设网站一般要多钱大学生网页设计主题
单链表的结构体定义,请查看我的另一篇文章。
C
语言 头插法插入单链表 ⭐️
【题目】采用头插法在头指针为
L
处建立一个带头结点的单链表,输入-1
表示结束,结果返回建立的单链表。
/*** 头插法创建链表(输入-1终止)* @return 返回创建好的链表头指针*/
LinkList List_HeadInsert() {// 1. 创建头结点LinkList L = (LNode *)malloc(sizeof(LNode)); // 动态分配头节点内存空间L -> next = NULL; // 初始化头节点的next指针为NULLint x; // 用于存储用户输入的临时变量scanf("%d", &x); // 2. 读取第一个输入值// 3. 头插法循环插入节点while(x != -1) { // 当输入不是-1时继续循环// 3.1 创建新节点LNode *S = (LNode *)malloc(sizeof(LNode)); // 为新节点分配内存S -> data = x; // 将输入值存入新节点的data域// 3.2 头插法关键操作S -> next = L -> next; // 新节点指向原首节点(头结点的next)L -> next = S; // 头结点指向新节点(完成插入)scanf("%d", &x); // 3.3 读取下一个输入值}return L; // 4. 返回链表头指针
}
完整代码: 👇🏻
#include <stdio.h>
#include <stdlib.h> // 包含malloc和exit函数// 定义链表节点结构
typedef struct LNode {int data; // 节点数据域struct LNode *next; // 指向下一个节点的指针
} LNode, *LinkList; // LNode是节点类型,LinkList是指向节点的指针类型/*** 头插法创建链表(输入-1终止)* @return 返回创建好的链表头指针*/
LinkList List_HeadInsert() {// 创建头结点(哨兵节点)LinkList L = (LNode*)malloc(sizeof(LNode)); // 分配头节点内存if (!L) exit(EXIT_FAILURE); // 内存分配失败则退出程序L->next = NULL; // 初始化头节点的next指针为NULLint x; // 用于存储用户输入的临时变量printf("输入数字(-1结束): ");scanf("%d", &x); // 读取第一个输入值// 处理直接输入-1的情况if (x == -1) {free(L); // 释放刚创建的头节点return NULL; // 返回空链表}// 头插法插入节点while (x != -1) { // 当输入不是-1时循环LNode *s = (LNode*)malloc(sizeof(LNode)); // 创建新节点if (!s) exit(EXIT_FAILURE); // 内存分配失败处理s->data = x; // 将输入值存入新节点s->next = L->next; // 新节点指向原首节点(头插法关键步骤)L->next = s; // 头结点指向新节点(完成插入)scanf("%d", &x); // 读取下一个输入值}return L; // 返回链表头指针
}int main() {// 创建链表LinkList L = List_HeadInsert();// 打印链表LNode *p = L ? L->next : NULL; // p指向第一个实际节点(跳过头结点)while (p) { // 遍历链表直到NULLprintf("%d ", p->data); // 打印当前节点数据p = p->next; // 移动到下一个节点}return 0;
}
输入/输出示例:
输入数字(-1结束): 3 5 2 -1
输出: 2 5 3 // 头插法导致逆序
示例执行流程:
- 输入:
3 5 2 -1
- 1、创建头结点
- 2、插入3:链表 头->3
- 3、插入5:链表 头->5->3
- 4、插入2:链表 头->2->5->3
- 5、遇到-1结束
- 输出:
2 5 3
(与输入顺序相反)