《线性表》

《线性表》

开发工具与关键技术:MyEclipse 10、Java
作者:潘玉莹
撰写时间:2019-08-05

线性表主要包括:线性表抽象数据类型,顺序表,单链表,循环单链表,循环双向链表,静态链表
线性表的定义:线性表是一种可以在任意位置插入和删除数据操作,由n(n>=0)个相同类型数据元素a1,a2,an-1组成的线性表
 线性表抽象数据类型
数据集合 :{ a0, a1, … , an-1 }, ai的数据类型为任意的类类型,{ a0, a1, … , an-1 }表示数据元素有次序关系,简称序列
线性表抽象数据类型的Java接口:
public interface List{
public void insert(int i,Object obj) throws Exception;
public Object delete(int i) throws Exception;
public Object getData(int i) throws Exception;
public int size();
public boolean isEmpty(); }
 线性表的顺序表示和实现
 实现顺序存储结构的方法是使用数组。数组把线性表的数据元素存储在一块连续地址空间的内存单元中,这样线性表中逻辑上相邻的数据元素在物理存储地址上也相邻。数据元素间的逻辑上的前驱、后继逻辑关系就表现在数据元素的存储单元的物理前后位置上。
listArray
其中a0 ,a1, a2等表示顺序表中存储的数据元素, listArray表示顺序表存储数据元素的数组, maxSize表示存储顺序表的数组的最大存储单元个数,size表示顺序表当前存储的数据元素个数。
顺序表类的成员变量设计如下:
int maxSize;
int size;
Object[] listArray;
final int defaultSize = 10;
2.顺序表类的操作实现
(1)构造函数
public SeqList(){
initiate(defaultSize);
}
public SeqList(int size){
initiate(size);
}
private void initiate(int sz){
maxSize = sz;
size = 0;
listArray = new Object[sz];
}
(2)插入数据元素ListInsert(L, i, x)
public void insert(int i,Object obj) throws Exception{
……
for(int j = size; j > i; j–)
listArray[j] = listArray[j-1];
listArray[i] = obj;
size++;
}
(3)删除数据元素
public Object delete(int i) throws Exception{
……
Object it = listArray[i];
for(int j = i; j < size-1; j++)
listArray[j] = listArray[j+1];
size–;
return it;
}
3.顺序表操作的效率分析
时间效率分析:
算法时间主要耗费在移动元素的操作上
T(n)=O(移动元素个数) 而移动元素的个数取决于插入或删除元素的位置i.
若i=size,则根本无需移动(特别快);
若i=0,则表中元素全部要后移(特别慢);
应当考虑在各种位置插入(共n+1种可能)的平均移动次数才合理。

顺序表中的其余操作都和数据元素个数n无关,因此,在顺序表中插入和删除一个元素的时间复杂度为0(n),其余操作的时间复杂度都为0(1)
主要优缺点
优点:算法简单,空间单元利用率高
缺点:主要缺点是需要预先确定数据元素的最大个数,插入和删除时需要移动较多的数据元素
线性表的链式表示和实现
单链表的结构
(1)单链表中构成链表的结点只有一个指向直接后继结点的指针域。其结构特点:逻辑上相邻的数据元素在物理上不一定相邻。
数据域:存储元素数值数据
指针域:存储直接后续的存储位置
(2)头指针、头结点和首元结点的区别
头指针是指向链表中第一个结点(或为头结点、或为首元结点)的指针;
头结点是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息,它不计入表长度。
首元结点是指链表中存储线性表第一个数据元素a0的结点

(1)带头结点单链表无论在第一个数据元素结点前插入,还是在其他结点前插入,操作方法一样;而不带头结点单链表在第一个数据元素结点前插入,和在其他结点前插入,操作方法不一样
(2)删除操作和插入操作类似
(3)设计带头结点单链表的算法时,头指针参数可设计成输入型参数;设计不带头结点单链表的算法时,头指针参数必须设计成输出型参数
(4)因此,带头结点单链表的算法设计简单

单链表:主要优点是不需要预先确定数据元素的最大个数,插入和删除操作不需要移动数据元素
主要缺点:主要缺点是查找数据元素需要顺序进行,不能像顺序表那样 随机查找任意一个数据元素。另外,每个节点中要有一个指针域,因此空间单元利用效率不高。而且单链表操作的算法也比较复杂。
循环单链表
循环单链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针域指向整个链表的第一个结点,从而使链表形成一个环。它的优点是从链尾到链头比较方便。循环单链表也有带头结点和不带头结点两种结构。
双向链表
双向链表是每个结点除后继指针域外还有一个前驱指针域,它有带头结点和不带头结点,循环和非循环结构,双向链表是解决查找前驱结点问题的有效途径。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值