单链表的结构体定义,请查看我的另一篇文章。
C
语言 尾插法插入单链表 ⭐️
【题目】采用尾插法在头指针为
L
处建立一个带头结点的单链表,输入-1
表示结束,结果返回建立的单链表。
/**
* 尾插法创建链表(输入-1终止)
* @return LinkList 返回创建好的链表头指针
*/
LinkList list_TailInsert() {
// 1. 创建头结点(哨兵节点)
LinkList L = (LNode *)malloc(sizeof(LNode)); // 分配头节点内存空间
L->next = NULL; // 初始化头节点的next指针为空,表示空链表
// 2. 初始化尾指针(开始时指向头结点)
LNode *r = L; // r指针用于跟踪链表当前尾节点
int x; // 用于存储用户输入的临时变量
scanf("%d", &x); // 读取第一个输入值
// 3. 尾插法循环插入节点
while(x != -1) { // 当输入不是-1时继续循环
// 3.1 创建新节点
LNode *S = (LNode *)malloc(sizeof(LNode)); // 为新节点分配内存
S->data = x; // 将输入值存入新节点的data域
S->next = NULL; // 新节点的next指针初始化为NULL
// 3.2 尾插法关键操作
r->next = S; // 将新节点链接到当前尾节点后面
r = 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_TailInsert() {
// 1. 创建头结点(哨兵节点)
LinkList L = (LNode *)malloc(sizeof(LNode)); // 动态分配头节点内存
if (!L) { // 检查内存是否分配成功
printf("内存分配失败!\n");
exit(EXIT_FAILURE); // 分配失败则退出程序
}
L->next = NULL; // 初始化头节点的next指针为NULL,表示空链表
// 2. 初始化尾指针(开始时指向头结点)
LNode *r = L; // r指针用于跟踪链表尾部
int x; // 用于存储用户输入的临时变量
printf("请输入数字(输入-1结束): ");
scanf("%d", &x); // 读取第一个输入值
// 3. 尾插法循环插入节点
while (x != -1) { // 当输入不是-1时继续循环
// 3.1 创建新节点
LNode *S = (LNode *)malloc(sizeof(LNode)); // 为新节点分配内存
if (!S) { // 检查内存是否分配成功
printf("内存分配失败!\n");
exit(EXIT_FAILURE); // 分配失败则退出程序
}
S->data = x; // 将输入值存入新节点的data域
S->next = NULL; // 新节点的next指针初始化为NULL
// 3.2 将新节点链接到链表尾部
r->next = S; // 将新节点挂到当前尾节点后面
r = S; // 更新尾指针,使其指向新的尾节点
scanf("%d", &x); // 3.3 读取下一个输入值
}
return L; // 返回链表头指针(包含头结点)
}
/**
* 打印链表
* @param L 链表头指针
*/
void printList(LinkList L) {
LNode *p = L->next; // p指向第一个实际节点(跳过头结点)
while (p) { // 遍历链表直到NULL
printf("%d ", p->data); // 打印当前节点数据
p = p->next; // 移动到下一个节点
}
printf("\n"); // 打印换行
}
int main() {
// 创建链表
LinkList L = list_TailInsert(); // 调用尾插法创建链表
// 打印链表
printf("创建的链表: ");
printList(L); // 调用打印函数
return 0; // 程序正常结束
}
输入/输出示例:
请输入数字(输入-1结束): 1 2 3 -1
创建的链表: 1 2 3 // 节点顺序与输入顺序一致
示例执行流程:
- 输入:
1 2 3 -1
- 1、创建头结点L
- 2、插入1:链表结构 头->1
- 3、插入2:链表结构 头->1->2
- 4、插入3:链表结构 头->1->2->3
- 5、遇到-1结束
- 输出:
1 2 3
(与输入顺序相同)