线性表,链表

深入理解线性表与链表存储结构
本文详细介绍了线性表的概念、基本特点、顺序存储与链式存储的区别及各自优缺点,同时探讨了线性表在Java中的实现方式,以及链表的类型、实现和基本运算。重点阐述了两种数据结构在查找、插入和删除操作上的性能差异。

线性表是一种最简单常用的数据结构,是其他数据的基础。
从逻辑结构上说线性表具有唯一的第一个元素和唯一的最后一个元素,并且除了第一个元素和最后一个元素外,其他数据元素都只有一个前件和后件。
从存储结构上说线性表的存储结构有顺序存储和链式存储。
 注:
        逻辑结构:指数据元素之间的逻辑关系,就是从你的角度看到的结构。
        存储结构:又称物理结构,数据结构在计算机中的表示(一般指在计算机中如何存储,如何操作等)称之为物理结构。
线性表由具有具有相同特性的N个元素(N>=0)组成的一个有限序列。其中线性表中的元素的数目,即N表示该线性表的长度;当N=0时,表示该表为空表,即不包含任何元素。当N=1时,表示线性表中只有一个数据元素,此元素既是头元素,也是尾元素,没有前驱,也没有后继。当N!=0时,设序列中第i个元素为ai(1<=i<=N),线性表可以表示为(a1,a2,a3....,aN)。
 顺序存储:线性表的顺序存储是指在计算机内存中用一组地址连续的存储单元依次存储线性表中的各个元素。线性表中的所有元素在存储空间中是连续排列的,就是说线性表中的各个元素在存储空间是按照其逻辑顺序依次存放的。其逻辑结构域存储结构建立了及其完整的统一。
 线性表的基本特点:
    假设线性表的每个元素占用k个数据单元,以首单元的存储地址作为数据元素的存储位置,则线性表中第i+1个数据元素的位置LOC(ai+1)和第i个元素的存储位置LOC(ai)之间满足下列关系:
    即:LOC(ai+1)=LOC(ai)+K;     LOC(ai)=LOC(a1)+ (i-1)K (1<=i<=n);
    线性表中国的各个元素在计算机存储器中是通过其物理位置之间的先后关系来反映它们在逻辑结构中的先后关系。只要确定了某数据元素的物理位置,它的前件,后件等相关元素都能够一一确定。
    在顺序表中每个数据元素ai的存储地址是该数据元素在表中的位置i的线性函数,只要知道基地址和每个数据元素的所需大小,就可以求出任意数据元素的存储地址,根据公式处理起来非常方便,所以成为随机存取机制。
    顺序表的特点是逻辑结构中相邻的元素ai和ai+1在存储结构中也是相邻的,所有可以随机存取。
    在Java中,集合类ArrayList就是一个典型的线性表(具体可以看看ArrayList的实现),它是借助一位数组表示的。一位数组的下标和数据元素的在线性表中的序号相对应。
在顺序表中的一般常用的几种运算有以下几种:
    1.求长度,
    2.查找某项数据
    3.插入数据:包含在某个位置插入一项数据和若干项数据
    4.删除某项或某一段数据
    5.修改某项数据
    6.清空表
    7.判断是否为空
    8.是否包含某一项或某一些数据
顺序表具有无需为表示结点间的逻辑关系而增加额外的存储空间,存储空间紧密;并具有随机存储的特点,所以查找起来比较方便。但是插入跟删除数据都平均需要移动一半的结点,效率很低;而且存储空间分配只能预先进行静态分配(过大浪费空间,过小容易内存溢出)
线性表非常适合查找等操作,但是不适合经常插入和删除。

链表存储结构是一种与顺序存储结构截然不同的物理存储结构设计思想,它既可以用在线性表中也可以用在队列和栈中,设置在非线性结构中也拥有广泛的应用前景。
链表:是用一组任意的存储单元来存放线性表的结点,这组存储单元可以是连续的也可以是非连续的,甚至可以是零散分布在内存的任何位置。链表中结点的逻辑次序跟物理次序不一定相同。
链表可以更好的利用内存,按需分配和释放存储空间。在链表中插入或删除结点,只需要改变某个结点成员的指向,而不需要移动其他结点,相对数组元素的插入和删除效率要高。
链表的类型:
    1.单链表:每个结点只有一个指向后继结点的指针。
    2.双链表:每个结点有两个用于指向其他结点的指针,一个是指向前趋结点,一个是指向后继结点。
    3.循环链表:使最后一个结点的指针指向第一个结点。
单链表的实现请参见 http://m.blog.youkuaiyun.com/blog/caiwenfeng_for_23/8496029
双链表在Java中实现 具体可详见LinkedList ;
链表的基本运算:
    1.求长度,
    2.查找某项数据
    3.插入数据:包含在某个位置插入一项数据和若干项数据
    4.删除某项或某一段数据
    5.修改某项数据
    6.清空表
    7.判断是否为空
    8.是否包含某一项或某一些数据
线性链表的链式存储结构中,链表中结点的逻辑次序跟物理次序不一定相同,是通过结合复交一个指针域来表示结点之间的逻辑关系。所以,不需要预先按最大的需要分配存储空间。同时,链表的插入、删除运算只需修改指针域,而不需要移动其它结点,效率较高。
但是每个结点中的指针域需要额外占用存储空间,因此,它的存储密度较小。另外,链式存储结构是一种非随机存储结构,查找数据的效率较低。



转载于:https://my.oschina.net/litengit/blog/345049

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值