數據結構 | 如何實現線性表的順序結構

什麼是線性表

線性表就是零個或多個數據元素的有限序列。
首先是一個序列,而後序列之間有順序,序列中的元素若是存在多個,則第一個元素無前驅,最後一個元素無後繼,其餘每一個元素都有且一個前驅和一個後繼。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. 由於我這裏用的泛型,因此返回的也是泛型的結果,用泛型的優勢就是可擴展性更強了,在後面泛型能夠不受類型的約束,可使用整型,字符串型。
  2. 由於線性表的下標索引是從1開始的,因此咱們返回的是 i-1 的數據元素ide

    插入元素方法
  3. 若是插入的位置不合理,打印錯誤語句並返回。
  4. 若是線性表的長度大於等於默認分配的MAXSIZE,答應錯誤語句並返回。
  5. 若是插入的位置不在表尾,那就從最後一個元素開始向前遍歷到 i 個位置,分別將他們都向後移動一個位置。
  6. 將要插入元素填入數組 i-1 的位置處。
  7. 表長加 1。測試

    刪除元素方法
  8. 若是線性表爲空,打印錯誤語句並返回。
  9. 若是刪除的位置不合理,打印錯誤語句並返回。
  10. 若是刪除的元素不在表尾,那就從刪除元素位置開始遍歷到最後一個元素位置,分別將它們都向前移動一個位置。
  11. 表長減 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

  1. 初始化線性表,這裏我使用的是僞隨機種子設置數組的長度以及數組中元素的值。
  2. 隨機生成刪除元素的下標,知足條件則自動刪除元素。
  3. 隨機生成插入元素的下標和數據,知足條件則自動插入元素。
  4. 最後展現線性表中的數據。
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

相關文章
相關標籤/搜索