一步一步教你从零开始写C语言链表---构建一个链表

一步一步教你从零开始写C语言链表---构建一个链表

版权声明:本文为博主原创文章,如有需要,请注明转载地址:http://blog.csdn.net/morixinguan。若是侵权用于商业用途,请联系博主,否则将追究责任 https://blog.csdn.net/morixinguan/article/details/68951912

为什么要学习链表?

链表主要有以下几大特性:

1、解决数组无法存储多种数据类型的问题。

2、解决数组中,元素个数无法改变的限制(C99的变长数组,C++也有变长数组可以实现)。

3、数组移动元素的过程中,要对元素进行大范围的移动,很耗时间,效率也不高。

先来感性的认识一下链表,我们先来认识下简单的链表:

从这幅图我们得出以下信息:

这个简单链表的构成:

头指针(Header),若干个节点(节点包括了数据域和指针域),最后一个节点要指向空。

实现原理:头指针指向链表的第一个节点,然后第一个节点中的指针指向下一个节点,然后依次指到最后一个节点,这样就构成了一条链表。

接下来看看链表的数据结构:

 
  1. struct list_node

  2. {

  3. int data ; //数据域,用于存储数据

  4. struct list_node *next ; //指针,可以用来访问节点数据,也可以遍历,指向下一个节点

  5. };

那么如何来创建一个链表的一个节点呢?

我们写个程序演示一下:

 
  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <string.h>

  4. struct list_node

  5. {

  6. int data ;

  7. struct list_node *next ;

  8. };

  9.  
  10. typedef struct list_node list_single ;

  11.  
  12. int main(void)

  13. {

  14. list_single *node = NULL ; //1、首先,当然是定义一个头指针

  15. node = (list_single *)malloc(sizeof(list_single)); //2、然后分配内存空间

  16. if(node == NULL){

  17. printf("malloc fair!\n");

  18. }

  19. memset(node,0,sizeof(list_single)); //3、清一下

  20. node->data = 100 ; //4、给链表节点的数据赋值

  21. node->next = NULL ; //5、将链表的指针域指向空

  22. printf("%d\n",node->data);

  23. free(node);

  24. return 0 ;

  25. }

那么,这仅仅只是创建一个链表中的一个节点,为了好看,我们把创建节点封装成函数,以后想创建多少个节点,我们就可以反复调用一个函数来创建,会很方便:

 
  1. list_single *create_list_node(int data)

  2. {

  3. list_single *node = NULL ;

  4. node = (list_single *)malloc(sizeof(list_single));

  5. if(node == NULL){

  6. printf("malloc fair!\n");

  7. }

  8. memset(node,0,sizeof(list_single));

  9. node->data = 100 ;

  10. node->next = NULL ;

  11. return node ;

  12. }

接下来在程序上完成的程序:

 
  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <string.h>

  4. struct list_node

  5. {

  6. int data ;

  7. struct list_node *next ;

  8. };

  9.  
  10. typedef struct list_node list_single ;

  11. list_single *create_list_node(int data)

  12. {

  13. list_single *node = NULL ;

  14. node = (list_single *)malloc(sizeof(list_single));

  15. if(node == NULL){

  16. printf("malloc fair!\n");

  17. }

  18. memset(node,0,sizeof(list_single));

  19. node->data = 100 ;

  20. node->next = NULL ;

  21. return node ;

  22. }

  23. int main(void)

  24. {

  25. int data = 100 ;

  26. list_single *node_ptr = create_list_node(data); //创建一个节点

  27. printf("node_ptr->data=%d\n",node_ptr->data); //打印节点里的数据

  28. printf("node_ptr->next=%d\n",node_ptr->next);

  29. free(node_ptr);

  30. return 0 ;

  31. }

执行结果 :



这样我们就完成一个链表节点的创建了,那么它现在的样子如下图:

链表的结构里,数据存储了100,因为这个链表只有一个节点,所以它的指针域指向了NULL。

猜你喜欢

转载自blog.csdn.net/qq_15063463/article/details/82556206