链表简介(一)——创建单向动态链表及输出单向链表内容

╰半夏微凉° 2022-10-19 05:31 73阅读 0赞

本系列文章简要介绍链表的相关知识。

本文是系列文章的第一篇,将介绍创建单向动态链表输出单向链表内容的方法,并给出代码示例。

1 概述

链表(linked list)是一个数据的集合,其中每个元素包含下一个元素的地址,即每个元素包含两部分内容:数据(data)和链(link)。数据部分包含可用的信息;链则将数据连在一起,它包含一个指向链表中下一个元素的指针(地址)。

说明:链表中的元素习惯上被称为节点。

链表是动态地进行存储分配的一种数据结构,与数组相比,链表可以根据需要动态地开辟内存单元,并且链表中的节点在内存中是非连续的。

2 创建单向动态链表

下面通过伪代码的形式介绍创建单向动态链表的算法。

  1. 算法:CreateLinkedlist()
  2. 目的:创建单向动态链表
  3. 前提:无
  4. 后续:无
  5. 返回:创建的链表
  6. {
  7. head <- null
  8. node_num <- 0
  9. tail <- new <- malloc(node) // allocate new space
  10. (*new).data <- data
  11. while ((*new).data != 0) // condition of finishing linked list creation
  12. {
  13. node_num <- node_num + 1
  14. if (1 == node_num)
  15. {
  16. head <- new;
  17. }
  18. else
  19. {
  20. (*tail).link <- new // link tail and new
  21. tail <- new // move location of tail to new
  22. }
  23. new <- malloc(node)
  24. (*new).data <- data
  25. }
  26. (*tail).link <- null
  27. return head
  28. }

3 输出单向链表内容

下面通过伪代码的形式介绍输出单向链表内容的算法。

  1. 算法:PrintLinkedlist(list)
  2. 目的:输出单向链表内容
  3. 前提:链表(头指针)
  4. 后续:无
  5. 返回:无
  6. {
  7. walker <- list
  8. while (walker != null)
  9. {
  10. print (*walker).data
  11. walker <- (*walker).link
  12. }
  13. }

4 代码示例

根据上述内容,可以编写创建单向动态链表及输出单向链表内容的代码示例。

代码示例内容如下:

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #define STRUCT_LEN sizeof(struct student)
  4. struct student
  5. {
  6. int stu_num; /* student number */
  7. float stu_score; /* student score */
  8. struct student* next;
  9. };
  10. int main()
  11. {
  12. /* declaration of func */
  13. struct student* create(void);
  14. void print(struct student * list);
  15. struct student* list;
  16. list = create();
  17. print(list);
  18. return 0;
  19. }
  20. /*
  21. * this is the create linked list function.
  22. * when student number is 0, create operation finish.
  23. */
  24. struct student* create(void)
  25. {
  26. struct student* head; /* head pointer name(the name of linked list) */
  27. struct student* tail; /* tail node */
  28. struct student* new; /* new node */
  29. int node_num = 0; /* node numbers of linked list */
  30. head = NULL;
  31. /* allocate a new code space */
  32. tail = new = (struct student*)malloc(STRUCT_LEN);
  33. printf("please input student number and score(delimited by SPACE): \n");
  34. scanf("%d %f", &(*new).stu_num, &(*new).stu_score);
  35. while ((new != NULL) && ((*new).stu_num != 0))
  36. {
  37. /* node number add one */
  38. node_num = node_num + 1;
  39. /* first node */
  40. if (1 == node_num)
  41. {
  42. head = new;
  43. }
  44. else
  45. {
  46. /* let tail point new node, link tail and new */
  47. (*tail).next = new;
  48. /* move location of tail to new node */
  49. tail = new;
  50. }
  51. new = (struct student*)malloc(STRUCT_LEN);
  52. scanf("%d %f", &(*new).stu_num, &(*new).stu_score);
  53. }
  54. (*tail).next = NULL;
  55. return head;
  56. }
  57. /*
  58. * this is the print linked list content function.
  59. */
  60. void print(struct student * list)
  61. {
  62. struct student *walker;
  63. walker = list;
  64. printf("The linked list contents(student number and score) as followed:\n");
  65. printf("[student number] [student score]\n");
  66. while (walker != NULL)
  67. {
  68. printf("%d %-f\n", (*walker).stu_num, (*walker).stu_score);
  69. walker = (*walker).next;
  70. }
  71. return;
  72. }

上述代码的编译及运行结果如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpaXRkYXI_size_16_color_FFFFFF_t_70

说明:

  • 在上述代码示例中,链表存储单元的动态开辟是通过 malloc 函数实现的。malloc 函数原型为“void* malloc(unsigned int size);”,其作用是在内存的动态存储区中分配一个长度为 size 的连续空间。

发表评论

表情:
评论列表 (有 0 条评论,73人围观)

还没有评论,来说两句吧...

相关阅读

    相关 单向

    单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。

    相关 单向

    一:单向链表 单向链表中的节点包含数据域和next指针域。 ![20210306162342140.png][] 单向链表的增删查改代码实现 Hero

    相关 单向动态

    单向动态链表 什么是链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结