一、簡介
1.1 概念
順序表示是指按順序存儲結構存儲的一種線性表,順序存儲表中的結點在內存中佔用一段連續的存儲單元。即線性表中邏輯相鄰的元素在內存中存儲位置相鄰。
線性結構特點:在數據元素的非空有限集中,存在唯一的一個首數據元素,存在唯一的一個末數據元素,除首數據元素外,每個數據元素均只有一個直接前驅;除末數據元素外,每個數據均只有一個直接後續。
1.2 優點
- 方法簡單,各種高級語言中都有數組,容易實現;
- 不用爲表示結點間的邏輯關係而增加額外的存儲開銷,存儲密度大
- 順序表具有按元素序號隨機訪問的特點,查找速度快,時間複雜度較小
1.3 缺點
- 在順序表中進行插入、刪除操作時,平均移動大約表中一半的元素,因此n較大的順序表執行效率低
- 需要預先分配適當的存儲空間,預先分配過大,可能導致順序表的後部大量閒置;預先分配過小,又會造成溢出
1.4 結構圖
二、簡單實現
public class LineList<T> {
int length = 10;//表長度
public Object[] data = new Object[length];//存放的數據
int curlen = 0;//實際表長度
/**
* 在指定位置插入數據元素
*
* 1、從位置i+1到表尾位置的所有數據元素均要向前移動一個存儲位置,則原來第i+1個結點覆蓋第i個結點;
* 2、將新結點插入到空餘位置i處;
* 3、修改表長度,使之增加1。
*
* @param t 要插入的元素
* @param i 要插入的位置
*
*/
public void insert(T t, int i) {
// 判斷插入的位置是否正確
if(i < 0 || i > length || curlen >= length) {
System.out.println("插入的位置不對或表已經存滿");
return;
}
// 循環個插入位騰出空間
for (int j = curlen; j > i; j--) {
data[j] = data[j - 1];
}
data[i] = t;
curlen++;
}
/**
* 刪除指定位置的數據
*
* 從位置i+1到表尾位置的所有數據元素均要向前移動一個存儲位置,則原來第i+1個結點覆蓋第i個結點,
* 以此內推,直到表的尾則可實現第i個結點的刪除;
* 修改表的長度,使之減1。
*
* @param i 要刪除元素的位置
* @return
*/
public Object delete(int i) {
if(i < 0 || i > curlen) {
System.out.println("刪除位置不正確");
return null;
}
// 保存刪除前第i個數據元素
Object o = data[i];
// 從i開始循環覆蓋元素
for (int j = i; j < curlen; j++) {
data[j] = data[j+1];
}
data[curlen] = null;
curlen--;
return o;
}
}
三、使用
public static void main(String[] args) {
// 插入元素
LineList<String> lineList = new LineList<>();
lineList.insert("a", 0);
lineList.insert("b", 1);
lineList.insert("c", 2);
// 打印所有元素
Object[] obs = lineList.data;
for(Object o : obs) {
System.out.print(o + "; ");
}
System.out.println("");
// 刪除元素
Object object = lineList.delete(0);
System.out.println("當前刪除的元素:" + object);
// 打印剩餘元素
Object[] objects = lineList.data;
for(Object o : objects) {
System.out.print(o + "; ");
}
}