C语言链表问题

本文详细介绍了如何使用C语言定义一个结构体来创建链表,包括创建头节点、插入节点以及遍历并打印链表的过程。
摘要由CSDN通过智能技术生成

#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;` 返回主函数的结束值。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值