zoukankan      html  css  js  c++  java
  • 一步一步教你从零开始写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! ");
    18.  
      }
    19.  
      memset(node,0,sizeof(list_single)); //3、清一下
    20.  
      node->data = 100 ; //4、给链表节点的数据赋值
    21.  
      node->next = NULL ; //5、将链表的指针域指向空
    22.  
      printf("%d ",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! ");
    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! ");
    17.  
      }
    18.  
      memset(node,0,sizeof(list_single));
    19.  
      node->data = data;
    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 ",node_ptr->data); //打印节点里的数据
    28.  
      printf("node_ptr->next=%d ",node_ptr->next);
    29.  
      free(node_ptr);
    30.  
      return 0 ;
    31.  
      }

    执行结果 :



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

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

  • 相关阅读:
    Vue基础简介
    Vue基础简介
    django生命周期请求l流程图
    CSRF与auth模块
    cookie与session django中间件
    Django forms组件与钩子函数
    ajax结合sweetalert实现删除按钮动态效果
    ajax数据交互
    如何绕过CDN找源站ip
    IP地址的另一种形式---一种隐藏IP的方法
  • 原文地址:https://www.cnblogs.com/zhouweibaba/p/10153102.html
Copyright © 2011-2022 走看看