靜態鍊錶你學會了嗎

2021-10-01 10:59:35 字數 3458 閱讀 5076

最近在複習大學學習的靜態鍊錶資料結構,從**分析結構,卡在了備用鍊錶那裡,通過畫圖分析才掌握了它的結構。

首先我們先來看看靜態鍊錶的結構定義

typedef

struct

component,staticlinklist[maxsize]

;

status initlist

(staticlinklist l)

l[maxsize-2]

.cur =0;

//備用鍊錶的表尾

l[maxsize-1]

.cur =0;

//資料鏈表表頭

return ok;

}

初始化為空的靜態鍊錶如下圖一所示

圖一 空的靜態鍊錶

接下來才是重點!!!實際上靜態鍊錶分為兩個鍊錶:備用鍊錶和資料鏈表(兩表的表頭位置如上圖一所示)。備用鍊錶將未使用空間串聯起來,資料鏈表才是真正存放資料的地方,那麼具體是怎樣儲存資料的呢?接下來我們在資料鏈表中插入數字1,看以下向資料鏈表中插入資料的**:

status insertlist

(staticlinklist l,

int i,elemtype e)

printf

("備用鍊錶為空!\n");

return error;

//備用鍊錶為空

}

int

malloc_l

(staticlinklist l)

return i;

}

呼叫如下插入函式,其效果如下圖二。

圖二 向備用鍊錶新增乙個元素

圖二中用紅色字型標註的顯然是資料鏈表了,剩下的黑體字標註的是備用鍊錶,每當要插入乙個資料時,備用鍊錶中便有一塊空間轉化成資料鏈表的空間,其轉換細節分為以下四個步驟:

記錄備用煉表頭l[0]游標,更改l[0]游標為2,使其指向l[2],此時備用鍊錶操作完成

給l[1]的資料元素賦值,l[1]將加入資料鏈表中

遍歷資料鏈表l[4]到要插入位置(第i位置)的前乙個資料元素(第i-1位置),將位於i-1位置的元素游標賦值給位於i位置的元素游標

將插入元素的位置i賦值給位於i-1位置的元素游標,資料鏈表的插入操作完成

通過以上步驟的分析相信大家都已經熟悉了靜態鍊錶的插入操作,那麼接下來再執行以下函式,你們能畫出靜態鍊錶的資料結構圖嗎?

insertlist

(l,1,2

);

參考圖如下,是不是畫對了呢?

圖三 向備用鍊錶新增乙個元素

#include

#define maxsize 5

#define error 0

#define ok 1

typedef bool status;

typedef

int elemtype;

typedef

struct

component,staticlinklist[maxsize];

status visit

(elemtype c)

;//刷出函式

status initlist

(staticlinklist l)

;//初始化靜態鍊錶

intmalloc_l

(staticlinklist l)

;//返回備用煉表表頭所指向的第乙個空閒空間供插入元素,更新表頭游標指向下一空閒空間

status insertlist

(staticlinklist l,

int i,elemtype e);

status deletelist

(staticlinklist l,

int i)

;void

free_l

(staticlinklist l,

int j)

;int

listlength

(staticlinklist l)

;void

outlist

(staticlinklist l)

;int

main()

outlist

(l);

printf

("插入兩個元素後鍊錶的長度為:%d\n"

,listlength

(l))

;deletelist

(l,2);

outlist

(l);

printf

("刪除乙個元素後鍊錶的長度為:%d\n"

,listlength

(l))

;return0;

} status initlist

(staticlinklist l)

l[maxsize-2]

.cur =0;

//用鍊錶的表尾

l[maxsize-1]

.cur =0;

//資料鏈表表頭

return ok;

}//返回備用煉表表頭所指向的第乙個空閒空間供插入元素,更新表頭游標指向下一空閒空間

intmalloc_l

(staticlinklist l)

return i;}

status insertlist

(staticlinklist l,

int i,elemtype e)

printf

("備用鍊錶為空!\n");

return error;

//備用鍊錶為空}

status deletelist

(staticlinklist l,

int i)

void

free_l

(staticlinklist l,

int j)

intlistlength

(staticlinklist l)

return j;

}void

outlist

(staticlinklist l)

printf

("\n");

} status visit

(elemtype c)

Say「No」,你學會了嗎?

say no 你學會了嗎?2004 年,當蕭聖璇剛回國加入微軟亞洲工程院時,有乙個現象讓他難以適應 開會討論時,大家要麼三緘其口,要麼發表的意見不溫不火,會議結束後,大家卻接二連三地來到他的辦公室,開始對會議上的問題發表看法。在蕭聖璇看來,這些原本要在開會時解決的問題,為什麼非要留到會後才提出來?蕭...

CSS你學會了嗎

css樣式 1 文字域內容解析換行,解析換行符 white space pre wrap 2 全域性黑白色 須在html上設定 html 3 水平垂直居中 center 水平垂直居中 span div 預設初始化樣式 body center 1 line height水平垂直居中 父節點固定px高度...

Say「No」,你學會了嗎?

say no 你學會了嗎?2004 年,當蕭聖璇剛回國加入微軟亞洲工程院時,有乙個現象讓他難以適應 開會討論時,大家要麼三緘其口,要麼發表的意見不溫不火,會議結束後,大家卻接二連三地來到他的辦公室,開始對會議上的問題發表看法。在蕭聖璇看來,這些原本要在開會時解決的問題,為什麼非要留到會後才提出來?蕭...