05 線性表 四 鏈式儲存結構 靜態鍊錶

2021-06-27 21:55:40 字數 2833 閱讀 9967

鏈式儲存結構.靜態鍊錶

(嵌入式_小j的天空)

一、靜態鍊錶

1.靜態鍊錶儲存結構

單鏈表是通過指標實現的,但是我們也可以

通過陣列來代替指標描述單鏈表

,即靜態鍊錶

。如何實現靜態鍊錶?

構造陣列的元素由兩個資料域組成:data和cur,即陣列的每個下標都對應乙個data和乙個cur。

資料域data:用來存放資料元素,即要處理的資料;

游標cur:存放該元素的後繼在陣列中的下標,相當於單鏈表中的next指標;

為了方便插入資料,我們通常會把陣列建立得大一些,以便有一些空閒空間而不致於出現溢位情況。

線性表的靜態鍊錶儲存結構:

#define maxsize 1000    //假設鍊錶的長度為1000(個元素)

typedef struct

component,staticlinklist(maxsize);

2.備用鍊錶

由於陣列的第乙個和最後乙個元素作為特殊元素處理,不存資料,因此我們把未使用的陣列元素稱為備用鍊錶。

因此,我們規定:

(1)陣列第乙個元素(即下標為0的元素)的游標cur存放

第乙個空閒空間元素的下標(

備用鍊錶的第乙個元素);

(2)陣列最後乙個元素的游標cur存放

第乙個有數值的元素的下標(相當於單鏈表中的頭結點作用)。當整個鍊錶為空時則最後乙個元素的游標cur為0。

(3)鍊錶的最後乙個有值元素的cur為0

昇華筆記:如何將一維陣列list中各分量鏈成乙個備用鍊錶?

typedef  int status

status initlist(staticlinklist list)

list[maxsize-1].cur=0;    //目前靜態鍊錶為空,最後乙個有值元素的cur為0   

}二、靜態鍊錶的插入/刪除操作

靜態鍊錶的插入和刪除操作,最關鍵是要解決如何用靜態模擬動態鍊錶結構的儲存空間的分配,需要時申請,無用時釋放。

1.靜態鍊錶的插入操作

(1)演算法思路

為了辨明陣列中哪些分量未被使用,解決的辦法是將所有違背使用過的及已被刪除的分量用游標cur鏈成乙個備用的鍊錶(即空鍊錶),每當進行插入時,便可以從備用鍊錶上取得第乙個結點(

即未被使用的第乙個結點

)最為待插入新結點。

實現獲取空閒分量下標malloc_sll函式演算法:

a.獲取陣列第乙個元素的游標cur=i,其存放的是備用鍊錶的第乙個空閒結點;

b.將陣列第i個元素的游標cur=i+1賦值給頭指標

c.返回被使用的陣列元素下標

int i=list[0].cur;         //如i=list[0].cur=7

list[0].cur=list[i].cur; //頭指標list[0].cur=list[7].cur=8

return i;

(2)原始碼實現/*1.若備用空間鍊錶為空,則返回分配的結點下標,否則返回0*/

int malloc_sll(staticlinklist list)

return i;//返回被使用的下標 }

//注釋:假如先前list[0].cur=7(陣列下標值),當下標為7的分量(陣列元素)準備被使用了,就得有接替者,所以把分量7(

list[i].cur,其中i=7

)的cur值=8,賦值給頭元素(list[0].cur),之後就可以繼續分配新的空閒分量。//

/*2.在l中第i個元素之前插入新的資料元素e*/

typedef int status

typedef int 

elemtype

status listinsert(staticlinklist l,int i,elemtype e)

return error; }

注釋:第i個元素,是指鍊錶的第i個元素,非陣列下標儲存位置。

i-插入靜態鍊錶位置;j-儲存空間空閒位置;

2.靜態鍊錶的刪除操作

原始碼實現

/*1.將下標為k的空閒結點**到備用鍊錶*/

void free_ssl(staticlinklist space,int k)

/*2.刪除在l中第i個資料元素e*/

typedef int status

status listdelete(staticlinklist l,int i)

/*3.初始條件:靜態鍊錶l已經存在。操作結果:返回l中資料元素個數*/

int listlength(staticlinklist l)

return j; }

三、靜態鍊錶的優缺點

1.優點

在插入和刪除操作時只需要修改游標,不需要移動元素,從而改進了在順序儲存結構中的插入和刪除操作需要移動大量元素的缺點;

2.缺點

(1)沒有解決連續儲存分配帶來的表長度難以確定的問題;

(2)失去了順序儲存結構隨機訪問的特性;

05 線性表 四 鏈式儲存結構 靜態鍊錶

鏈式儲存結構.靜態鍊錶 一 靜態鍊錶1.靜態鍊錶儲存結構單鏈表是通過指標實現的,但是我們也可以通過陣列來代替指標描述單鏈表,即靜態鍊錶。如何實現靜態鍊錶?構造陣列的元素由兩個資料域組成 data和cur,即陣列的每個下標都對應乙個data和乙個cur。資料域data 用來存放資料元素,即要處理的資料...

4 線性表 鏈式儲存 靜態鍊錶

一開始對照書上的總覺得 不對!傻吊搗鼓了兩小時,總算弄出來了 自己用電腦打的感覺。果然跟光看書不一樣,還是不能懶。靜態鍊錶說明 1 0號節點為備用空間鍊錶的頭結點,maxsize 1號節點為實際鍊錶空間首結點。2 需要使用者自己實現malloc和free函式。3 辨明陣列中哪些分量未被使用的解決辦法...

線性表 鏈式儲存結構 雙向鍊錶

雙向鍊錶結點結構 既然單鏈表可以有迴圈鍊錶,那麼雙向鍊錶當然也可以有。由於這是雙向鍊錶,那麼對於鍊錶中的某乙個結點p,它的後繼結點的前驅結點是它本身。實現 s next p s prior p prior p prior next s p prior s 關鍵在於交換的過程中不要出現矛盾,例如第四步...