线性表的概念
线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。
线性表可逻辑地表示为(a1,a2,…,ai-l,ai;,ai+l,…,an)
a1是唯一的第一个数据元素,又称表头元素;an是唯一的“最后一个”数据元素,又称表尾元素.除第一个元素外,每个元素有且仅有一个直接前驱.除最后一个元素外,每个元素有且仅有一个直接后继
线性表的特点
- 表中元素的个数有限
- 表中元素具有逻辑上的顺序性,表中元素有其先后次序
- 表中元素都是数据元素,每个元素都是单个元素
- 表中元素的数据类型都相同,这意味着每个元素占有相同大小的存储空间
- 表中元素具有抽象性,即仅讨论元素间的逻辑关系,而不考虑元素究竟表示什么内容
线性表是一种逻辑结构,表示元素之间一对一的相邻关系
线性表的基本操作
- 初始化: 构造一个空的线性表
- 插入: 在线性表的第i个位置之前插入一个新元素
- 删除: 删除线性表中的第i个数据元素
- 查找: 找出线性表中满足特定条件的元素的位置
- 获取: 取线性表中的第i个数据元素*
- 更新: 取线性表中的第i个数据元素,检查或更新其中某个数据项的
- 内容判空: 判断当前线性表是否为空
- 求长度: 求出线性表中数据元素的个数
- 正序遍历: 依次访问线性表中每个元素并输出
- 销毁: 销毁一个已存在的线性表
线性表的顺序表示
线性表的顺序存储又称顺序表。它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。第1个元素存储在线性表的起始位置,第i个元素的存储位置后面紧接着存储的是第i+1个元素,称i为元素a在线性表中的位序
假设线性表L存储的起始位置为LOC(A)
,sizeof(ElemType)
是每个数据元素所占用存储空间的大小,则表L所对应的顺序存储如图
public class SequenceList<T>{
private T[] listArray;
final int maxSize=10;
private int length;
public SequenceList(){
length=0;
listArray=(T[])new Object[maxSize];
}
// 初始化
public SequenceList(int n){
if (n<=0){
System.out.println("出现错误!");
System.exit(1);
}
length=0;
listArray=(T[])new Object[maxSize];
}
// 判空
public boolean isEmpty(){
return length==0;
}
// 插入新元素
public boolean add(T obj,int pos){
if(pos<1||pos>length+1){
System.out.println("pos值不合法");
return false;
}
if(length==listArray.length){
T[] p=(T[])new object[length*2];
}
for(int i=0;i<length;i++){
p[i]=listArray[i];
listArray=p;
}
for(int i=length;i>=pos;i--){
listArray[i]=listArray[i-1];
listArray[pos-1]=obj;
length++;
return true;
}
}
// 删除元素
public T remove(int i)
{ //在顺序表中删除第i个元素并返回其值,i的合法值为1<=i<=this.length
if(i<1||i>this.length) return null; //i值不合法,返回null
T x = this.listArray[i-1];
for(int j=i; j<this.length; j++)
this. listArray[j-1] = this. listArray[j];
//被删除元素之后的元素向前移一个位置
this.length--; //表长减1
return x;
}
}
// 查找元素
public int find(T obj)
{ //查找第1个与obj相等的元素的位序,返回其位序,若不存在则返回0。
for(i=0;i<this.length;i++)
if(obj.equals(this.listArray[i]) )
return i+1;
return 0;
}
public T get (int i)
{ //返回第i个元素,若i<1或i>this.length,返回null
if(i<1||i>this.length) {
System.out.println(“i值不合法”) ;
return null; } //i值不合法,返回null
return this.listArray[i-1];//将第i个元素返回,其下标为i-1
}
public boolean set( T obj, int i)
{//将第i个元素设置为obj,1<=i<=this.length
if(i<1 || i>this.length) //位序不合法
return false;
this. listArray[i-1] = obj;
return true;
}
// 求表长
public int size()
{ return this.length;
}
// 遍历
public void traverse()
{ for(int i=0;i<this.length; i++)
System.out.print(this.listArray[i]+” ”);
}
// 清空表
public void clear()
{ this.length=0;
}
}