chapter02 SeqList
程序员文章站
2022-03-05 12:17:47
...
本章学习线性表,线性表有顺序表和链表两种。重点应该放在链表上,因为顺序表用的比较少。
2.线性表
2.1线性表的定义
线性表是具有相同特性的数据元的一个有限序列,主要把握下面三点:
- 所有数据类型是相同的
- 线性表是由有限个数据元素构成的
- 线性表中的数据元素与位置有关,每个数据元素都是唯一的序号。
其实逻辑结构比较容易理解:
一句话总结线性表的逻辑特征,就是:每个元素至多只有一个前趋元素,并且至多只有一个后继元素,这就是线性表的逻辑特征。
2.2线性表的顺序存储方式–顺序表
顺序表的逻辑非常好理解,Java和C#实现的代码大同小异。
- 创建一个对象
class SeqList {
private final int Maxsize = 100;
public String[] data; //存放在顺序表中的元素
public int length; //存放顺序表的长度
public SeqList() //构造函数,实现了data和length的初始化
{
this.data = new String[Maxsize];
this.length = 0 ;
}
- 创建顺序表
public void CreateSeqList(String[] split){ //创建一个线性表
int i;
for (i=0;i<split.length;i++)
data[i] = split[i];
length=i;
}
- 输出顺序表
public String DispList(){ //输出线性表
int i;
if (this.length > 0 ){
String mystr = this.data[0];
for (i=1;i<this.length;i++)
mystr += " "+ data[i];
return mystr;
}
else return "这是一个空串";
}
- 求顺序表的长度
public int ListLength(){ //返回线性表长度
return this.length;
}
- 求顺序表中指定位置的元素
public String GetElem(int i){ //获取线性表中指定位置的元素
if (i<1 || i>this.length)
return null;
String e = this.data[i-1];
return e;
}
-
在线性表中指定位置插入元素
在线性表中插入元素,为防止元素被覆盖,必须从最后一个开始往后移,每一个都往后移,直到j = i-1时停止。
整个动态过程可以如下图所示:
所以可以看出,这个算法的主要复杂度就体现在移动元素上,这就意味着它跟表的长度 n 有关,还跟插入的位置 i 有关。其复杂度的计算如下所示:
故计算复杂度为
- 删除顺序表中的指定元素
整个动态过程如下图:
public boolean ListDelete(int i,String e){
int j;
if (i<1||i>this.length)
return false;
e = data[i];
for (j = i-1; j<this.length-1;j++){
data[j] = data[j+1];
}
this.length--;
return true;
}
那么该算法的复杂度为:
完整版的代码:
package chapter02;
/*
author:Hopkin Lai
Created: 2020.0715
*/
//定义一个SeqList类来实现顺序表
class SeqList {
private final int Maxsize = 100;
public String[] data; //存放在顺序表中的元素
public int length; //存放顺序表的长度
public SeqList() //构造函数,实现了data和length的初始化
{
this.data = new String[Maxsize];
this.length = 0 ;
}
//下面就是线性表的基本运算算法
public void CreateSeqList(String[] split){ //创建一个线性表
int i;
for (i=0;i<split.length;i++)
data[i] = split[i];
length=i;
}
public int ListLength(){ //返回线性表长度
return this.length;
}
public String DispList(){ //输出线性表
int i;
if (this.length > 0 ){
String mystr = this.data[0];
for (i=1;i<this.length;i++)
mystr += " "+ data[i];
return mystr;
}
else return "这是一个空串";
}
public String GetElem(int i){ //获取线性表中指定位置的元素
if (i<1 || i>this.length)
return null;
String e = this.data[i-1];
return e;
}
public int LocateElem(String e){
for (int i = 0 ;i<this.length;i++){
if (this.data[i] == e)
return i + 1;
}
return 0; //未找到时返回0
}
public boolean ListInsert(int i, String e){
int j;
if (i<1||i>this.length+1)
return false; //位置小于数组索引最小值或者溢出
for (j=this.length;j>=i;j--){
data[j] = data[j -1];
}
data[i-1] = e;
length++;
return true;
}
public boolean ListDelete(int i,String e){
int j;
if (i<1||i>this.length)
return false;
e = data[i];
for (j = i-1; j<this.length-1;j++){
data[j] = data[j+1];
}
this.length--;
return true;
}
public void ClearList(){
this.length = 0 ;
}
public static void main(String[] args){
SeqList mySeqList = new SeqList();
String[] arrlist = {"I","Love","China","Form","the","Bottom","Of","My","Heart"};
mySeqList.CreateSeqList(arrlist);
System.out.println(mySeqList.DispList());
System.out.println(mySeqList.ListLength());
System.out.println(mySeqList.GetElem(3));
System.out.println(mySeqList.LocateElem("China"));
mySeqList.ListInsert(2,"and You");
System.out.println(mySeqList.DispList());
mySeqList.ClearList();
}
}
上一篇: TS码流解析-5-解析SDT表
下一篇: 矢量量化程序调试结果