#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 定义元素类型
typedef int element;
// 定义链表节点结构体
typedef struct LNode {
element data; // 节点存储的数据
struct LNode* next; // 指向下一个节点的指针
} Lnode, *LinkList;
// 打印链表的函数
void PrintfL(LinkList L) {
static int z = 0; // 静态变量,用于记录打印次数
z++;
// 输出打印链表的信息
printf("========================打印链表%d=========================\n", z);
int i = 1;
// 遍历链表并输出每个节点的信息
while (L) {
printf("第%d个节点:%d\n", i, L->data);
i++;
L = L->next;
}
}
// 创建链表的函数
void CreateL(LinkList& L, int n) {
// p 和 q 用于链表节点的操作
LinkList p = L, q = L;
// 为第一个节点分配内存
p = (LinkList)malloc(sizeof(Lnode));
L = p;
q = L;
// 使用当前时间设置随机数种子
srand(time(NULL));
// 为第一个节点随机赋值
q->data = rand() % 10;
for (int i = 0; i < n; i++) {
// 为后续节点赋值,值比前一个节点大
p->data = rand() % 10 + q->data;
// 为下一个节点分配内存
p->next = (LinkList)malloc(sizeof(Lnode));
q = p;
p = p->next;
}
// 设置链表末尾节点的 next 指针为 NULL
q->next = NULL;
// 打印创建的链表
PrintfL(L);
}
int main() {
LinkList L = NULL; // 初始化为 NULL 表示空链表
// 创建一个包含 8 个节点的链表
CreateL(L, 8);
// 再次打印链表
PrintfL(L);
return 0;
}
- 由于是无头结点链表,在
CreateL
函数中需特别注意链表第一个节点的初始化和内存分配。 srand(time(NULL))
确保每次运行程序时生成的随机数序列不同,增加了数据的多样性。PrintfL
函数中的静态变量z
方便区分不同次的链表打印,使输出更清晰。- 在链表操作过程中,要确保指针的正确使用,避免出现内存访问错误和链表断裂等问题。