線性表就是零個或多個數據元素的有限序列。
首先是一個序列,而後序列之間有順序,序列中的元素若是存在多個,則第一個元素無前驅,最後一個元素無後繼,其餘每一個元素都有且一個前驅和一個後繼。java
線性表的順序存儲結構就是用一段地址連續的存儲單元依次存儲線性表的數據元素,也就是用數組去實現順序存儲結構。
下面用代碼實現一下順序結構。sql
接口主要描述一下實現類要實現哪些方法,這裏順序結構包括三個方法,分別是得到元素,插入元素以及刪除元素的方法。數組
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); }
該類主要實現了接口的三個方法,下面描述一下三個方法要注意的點。dom
由於線性表的下標索引是從1開始的,因此咱們返回的是 i-1 的數據元素ide
表長加 1。測試
package com.stucture.sqlList; /** * @author cier * @date 2018/1/22 10:57 */ public class SeqList<T> implements ISeqList<T> { public static final int MAXSIZE = 20; // 存儲空間的初始化大小 private 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; } }
測試線性表須要注意如下幾點:this
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(); SeqList<Integer> seqList; public SeqListTest(){ initSeqList(); } /** * 建立一個線性表順序存儲結構 */ public void initSeqList(){ seqList = new SeqList<Integer>(); int length = Math.abs(r.nextInt(MAX)); System.out.println("產生的數組長度爲:"+length); if (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(); } }
由於不是手動插入數據,刪除數據,而是使用隨機數自動插入和刪除,因此結果會有不少組,不過不要緊,多運行幾回數據不同反而能對比着獲得結果,下面貼一個完美的運行結果。code
產生的數組長度爲: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