1. 程式人生 > >用數組代替指針實現靜態鏈表

用數組代替指針實現靜態鏈表

中間 頭結點 space 浪費 c語言 void 靜態鏈表 地址 空數組

  在沒有C語言之前還沒有指針這個概念,但是那個時候就已經有和現在靜態鏈表操作形式類似數據存儲類型。靜態鏈表的優勢就在於,在對其中存儲的信息進行插入刪除操作的時候它的時間復雜度是 O(1) ,那麽在沒有指針的時候是使用什麽來實現這種存儲操作的那?

  那就是用數組來代替指針,靜態鏈表在進行數據遍歷的時候是依靠前一個結點存儲的下一個結點的地址來進行遍歷。並且可以將所有零散的空間利用起來,這樣就更加的節省資源的(數組版本的靜態鏈表在這一點上就做的不好,因為數組需要提前設置好它的大小,所以為了防止存儲的數據超出範圍就需要把數組定義的很大,這樣就很浪費資源了)。每一個靜態鏈表的結點都會有一個結構指針用來存儲下一個結點的地址,那麽同樣指針版本的靜態鏈表就需要兩個部分一部分是,一部分是數據部分,還有一部分是遊標,數組是有下標的遊標就用來存儲下一個結點的數組下標數,這樣就可以直接通過下標訪問到數據了。同時靜態鏈表需要一個頭指針來訪問第一個結點,如果第一個結點都不知道在哪裏的話那麽後續的操作就不可能實現了,所以這裏的數組就需要就需要有一個是特地用來存儲第一個結點的下標的一個結構。當然這個位置沒有什麽特別的限制,如果你想用中間的一個結構來存儲那也是可以實現的只是這樣可能就會比較麻煩了,所以很多時候就用結構數組的最後一個結構用來存儲頭結點的下標,同時作為數組在進行插入的時候還存在一個問題,新插入的數據需要存儲在什麽地方,在使用指針的靜態鏈表就不需要考慮這個問題,因為編譯器會替你完成這個分配的任務,但當你使用數組的靜態鏈表的時候插入操作需要你自己給它分配一個指定的數組位置,那麽就需要有一個位置用來存儲第一空數組的下標,所以這個數組最開始在使用之前是需要先初始化的,第一個和最後與一個結構的遊標存儲為0數據為空,其余的數組的遊標存儲的數值比它自己本身大1,數據為空。

創建靜態鏈表

int staticListSetUp(staticList *space)
{
    int i;
    space[0].data=NUL;
    for(i=0;i<MAXSIZE;i++)
    {
        if(i==MAXSIZE-1)
        {
            space[i].cur=0;
        }
        else 
        {
            space[i].cur=i+1;
        }
        
    }
    return OK;
 } 

靜態鏈表的遍歷

void staticListprint(staticList *space)
 {
     int i;
      i=space[999].cur;
     while(space[i].data!=NUL )
     {
         printf("%c",space[i].data);
         i=space[i].cur;
     }
  } 

用數組代替指針實現靜態鏈表