版权声明:本文为博主原创文章,如有需要,请注明转载地址: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 = 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\n",node_ptr->data); //打印节点里的数据
  28.  
    printf("node_ptr->next=%d\n",node_ptr->next);
  29.  
    free(node_ptr);
  30.  
    return 0 ;
  31.  
    }

执行结果 :

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

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

一步一步教你从零开始写C语言链表---构建一个链表的更多相关文章

  1. 使用WPF教你一步一步实现连连看

    使用WPF教你一步一步实现连连看(一) 第一步: 问题,怎样动态的建立一个10*10的grid(布局) for (int i = 0; i < 10; i++){ RowDefinition r ...

  2. Ace教你一步一步做Android新闻客户端(一)

    复制粘贴了那么多博文很不好意思没点自己原创的也说不出去,现在写一篇一步一步教你做安卓新闻客户端,借此机会也是让自己把相关的技术再复习一遍,大神莫笑,专门做给新手看. 手里存了两篇,一个包括软件视图 和 ...

  3. 一步一步教你实现iOS音频频谱动画(一)

    如果你想先看看最终效果再决定看不看文章 -> bilibili 示例代码下载 第二篇:一步一步教你实现iOS音频频谱动画(二) 基于篇幅考虑,本次教程分为两篇文章,本篇文章主要讲述音频播放和频谱 ...

  4. [C#] (原创)一步一步教你自定义控件——01,TrackBar

    一.前言 技术没有先进落后之分,只有合不合适. WinForm有着非常多的优点,在使用WinForm久了之后,难免会觉得WinForm自带的某些控件外观上有些许朴素.或者功能上有些不如意,自然而然便想 ...

  5. 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布

    之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...

  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr

    目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务电 ...

  7. 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理

    状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实 ...

  8. 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权

    Oauth2授权,熟悉微信开发的同学对这个东西应该不陌生吧.当我们的应用系统需要集成第三方授权时一般都会做oauth集成,今天就来看看在Dapr的语境下我们如何仅通过配置无需修改应用程序的方式让第三方 ...

  9. 通过Dapr实现一个简单的基于.net的微服务电商系统(十)——一步一步教你如何撸Dapr之绑定

    如果说Actor是dapr有状态服务的内部体现的话,那绑定应该是dapr对serverless这部分的体现了.我们可以通过绑定极大的扩展应用的能力,甚至未来会成为serverless的基础.最开始接触 ...

随机推荐

  1. fastJson常用方法总结

    1.了解json json就是一串字符串 只不过元素会使用特定的符号标注. {} 双括号表示对象 [] 中括号表示数组 "" 双引号内是属性或值 : 冒号表示后者是前者的值(这个值 ...

  2. HDU 4763 Theme Section(KMP灵活应用)

    Theme Section Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  3. P1036 选数 题解

    题目链接https://www.luogu.org/problemnew/show/P1036 题目描述 已知 nnn 个整数 x1,x2,-,xnx_1,x_2,-,x_nx1​,x2​,-,xn​ ...

  4. Linux 下压缩与解压.zip和.rar

    )对于.zip linux下提供了zip和unzip程序,zip是压缩程序,unzip是解压程序.它们的参数选项很多,可用命令zip -help和unzip -help查看,这里只做简单介绍,举例说明 ...

  5. BeautifulSoup下Unicode乱码解决

    今天在用scrapy爬某个网站的数据,其中DOM解析我用的是BeautifulSoup,速度上没有XPath来得快,不过因为用了习惯了,所以一直用的bs,版本是bs4 不过在爬取过程中遇到了一些问题, ...

  6. Python_自定义模块

    自定义模块例子(web简单框架): 专门处理逻辑的包:处理各种访问需求 数据库的交互:面临各种的查询,删改 ,dba, 配置文件(全局配置文件):列存储数据的地方,HTML代码存储地方 实现: 代码: ...

  7. 关于window.open窗口的resize事件

    jQuery 事件 - resize() 方法 当调整浏览器窗口的大小时,发生 resize 事件. resize() 方法触发 resize 事件,或规定当发生 resize 事件时运行的函数. & ...

  8. maven里面pom文件的各标签介绍

    由于maven在工作中经常使用,但是平时要记的知识点有点多,偶尔回头来看一些东西难免忘记,特此整理一篇笔记,方便大家搜索查询,也方便自己以后查询! 后续碰见其他的标签也会进行更新! maven的pom ...

  9. 043 hive数据同步到mysql

    一:意义 1.意义 如果可以实现这个功能,就可以使用spark代替sqoop,功能程序就实现这个功能. 二:hive操作 1.准备数据 启动hive 否则报错,因为在hive与spark集成的时候,配 ...

  10. bufferedwriter写json文件中文乱码

    需要用writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"utf-8& ...