一步一步教你从零开始写C语言链表---构建一个链表
为什么要学习链表?
链表主要有以下几大特性:
1、解决数组无法存储多种数据类型的问题。
2、解决数组中,元素个数无法改变的限制(C99的变长数组,C++也有变长数组可以实现)。
3、数组移动元素的过程中,要对元素进行大范围的移动,很耗时间,效率也不高。
先来感性的认识一下链表,我们先来认识下简单的链表:
从这幅图我们得出以下信息:
这个简单链表的构成:
头指针(Header),若干个节点(节点包括了数据域和指针域),最后一个节点要指向空。
实现原理:头指针指向链表的第一个节点,然后第一个节点中的指针指向下一个节点,然后依次指到最后一个节点,这样就构成了一条链表。
接下来看看链表的数据结构:
- struct list_node
- {
- int data ; //数据域,用于存储数据
- struct list_node *next ; //指针,可以用来访问节点数据,也可以遍历,指向下一个节点
- };
那么如何来创建一个链表的一个节点呢?
我们写个程序演示一下:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- struct list_node
- {
- int data ;
- struct list_node *next ;
- };
- typedef struct list_node list_single ;
- int main(void)
- {
- list_single *node = NULL ; //1、首先,当然是定义一个头指针
- node = (list_single *)malloc(sizeof(list_single)); //2、然后分配内存空间
- if(node == NULL){
- printf("malloc fair!\n");
- }
- memset(node,0,sizeof(list_single)); //3、清一下
- node->data = 100 ; //4、给链表节点的数据赋值
- node->next = NULL ; //5、将链表的指针域指向空
- printf("%d\n",node->data);
- free(node);
- return 0 ;
- }
那么,这仅仅只是创建一个链表中的一个节点,为了好看,我们把创建节点封装成函数,以后想创建多少个节点,我们就可以反复调用一个函数来创建,会很方便:
- list_single *create_list_node(int data)
- {
- list_single *node = NULL ;
- node = (list_single *)malloc(sizeof(list_single));
- if(node == NULL){
- printf("malloc fair!\n");
- }
- memset(node,0,sizeof(list_single));
- node->data = 100 ;
- node->next = NULL ;
- return node ;
- }
接下来在程序上完成的程序:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- struct list_node
- {
- int data ;
- struct list_node *next ;
- };
- typedef struct list_node list_single ;
- list_single *create_list_node(int data)
- {
- list_single *node = NULL ;
- node = (list_single *)malloc(sizeof(list_single));
- if(node == NULL){
- printf("malloc fair!\n");
- }
- memset(node,0,sizeof(list_single));
- node->data = data;
- node->next = NULL ;
- return node ;
- }
- int main(void)
- {
- int data = 100 ;
- list_single *node_ptr = create_list_node(data); //创建一个节点
- printf("node_ptr->data=%d\n",node_ptr->data); //打印节点里的数据
- printf("node_ptr->next=%d\n",node_ptr->next);
- free(node_ptr);
- return 0 ;
- }
执行结果 :
这样我们就完成一个链表节点的创建了,那么它现在的样子如下图:
链表的结构里,数据存储了100,因为这个链表只有一个节点,所以它的指针域指向了NULL。
一步一步教你从零开始写C语言链表---构建一个链表的更多相关文章
- 使用WPF教你一步一步实现连连看
使用WPF教你一步一步实现连连看(一) 第一步: 问题,怎样动态的建立一个10*10的grid(布局) for (int i = 0; i < 10; i++){ RowDefinition r ...
- Ace教你一步一步做Android新闻客户端(一)
复制粘贴了那么多博文很不好意思没点自己原创的也说不出去,现在写一篇一步一步教你做安卓新闻客户端,借此机会也是让自己把相关的技术再复习一遍,大神莫笑,专门做给新手看. 手里存了两篇,一个包括软件视图 和 ...
- 一步一步教你实现iOS音频频谱动画(一)
如果你想先看看最终效果再决定看不看文章 -> bilibili 示例代码下载 第二篇:一步一步教你实现iOS音频频谱动画(二) 基于篇幅考虑,本次教程分为两篇文章,本篇文章主要讲述音频播放和频谱 ...
- [C#] (原创)一步一步教你自定义控件——01,TrackBar
一.前言 技术没有先进落后之分,只有合不合适. WinForm有着非常多的优点,在使用WinForm久了之后,难免会觉得WinForm自带的某些控件外观上有些许朴素.或者功能上有些不如意,自然而然便想 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布
之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr
目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务电 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理
状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权
Oauth2授权,熟悉微信开发的同学对这个东西应该不陌生吧.当我们的应用系统需要集成第三方授权时一般都会做oauth集成,今天就来看看在Dapr的语境下我们如何仅通过配置无需修改应用程序的方式让第三方 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十)——一步一步教你如何撸Dapr之绑定
如果说Actor是dapr有状态服务的内部体现的话,那绑定应该是dapr对serverless这部分的体现了.我们可以通过绑定极大的扩展应用的能力,甚至未来会成为serverless的基础.最开始接触 ...
随机推荐
- js中匿名函数和回调函数
匿名函数: 通过这种方式定义的函数:(没有名字的函数) 作用:当它不被赋值给变量单独使用的时候 1.将匿名函数作为参数传递给其他函数 2.定义某个匿名函数来执行某些一次性任务 var f = func ...
- ElasticSearch文档及分布式文档存储
1.什么是文档? 文档由索引(_index),类型(_type),唯一标识(_id) 组成,我们为 _index(索引) 分配相关逻辑地址分片,该索引下的数据会根据索引以及类型计算哈希来分配数据存储的 ...
- kafka 备忘
创建topic/usr/local/kafka/bin/kafka-topics.sh --create --zookeeper 127.0.0.1:2181 --partitions 3 --rep ...
- 计算1至n中数字X出现的次数【math】
转自: nailperry 一.1的数目 编程之美上给出的规律: 1. 如果第i位(自右至左,从1开始标号)上的数字为0,则第i位可能出现1的次数由更高位决定(若没有高位,视高位为0),等于更高位数字 ...
- bzoj4520【CQOI2016】K远点对
题解: kd-tree裸题 对每个点维护最近的k个开个堆维护一下
- [转]启动tensorboard
https://vivekcek.wordpress.com/tag/tensorboard-windows/ Visualise Computational Graphs with Tensor ...
- asp.net MVC5为WebAPI添加命名空间的支持
前言 默认情况下,微软提供的MVC框架模板中,WebAPI路由是不支持Namespace参数的.这导致一些比较大型的项目,无法把WebApi分离到单独的类库中. 本文将提供解决该问题的方案. 微软官方 ...
- Apache Tomcat RCE(CVE-2017-12615 )漏洞案例分析
首先搭建tomcat环境: 下载当前项目的版本的tomcat
- ActiveMQ在windows下启动失败解决方案
activemq.xml文件中的 <transportConnectors> <!-- DOS protection, limit concurrent connections to ...
- 使用mini-textbox控件时 不能获取value值
当使用class=“mini-textbox”文本框时 使用document.getElementById('id').value 获得的文本框输入值是‘undefined’而使用正常的input 不 ...