1. 程式人生 > >鏈式儲存結構之靜態連結串列

鏈式儲存結構之靜態連結串列

1.靜態連結串列

用陣列代替指標來描述連結串列叫做靜態連結串列。靜態連結串列是為了給沒有指標的高階語言設計的一種實現單鏈表能力的方法。首先讓陣列的元素都由兩個資料域組成,data和cur,即陣列的每一個下標都對應一個data和一個cur。

2.靜態連結串列的初始化
靜態連結串列的初始化如下圖:


初始化靜態連結串列的程式碼實現:

public static void initList(){
    ArrayData[] array=new ArrayData[maxSize];
    for(int i=0;i<maxSize-1;i++){
        array[i]=new ArrayData(null,i+1);
    }
    array[maxSize-1]=new ArrayData(null,0);
}
class ArrayData{
    Object data;
    int cur;
    public ArrayData(Object data,int cur){
        this.data=data;
        this.cur=cur;
    }
    @Override
    public String toString() {
        return "ArrayData [data=" + data + ", cur=" + cur + "]";
    }
}

3.靜態連結串列的插入操作

靜態連結串列進行插入時,將需要插入的元素作為備用連結串列的第一個結點,插入時直接將備用連結串列的第一個結點作為待插入的結點進行插入。備用

在靜態連結串列中第i個數據元素之前插入新的資料元素e,演算法實現思路:
    1. 首先判斷i是否合法,即是否在連結串列長度範圍之內;
    2. 找到空閒分量的下標;
    3. 將新的資料元素e賦值給空閒分量的data值;
    4. 找到第i個數據元素的前一個元素的cur,並將其指向新的資料元素的cur;(插入的資料元素與第i個數據元素之後的元素相連結)
    5. 將新資料元素的下標賦值給第i個數據元素前一個數據元素的cur;(插入的資料元素與第i個數據元素之前的資料元素相連結)

程式碼實現:

public static ArrayData[] insert(ArrayData[] arrays,int i,Object e){
    if(i<1 || i>arrays.length+1){
        System.out.println("i無效");
    }else{
        int j=maxSize-1;
        //獲得空閒分量的第一個結點的下標
        int k=arrays[0].cur;
        //將e賦值給空閒分量的data
        arrays[k].data=e;
        for(int l=1;l<=i-1;l++){
            j=arrays[j].cur;
        }
        //第i個數據元素的前一個數據元素的cur,指向新的資料元素的cur
        arrays[k].cur=arrays[j].cur;
        //將新資料元素的下標賦值給第i個數據元素前一個數據元素的cur
        arrays[j].cur=k;
        arrays[0].cur=k+1;
    }
    return arrays;
}

4.靜態連結串列的刪除

程式碼實現:

public static ArrayData[] delete(ArrayData[] arrays,int i){
    if(i<1 || i>arrays.length){
        System.out.println("i無效");
    }else{
        int j=maxSize-1;
        int k;
        for(k=1;k<=i-1;k++){
            j=arrays[j].cur;   
        }
        k=arrays[j].cur;
        arrays[j].cur=arrays[k].cur;
        //回收下標為i的結點
        arrays[i].cur=arrays[0].cur;
        arrays[0].cur=i;
    }
    return arrays;
}