线性表——链式结构(c语言实现)

单链表:

 

 

其他形式链表:静态链表、双向链表、循环链表

 




顺序表和链表的比较


在实际应用中究竟选用那一种存储结构呢?这要根据具体的要求和性质决定。通常从以下几方面来考虑:


1.基于空间的考虑


顺序表的存储空间是静态分配的,在程序执行之前必须明确规定它的存储规模。若线性表的长度n变化较大,则存储规模难于预先确定。估计过大将造成空间浪费,伏击太小又将使空间溢出的机会增多。(可以优化,但问题仍然存在)在静态链表中,初始存储池虽然也是静态分配的,但若同时存在若干个结点类型相同的链表,则它们可以共享空间,使个链表之间能够相互调节余缺,减少溢出机会。动态链表的存储空间是动态分配的,只要内存空间尚有空闲,就不会产生溢出。因此当线性表的长度变化较大,难以估计其存储规模时,采用动态链表作为存储结构较好。


在链表中的每个结点,除了数据域外,还有额外设置指针(或光标)域,从存储密度来讲,者是不经济的。所谓存储密度(Stotage Density),是指结点数据本身所占的存储量和整个结点结构所占的存储量之比即:存储密度=结点数据本身所占的存储量/结点结构所占的存储总量。


一般地,存储密度越大,存储空间的利用率就越高。显然,顺序表的存储密度为1,而链表的存储密度小于1.例如单链表的结点的数据均为整数,指针所占空间和整型量相同,则单链表的存储密度为50%。因此若不考虑顺序表中的备用结点空间,则顺序表的存储空间利用率为100%,而单链表的存储空间利用率为50%。由此可知,当线性表的长度变化不大,抑郁事先确定其大小时,为了节约存储空间,宜采取顺序表作为存储结构。


2.基于时间的考虑


顺序表是有向量实现的,它是一种随机存取结构,对表中任一结点都可以在0(1)时间内直接地存取,而链表中的结点,需从头指针其顺着链找才能取得。因此,若线性表的操作主要是进行查找,很少做插入和删除时,宜采用顺序表做存储结构。


在链表中的任何位置上进行插入和删除,都只需要修改指针。而在顺序表中进行插入和删除,平均要移动表中近一半的结点,尤其是当每个结点的信息量较大时,移动结点的时间开销就相当可观。因此,对于频繁进行插入和删除的线性表,宜采用链表做存储结构。若表的插入和删除主要发生在表的首尾两端,则宜采用尾指针表示的单循环链表。


3.基于语言的考虑


对于没有提供指针类型的高级语言,若要采用链表结构,则可以使用光标实现的静态链表,虽然静态链表在存储分配上有不足之处,但它和动态链表一样,具有插入和删除方便的特点。值得指出的是,即使是对那些具有指针类型的语言,静态链表也有其用武之地。特别是当线性表的长度不变,仅需改变结点之间的相对关系时,静态链表比动态链表可能更方便。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值