学习到链表的小伙伴可以看看了

  1. 链表的概念链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的访问往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。链表允许插入和移除表上任意位置上的结点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。
  2. 链表的分类 2.1 按存储结构分类按照存储结构进行分类可以分为顺序存储结构和链式存储结构,与之对应采用不同存储结构创建的链表可以称为静态链表和动态链表。2.1.1静态链表静态链表是用类似于数组方法实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配地址空间大小。顺序存储结构的主要优点是节省存储空间,因为分配给数据的存储单元全用存放结点的数据(不考虑c/c++语言中数组需指定大小的情况),结点之间的逻辑关系没有占用额外的存储空间。采用这种方法时,可实现对结点的随机存取,即每一个结点对应一个序号,由该序号可以直接计算出来结点的存储地址。但顺序存储方法的主要缺点是不便于修改,对结点的插入、删除运算时,可能要移动一系列的结点。所以静态链表的初始长度一般是固定的,在做插入和删除操作时需要移动元素,2.1.2动态链表到目前为止,凡是遇到处理“批量”数据时,我们都是利用数组来存储。定义数组必须(显式的或隐含的)指明元素的个数,从而也就限定了一个数组中存放的数据量。在实际应用中,一个程序在每次运行时要处理的数据的数目通常并不确定。如果数组定义的小了,就没有足够的空间存放数据,定义大了又浪费存储空间。对于这种情况,如果能在程序执行过程中,根据需要随时开辟存储空间,不需要时再随时释放,就能比较合理的使用存储空间。C 语言的动态存储分配提供了这种可能性。每次动态分配的存储单元,其地址不一定是连续的,而所需处理的批量数据往往是一个整体,各数据之间存在着接序关系。链表的每个节点中,除了要有存放数据本身的数据域外,至少还需要有一个指针域,用它来存放下一个节点元素的地址,以便通过这些指针把各节点连接起来。由于链表每个存储单元都由动态存储分配获得,故称这样的链表为“动态链表”。所以链表的顺序表示(数组结构)优点的是随机存取表中的任意元素,但是在做插入或删除操作时,需移动大量元素。而链表的链式表示,在随机插入元素时没有顺序表示的缺陷,但同时不能对元素进行随机存取。 2.2 按链表的实现分类从链表的实现方式可以把链表分为单向链表,循环链表,双向链表。2.2.1单向链表单向链表它包含两个域,一个数据域和一个指针域,链表中的结点的指向只能是前一个结点指向链表中的下一个结点,链表中的最后一个节点为空,元素之间不能相互指向也是一种线性链表。,如图12.1就是一种单向链表。单向链表也是链表的最基本的结构,是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;列表是由结点构成,一般用指针head指向链表的第一个结点为链表的表头,而链表的最后一个结点的指针域赋值为NULL。2.2.2双向链表双向链表即是这样一个有序的结点序列,每个链表元素既有指向下一个结点的指针,又有指向前一个结点的指针,其中每个结点都有两种指针,即left和right。left指针指向左边结点,right指针指向右边结点。一个双向链表分为三大类,第一类就是数据,第二类指针指向前一个结点的地址,第三类指针指向后一个结点的地址。双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。一般是在需要大批量的另外储存数据在链表中的位置的时候用。2.2.
  3. 循环链表循环链表是与单链向表一样,是一种链式的存储结构,所不同的是,单向链表的最后一个结点的指针域为NULL,而循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,也就是尾结点的指针域中存储着链表的第一个结点的地址,从而构成一个环形的链。对于循环链表而言,可以从该链表的任意一个结点可以一直到链表的头结点,有利于数据的存储缓存。2.3从链表的结构分类链表从结构上来讲一般由三部分组成,分别是头结点、节点(中间节点)和尾节点(最后一个节点),头结点只有指针域没有数据域,但是在某些情况下在使用链表的时候头结点有数据域,这种情况下链表就没有头结点,所以根据有无头结点可以将链表分为有头链表和无头链表。有头的浪费空间,但易理解,边界好处理,不易出错,代码简单,无头链表节省空间,难理解,边界不易处理,代码稍复杂。但是只有根据实际情况选用真正的有无头节点链表,本书中采用的是无头链表。1.2 动态单向链表的实现 1.2.1 动态链表的说明所谓动态链表,是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系,采用动态申请内存的方式申请空间,即使用内存管理函数来分配空间,这样的话,可以做到有需要就申请空间,空间不用就可以释放掉,并不存在浪费内存的问题,真正的实现即用即取,不用就释放的效果。动态链表是用内存申请函数(malloc)动态申请内存的,每当使用一个结点就申请一块内存空间,所以在链表的长度上没有限制。动态链表因为是动态申请内存的,所以每个结点的物理地址不连续,要通过指针来顺序访问,所以对一个链表而言,其链表的表头很重要,不能弄丢链表的表头,否则你的链表很可能就找不回了。动态链表的主要的操作有:1)创建链表2)遍历链表3)查找链表中的某一个结点4)删除链表中的某一个结点5)在链表中插入一个结点

更多交流学习可以私我vx13260562029

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值