[c] _ c中的单链表与文件读写
我们知道,在c语言中,有基本数据类型,自定义类型和数组..其中数组用来存储同类型数据的集合.但是数组确是十分不方便的,数组的大小在定义时要事先给出.编译系统会更具数组元素类型和数组元素的大小静态的分配一片连续的内存空间.这片内存空间却不能在程序执行过程中进行调整.所以我们常常以最大需求来定义数组.这样会导致内存空间的浪费或空间不足的尴尬.
所以,为了达到动态内存分配的目的,存储同种类型数据的集合.链表的形式出现了.链表将连续的和非连续的内存空间联系起来(指针域或者地址域).基本思路就是: 在存放当前数据的时候,顺便存储下一条数据的首地址 这样就实现了将各个不连续的数据串成"链".如此,就可实现把不同的数据存放在非连续或者连续的内存区域.
单链表的每个数据由两部分组成, 数据域以及指针域(地址域),数据域用来存放各种数据,指针域用来指向下一条数据 .当然,一张单链表必须具备一个头指针才能让我们找到他们,所以通常的,我们都会为链表添加一个头指针来指向链表的开始,也就是头结点.头指针抛去了数据域,只存放头指针的地址,只是起到指向的作用,这一点,在数组,字符数组中就有体现,他们在c语言中的读取与操作都是通过其首地址实现的.我们在使用调试的时候就会发现,他们的首个数据是带有一个地址信息的.
c语言中链表是用结构体来实现的.我们知道,c语言不像高级语言,不支持面向对象,可以自定义类和对象,而是直接通过结构体来定义自定义类型,C语言通过这种方式来描述众多的复杂类型数据.解决实际问题的.
我们知道c语言中是使用指针变量来存放一种类型数据的首地址的,所以这里单链表的结构体定义,有点类似与递归的定义,在结构体中定义一个结构体指针变量,来指向下一个结构体指针的首地址.
很容易理解,根据链表的概念,我们可以看出单链表与双链表的最根本的区别就是,双链表使用了两个指针域分别用来指向了前一个数据,和后一个数据.双链表的出现是显而易见的.使用单链表的时候,我们只能向下索取,而不能向上索取,只能通过循环遍历来获取对应位置的数据,这无疑是十分不方便的,所以双链表出现了.这使得我们在操作一个双链表数据的时候非常的方便.
当然,这里只是简单的了解下双链表,比较在使用上还是单链表较为常用.特别对于c语言来说,初学链表.以单链表为切入点,更加容易.也能够提高你对双链表的理解.毕竟它们原理类似.
在本章,只结合结构体,单链表,文件读取,总结下单链表在c语言中的使用,和单链表结合文件存取的使用.如何将链表式数据保存到文件中,如何从文件中读取单链表数据. 基于这几点,了解通透了的话,基本就可以解决绝大部分基于文件操作的控制台信息管理系统的程序设计了.
单链表的使用最基本,最常用的无非就是初始化,增删改查,求表长,销毁等操作.
需要注意的是单链表的单向访问性,注定了对单链表子节点的访问必须从头开始.
相当于创建一个空节点(数据域为空,指针域也为空).
初始化了一个带头指针(H)的空的头结点.
我们根据单链表的性质.插入只需要三步,创建一个新节点.将插入前一个节点指向新节点,将新节点的指针域指向后一个节点.
当然,如果你想把功能写全,还可以设计查找函数,匹配函数.等等.这些同样,都是基于链表的遍历的.只要你理解了链表的遍历,相信这些函数你都可以很轻松的实现.
文件读写的详细操作和原理,流程.都将在另一篇中进行总结.本篇只总结其中两种最常用的,基于数据块(也就是结构体,数组,等)两种读写方式:
主函数:
结果:
2019.12.25
16:00