1. 程式人生 > 其它 >2.3.2 使用陣列模擬連結串列

2.3.2 使用陣列模擬連結串列

連結串列(陣列模擬)

連結串列也可以使用陣列來實現,操作和基礎知識比指標簡單
但是個人覺得就思路和操作的清晰,以及對連結串列的理解而言,還是用指標好

模擬連結串列介紹

我們可以利用兩個陣列,分別記錄連結串列要的兩個東西:資料和地址
我們使用一個數組data,來儲存每個結點的資料
使用另外一個數組right,來儲存序列中每一個數右邊的數的位置

比如現在二者如下:
位置 1 2 3 4 5 06 07 08 09
data: 2 3 5 8 9 10 18 26 32
right: 2 3 4 5 6 7 8 9 0

right[9] = 0 ,就代表data第九位的的右邊沒有資料

這裡說一下,眾所周知陣列的第一位下標是0,但是書裡按1開始算了
本著以書為本的原則,就沒有修改,況且對於做連結串列而言也沒區別
就是習慣了0開始數,看著難受

再如right[1]的值是2,指的是1號元素的右邊的元素是2號元素(存放在data[2]中)

下面嘗試按大小順序,把6這個數值加入進去,那麼該怎麼做呢?
對於data陣列比較簡單,我們只需要做新增資料這個操作
讓我們把這個資料新增到10號位置
位置 1 2 3 4 5 06 07 08 09 10
data: 2 3 5 8 9 10 18 26 32 6

對於right陣列,會複雜一點,畢竟要排序和改地址
我們通過觀察data陣列,我們的6需要新增到5和8之間,也就是3號元素和4號元素之間

5對應的號數是3,8則是4.原本的地址是3號->4號,現在我們要加入6
那麼我們新的次序是3號->10號->4號,即:
1.把3號“右邊一位”改成10號
2.把10號“右邊一位”改成4號
3.4號“右邊一位”不變

位置 1 2 3 4 5 06 07 08 09 10
data: 2 3 5 8 9 10 18 26 32 6
right: 2 3 10 5 6 7 08 09 0 4

程式碼例項:

# include <stdio.h>
int main(){
    int data[101],right[101];  //大小沒有硬性要求,

    int i,n,t,len ; 

    //開始讀入已有的數
    scanf("%d",&n) ; 

    for(i=1 ; i<=n ; i++){
        scanf("%d",&data[i]) ; 
    }

    len = n ; 

    //初始化陣列

    for(i = 1 ; i<= n ,i++){
        if(i!=n)    right[i] = i+1;
        else        right[i] = 0 ;
    }

    //直接在陣列data末尾增加一個數
    len++;
    scanf("%d",&data[len]);

    //從連結串列透開始遍歷
    t = 1 ;
    while(t!=0){
        if(data[right[t]] > date[len]){
            //如果當前結點的下一結點的值大於待插入數,則把數插入
            right[len] = right[t];
            //新插入的數的下一結點的編號,等於當前結點的下一結點編號  

            right[t] = len ; 
            //當前結點的下一個結點編號,就是新插入的數的編號

            break ; //插入完成,我們跳出迴圈
        }

        t = right[t] ;
    }

    //輸出連結串列中所有的數
    t = 1 ;
    while(t!=0){
        printf("%d",data[t]);
        r = tight[t] ; //根據right陣列的設定,讀取下一個數
    }
    
    getchar();
    getchar();

    return 0 ;
}

小結

模擬連結串列以兩個對應的陣列,代替了指標
兩者各有優劣,但是指標用的應該更多,畢竟你陣列大小存在著限制
可以把模擬連結串列作為簡單/削弱版的連結串列
不過,使用模擬連結串列一樣可以實現雙向連結串列和迴圈連結串列,這裡就先不提了