什麼是線性表 線性表就是零個或多個數據元素的有限序列。 首先是一個序列,然後序列之間有順序,序列中的元素如果存在多個,則第一個元素無前驅,最後一個元素無後繼,其他每個元素都有且一個前驅和一個後繼。 什麼是線性表的順序存儲結構 線性表的順序存儲結構就是用一段地址連續的存儲單元依次存儲線性表的數據元素, ...
什麼是線性表
線性表就是零個或多個數據元素的有限序列。
首先是一個序列,然後序列之間有順序,序列中的元素如果存在多個,則第一個元素無前驅,最後一個元素無後繼,其他每個元素都有且一個前驅和一個後繼。
什麼是線性表的順序存儲結構
線性表的順序存儲結構就是用一段地址連續的存儲單元依次存儲線性表的數據元素,也就是用數組去實現順序存儲結構。
下麵用代碼實現一下順序結構。
首先寫一個介面
介面主要描述一下實現類要實現哪些方法,這裡順序結構包括三個方法,分別是獲得元素,插入元素以及刪除元素的方法。
package com.stucture.sqlList;
/**
* 線性表順序存儲結構的介面
* 指的是用一段地址連續的存儲單元存儲線性表的數據元素
* @ClassName: ISeqList
* @author cier
* @date 2018-1-22
*/
public interface ISeqList<T> {
/**
* 獲得元素
* @param i 需要獲得第i個元素
* @return
*/
public T getElem(int i);
/**
* 插入元素
* @param i 元素的插入位置
* @param t 需要插入的元素
* @return 是否成功刪除
*/
public boolean insertElem(int i,T t);
/**
* 刪除元素
* @param i 需要刪除元素的位置
* @return
*/
public T deleteElem(int i);
}
然後寫一個介面的實現類
該類主要實現了介面的三個方法,下麵描述一下三個方法要註意的點。
獲得元素方法
- 因為我這裡用的泛型,所以返回的也是泛型的結果,用泛型的優點就是可擴展性更強了,在後面泛型可以不受類型的約束,可以使用整型,字元串型。
因為線性表的下標索引是從1開始的,所以我們返回的是 i-1 的數據元素
插入元素方法
- 如果插入的位置不合理,列印錯誤語句並返回。
- 如果線性表的長度大於等於預設分配的MAXSIZE,答應錯誤語句並返回。
- 如果插入的位置不在表尾,那就從最後一個元素開始向前遍歷到 i 個位置,分別將他們都向後移動一個位置。
- 將要插入元素填入數組 i-1 的位置處。
表長加 1。
刪除元素方法
- 如果線性表為空,列印錯誤語句並返回。
- 如果刪除的位置不合理,列印錯誤語句並返回。
- 如果刪除的元素不在表尾,那就從刪除元素位置開始遍歷到最後一個元素位置,分別將它們都向前移動一個位置。
表長減 1。
```java
package com.stucture.sqlList;
/**
- @author cier
@date 2018/1/22 10:57
*/
public class SeqListprivate T[] data; // 數組存儲數據元素
private int length; // 線性表當前長度public SeqList() {
/**
data = (T[]) new Object[MAXSIZE];
}- 獲得元素
- @param i 需要獲得第i個元素
- @return
*/
@Override
public T getElem(int i) {
if (i < 0 || i > MAXSIZE) {
return null;
}
T t = data[i - 1];
return t;
}
- 插入元素
- @param i 元素的插入位置
- @param t 插入的元素
- @return
*/
@Override
public boolean insertElem(int i, T t) {
// 線性表已經滿了
if (length == MAXSIZE) {
System.out.println("該線性表已經滿了");
return false;
}
// 插入的位置不在範圍內
if (i < 1 || i > MAXSIZE) {
System.out.println("該位置不合法");
return false;
}
// 插入的位置不在表尾
if (i < length) {
for (int j = length; j >= i; j--) {
data[j] = data[j - 1];
}
}
// 線性表的下標是從1開始,但是數組的下標是從0開始的,所以插入的t是在 i-1 的位置
data[i - 1] = t;
length++;
return true;
}
@Override
public T deleteElem(int i) {// 線性表為空時 if (length == 0) { System.out.println("線性表為空"); return null; } // 刪除的數據不在範圍內時 if (i < 1 || i > length) { System.out.println("刪除位置不在範圍內"); return null; } T t = data[i - 1]; for (int j = i; j < length; j++) { data[j - 1] = data[j]; } length--; return t;
}
public T[] getData() {
return data;
}public void setData(T[] data) {
this.data = data;
}public int getLength() {
return length;
}public void setLength(int length) {
if (length < 0 || length > MAXSIZE){
System.out.println("長度不合法");
}
this.length = length;
}
}
```最後測試線性表
測試線性表需要註意以下幾點:
- 初始化線性表,這裡我使用的是偽隨機種子設置數組的長度以及數組中元素的值。
- 隨機生成刪除元素的下標,滿足條件則自動刪除元素。
- 隨機生成插入元素的下標和數據,滿足條件則自動插入元素。
- 最後展示線性表中的數據。
```java
package com.stucture.sqlList;
import java.util.Random;
/**
- 測試線性表
- @author cier
@date 2018/1/22 11:47
*/
public class SeqListTest {
final int MAX = 25;
Random r = new Random();
SeqListpublic SeqListTest(){
/**
initSeqList();
}創建一個線性表順序存儲結構
*/
public void initSeqList(){
seqList = new SeqListif (length > SeqList.MAXSIZE) {
System.out.println("該長度不合法");
}for (int i = 1; i<=length; i++){
int j = r.nextInt(MAX);
System.out.print(j + " ");
if (!seqList.insertElem(i,j)) {
System.exit(0);
}
}
System.out.println("\n原始數組是:");
display(seqList);
}
- 測試刪除元素
*/
public void deleteElem() {
int i = r.nextInt(MAX);
System.out.println("\n\n刪除的位置是:"+i);
Integer deleteNumber = seqList.deleteElem(i);
if(deleteNumber == null) {
System.exit(0);
} else {
System.out.println("刪除的元素是:"+ deleteNumber);
System.out.println("刪除元素後數組是:");
display(seqList);
}
}
- 測試隨機插入方法
*/
public void insertByRandom() {
int i = r.nextInt(MAX);
System.out.println("\n\n隨機插入的位置是:"+i);
int elem = r.nextInt(MAX);
System.out.println("隨機插入數據是:"+elem);
seqList.insertElem(i,elem);
System.out.println("隨機插入數據後數組是:");
display(seqList);
}
- 數據展示
*/
public void display(SeqList seqList) {
for (int i = 1; i < seqList.getData().length; i++) {
if (seqList.getElem(i) != null){
System.out.print(seqList.getElem(i) + " ");
}
}
System.out.println("\n數組的長度為:"+seqList.getLength());
}
- 獲取元素
*/
public void getElem(){
int i = r.nextInt(MAX);
System.out.println("\n獲取位置為:"+i);
System.out.println("獲取到的元素為:"+seqList.getElem(i));
}
public static void main(String[] args) {
SeqListTest seqListTest = new SeqListTest();
seqListTest.insertByRandom();
seqListTest.deleteElem();
seqListTest.getElem();
}
}
```
關於運行結果
因為不是手動插入數據,刪除數據,而是使用隨機數自動插入和刪除,所以結果會有很多組,不過沒關係,多運行幾次數據不一樣反而能對比著得到結果,下麵貼一個完美的運行結果。
產生的數組長度為:16
22 4 8 11 17 3 10 8 18 18 7 9 14 4 3 18
原始數組是:
22 4 8 11 17 3 10 8 18 18 7 9 14 4 3 18
數組的長度為:16
隨機插入的位置是:12
隨機插入數據是:14
隨機插入數據後數組是:
22 4 8 11 17 3 10 8 18 18 7 14 9 14 4 3 18
數組的長度為:17
刪除的位置是:15
刪除的元素是:4
刪除元素後數組是:
22 4 8 11 17 3 10 8 18 18 7 14 9 14 3 18 18
數組的長度為:16
獲取位置為:17
獲取到的元素為:18