數據結構之順序表

順序表就是按照順序存儲方式存儲的線性表,該線性表的結點按照邏輯次序一次存放在計算機的一組連續的存儲單元中如下圖:

這裏寫圖片描述
由於順序表是一次存放的,只要知道了該順序表的首地址以及每個數據元素所佔用的存儲長度,那麼我們就很容易計算出任何一個數據元素(也就是數據繫結點)的位置。
1、結點數據類型:

public class MySeqNode {

    String key;  //關鍵字
    String name;
    int age;
    public MySeqNode(String key, String name, int age) {
        this.key = key;
        this.name = name;
        this.age = age;
    }
}

2、順序表的類:

/**
 * 順序表的實現
 * @author Administrator
 *
 */
public class MySequence {

    /**
     * 規定順序表的最大長度爲10
     */
    private static final int MAXLEN=10;
    /**
     * 保存順序表的結構數組
     */
    public MySeqNode[] mySeq=new MySeqNode[MAXLEN+1];
    /**
     * 已存結點的數量
     */
    private int seqLen;
}

3、初始化順序表
創建一個空的順序表,也就是初始化順序表,只需要將表的結點數量listlen設爲0即可,這樣如果順序表中原來已有數據,後面添加的數據元素將從順序表的第一個位置存儲,也會覆蓋已有數據。

    /**
     * 初始化順序表,即創建空的順序表
     */
    public void initMySequence(MySequence mySequence){
        mySequence.seqLen=0;
    }

4、計算順序表長度
計算順序表長度也就是計算順序表中結點的個數。

    /**
     * 獲取數序表長度,即已存節點的數量
     * @return
     */
    public int getMySeqLen(MySequence mySequence){
        return mySequence.seqLen;
    }

5、插入結點是在順序表的第i個位置上插入一個新的結點,使得其後的結點編號依次加1。這時候順序表的長度便爲n+1。插入的結點之後的結點都要向後移動。

    /**
     * 插入結點,成功返回1,否則返回0
     * @param mySeqNode  要插入的結點
     * @param n 要插入的結點的位置
     * @return
     */
    public int insertSeq(MySequence mySequence,MySeqNode mySeqNode,int n){
        if (seqLen>=MAXLEN) {
            System.out.println("數序表已滿,不可以插入結點!");
            return 0;
        }
        if(n<1||n>seqLen-1){
            System.out.println("插入結點的位置不對,不可以插入!");
            return 0;
        }
        for(int i=seqLen;i>=n;i--){
            mySeq[i+1]=mySeq[i];//n位置插入結點,那麼n位置以後的結點都要向後移動,先從最後一個結點開始移動,一直到第n個結點
        }
        mySequence.mySeq[n]=mySeqNode; //插入結點
        mySequence.seqLen++;  //順序表結點個數增加1,即長度+1
        return 1;
    }

6、追加節點
在順序表的末尾來新增加一個加一個節點。不需要大量數據移動,只需要結點個數即長度+1.

    /**
     * 追加結點
     * @param mySeqNode 要追加的結點
     * @return
     */
    public int appendSeq(MySequence mySequence,MySeqNode mySeqNode){
        if (seqLen>=MAXLEN) {
            System.out.println("數序表已滿,不可以插入結點!");
            return 0;
        }
        mySequence.mySeq[++seqLen]=mySeqNode;
        return 1;
    }

7、刪除結點
刪除結點是刪除順序表L的第i個結點,使其後的所有結點編號依次減1。刪除節點,長度-1,刪除節點之後的結點都需要向前移動。

/**
     * 刪除某一個位置上的結點
     * @param mySequence
     * @param n
     * @return
     */
    public int delSeqNode(MySequence mySequence,int n){
        if (n<1||n>mySequence.seqLen+1) {
            System.out.println("刪除位置錯誤,不可刪除結點。");
            return 0;
        }
        for (int i = n; i < mySequence.seqLen; i++) {
            mySequence.mySeq[i]=mySequence.mySeq[i++];//n以後的位置向前移動
        }
        mySequence.seqLen--;
        return 1;
    }

8、查找結點
(1)、根據位置i查找結點

    /**
     * 根據序列號返回結點
     * @param mySequence
     * @param n
     * @return
     */
    public MySeqNode getNodeByNum(MySequence mySequence,int n){
        if (n<1||n>mySequence.seqLen+1) {
            System.out.println("結點序號錯誤,不能返回節點!");
            return null;
        }
        return mySequence.mySeq[n];
    }

(2)、根據關鍵字查找結點

    /**
     * 根據關鍵字返回結點序列號
     * @param mySequence
     * @param key
     * @return
     */
    public int getNodeByKey(MySequence mySequence,String key){
        for (int i = 0; i < mySequence.seqLen; i++) {
            if ((mySequence.mySeq[i].key).equals(key)) {
                return i;
            }
        }
        return 0;
    }

9、顯示所有結點:

    /**
     * 遍歷所有的結點
     */
    public void listSeq(MySequence mySequence){
        for (int i = 0; i < mySequence.seqLen; i++) {
            System.out.println("順序表中的結點爲:"+mySequence.mySeq[i].key+","+mySequence.mySeq[i].name+","+mySequence.mySeq[i].age);
        }
    }

順序表缺點:
1、在插入或者刪除結點時,需要移動大量的數據。
2、如果表比較大,有時會比較男分配足夠的連續的存儲空間,往往導致內存分配失敗,而無法存儲。

發佈了66 篇原創文章 · 獲贊 76 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章