#include <stdio.h>
#include <stdlib.h>
typedef struct aa
{
int data;
struct aa *next;
} NODE;
NODE *Creatlink(int n, int m)
{
NODE *h = NULL, *p, *s;
int i;
// 创建头节点
p = (NODE *)malloc(sizeof(NODE));
h = p;
p->next = NULL;
// 循环创建n个节点,并将其插入链表
for (i = 1; i <= n; i++)
{
s = (NODE *)malloc(sizeof(NODE));
s->data = rand() % m;
s->next = p->next;
p->next = s;
p = p->next;
}
return h;
}
void outlink(NODE *h)
{
NODE *p;
p = h->next;
printf("\n\nTHE LIST :\n\n HEAD ");
// 遍历链表并打印节点的数据
while (p)
{
printf("->%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
NODE *head;
// 创建链表并打印
head = Creatlink(8, 22);
outlink(head);
getchar();
return 0;
}
逐行解释:
1. `#include <stdio.h>` 和 `#include <stdlib.h>` 是包含标准输入输出库和标准库函数的头文件。
3. `typedef struct aa` 定义了一个结构体类型 `aa`,其中包含一个整型数据 `data` 和一个指向结构体 `aa` 的指针 `next`。
6. `NODE *Creatlink(int n, int m)` 是创建链表的函数,参数 `n` 表示节点数量,参数 `m` 表示节点数据的上限。
9. `NODE *h = NULL, *p, *s;` 定义了三个指向节点的指针变量,`h` 表示链表的头指针,`p` 和 `s` 用于创建新节点。
14. `p = (NODE *)malloc(sizeof(NODE));` 分配了一个节点的内存,并将其地址赋给指针 `p`。
15. `h = p;` 将 `h` 指向头节点,表示链表的头指针。
16. `p->next = NULL;` 将头节点的下一个节点指针置为 `NULL`,表示链表为空。
19-25. 使用循环创建 `n` 个节点,并将其插入链表中。
20. `s = (NODE *)malloc(sizeof(NODE));` 分配新节点的内存,将地址赋给 `s`。
21. `s->data = rand() % m;` 生成一个小于 `m` 的随机数,并将其赋给新节点的 `data` 字段。
22. `s->next = p->next;` 将新节点的 `next` 指针指向 `p` 的下一个节点。
23. `p->next = s;` 将 `p` 的下一个节点指针指向新节点,将新节点插入链表。
24. `p = p->next;` 将 `p` 移动到下一个节点,为下一次循环做准备。
28. `void outlink(NODE *h)` 是打印链表的函数,参数 `h` 表示链表的头指针。
30. `NODE *p; p = h->next;` 定义一个指向节点的指针变量 `p`,并将其指向链表的第一个节点。
32. `printf("\n\nTHE LIST :\n\n HEAD ");` 打印链表的标题。
35-40. 使用循环遍历链表,打印每个节点的数据。
36. `printf("->%d ", p->data);` 打印节点的数据。
37. `p = p->next;` 将 `p` 移动到下一个节点,为下一次循环做准备。
44-52. `int main()` 是主函数。
47. `head = Creatlink(8, 22);` 调用 `Creatlink` 函数创建一个包含 8 个节点,数据上限为 22 的链表,并将返回的头指针赋给 `head`。
49. `outlink(head);` 调用 `outlink` 函数打印链表。
52. `getchar();` 用于暂停程序,等待用户输入。
53. `return 0;` 返回主函数的结束值。