链表、数组

链表的定义

逻辑结构上一个挨着一个的数据在实际存储时所在的内存地址并不连续,相反的,数据随机分布在内存中的各个位置,这种存储结构称为链式存储,这种链式存储所生成的表就是链表。

分散存储是链表最显著的特征,但为了能够保持数据元素之间的顺序关系,每个数据元素在存储的同时都要配备一个指针,用于指向它的直接后继元素,即每一个数据元素都指向下一个数据元素。

 这样这些由指针相互连接的数据就具有了线性关联。

链表中的每个元素由两部分构成:一是本身存储的数据信息,称为数据域;二是指向后继的指针,称为指针域。这两部分信息组成数据元素的存储结构,称之为链表“结点”

 n个结点通过指针域相互链接,就形成一个链表。

 链表中第一个元素所在的结点称为首元节点,有时,在首元节点之前会额外增设一个结点,此节点的数据域一般不存放数据,但有些情况下也可以存放链表的长度等信息,此结点被称为头节点

 若头节点的指针域为空,则代表此链表是空表。

 头节点对于链表来说不是必须的,但在处理某些问题时,给链表添加头节点会使问题变得更加简单。

链表还拥有一个头指针,头指针永远指向链表中第一个结点的位置。

 如上图所示,左侧是头节点,右侧是头指针,两者在程序中的直接体现就是头指针只声明而没有分配存储空间,头节点进行了声明并分配了一个结点大小的实际物理内存。此外,链表中可以没有头节点,但不能没有头指针。

如上图所示,我们就定义好了一个链表类型 。

链表也有增删改查的操作

删除链表元素只需要把前节点的指针域越过要删除的结点直接指向下一个结点,

 然后释放Q结点的空间,请记住这里一定要释放掉Q结点,否则Q指针会成为野指针,野指针的出现会造成严重的内存泄露。

 添加链表元素时,需要先确定要添加的位置,

 然后把前结点的指针域指向自身,再将自身的指针域指向下一个结点即可 。

 数组和链表的区别

内存

数组从栈中分配空间,所有关于内存的申请开辟或者析构释放都由系统来完成,对程序员来讲是方便快速的,但相应的,自由度也变小了。

 链表从堆中分配空间,用多少开辟多少内存,自由度大,但是内存的申请管理就比较麻烦。

 

操作效率

数组的删除插入,其后的数据都要移动,而链表只需要修改指针即可。

由于数组的地址是连续的,访问的时候效率高;而链表的内存是不连续的,要访问某个结点,必须从头节点开始查找。

应用场景

从逻辑角度讲,数组必须事先定义长度(元素个数),并分配固定大小的空间,不能适应数据动态增减的情况。

 当数据较多时,可能会超出原先定义的元素个数,而不得不重新建立一个数组。

 当数据较少时,又会造成内存浪费。

 相反,链表可以进行动态内存分配 ,可以适应数据动态增减的情况,且可以方便的插入、删除数据项。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值