靜態鍊錶是使用順序儲存結構來實現的鍊錶。嚴蔚敏《資料結構(c語言版)》在介紹靜態鍊錶時使用的是乙個姓氏列表。
圖1是書本上的靜態鏈表示例,圖(a)是初始化後插入了8個姓氏的鍊錶,圖(b)是在第5個元素前插入了「shi」而刪除了「wang」的結果。
圖1:靜態鏈表示例
(a)修改前的狀態;(b)修改後的狀態
現在,我們就來實現一下這個靜態鍊錶。實際上靜態鍊錶與一般含有指標的鍊錶沒有太大的差別,只是靜態鍊錶的結點存放的空間不是在使用時臨時分配的,而是在一開始就分配了固定的一些,一般是用陣列。同時一般的鍊錶使用指標來指向下乙個結點而在靜態鍊錶中則使用陣列下標了。大家如果看嚴蔚敏的書會發現書上的演算法還是有些問題的。下面我就直接給大家展示一種靜態鍊錶的實現演算法。
最重要的是模擬系統分配記憶體的過程。可以預先定義乙個全域性陣列(space)作為後面分配的空間,然後再初始化這個陣列,為以後分配做準備,如圖2。初始化後,這個陣列中的狀態應該如圖3(a)一樣。這樣,陣列的第0個節點就是用來標識哪個結點可用來儲存資料的。那麼如果是含有頭結點的靜態鍊錶,則一般開始時陣列的第1個節點就是用來存放頭結點的,此時陣列第0個結點標識第2個結點可以用來儲存資料,而第1個結點(靜態鍊錶的頭結點)的下乙個結點下標為0,標識著這個靜態鍊錶為空,如圖3(b)。靜態鍊錶的初始化以及插入刪除各種演算法與一般的鍊錶是相似的。具體描述如下:
圖2:型別定義、用來模擬記憶體的陣列定義以及初始化
圖3:模擬記憶體的陣列狀態。(a)初始化後的狀態,(b)給靜態鍊錶分配頭結點後的狀態
圖5:給靜態鍊錶中的結點分配儲存空間,實際上返回的是陣列中可用的結點下標
圖6:釋放靜態鍊錶中結點的儲存空間
靜態鍊錶的儲存空間(圖2中的
space
)始終只有
11個節點,起始為空表。
insert a e
代表在第
a個姓氏前插入姓氏e;
delete a
代表刪除第
a個姓氏;
search e
代表查詢姓氏
e的位置;
show
代表輸出靜態鍊錶儲存空間的狀態。輸入保證操作都合法。
只遇到search
和show
時才輸出。當遇到
search
時輸出姓氏e在
space
中的位置;當遇到
show
時輸出這
11個結點的狀態。姓氏佔
8個字元而數字佔
2個字元,姓氏左對齊。每個指令輸出後面跟著含有
20個星號的行。
show
insert 1 zhao
show
insert 2 qian
show
insert 3 sun
show
insert 4 li
insert 5 zhou
insert 6 wu
insert 7 zheng
insert 8 wang
show
insert 1 zhang
show
search li
show20
3456
78910
0********************32
zhao 045
6789
100********************42
zhao 3
qian 056
78910
0********************52
zhao 3
qian 4
sun 067
89100
********************102
zhao 3
qian 4
sun 5
li 6
zhou 7
wu 8
zheng 9
wang 0
0********************010
zhao 3
qian 4
sun 5
li 6
zhou 7
wu 8
zheng 9
wang 0
zhang 2
********************
5********************010
zhao 3
qian 4
sun 5
li 6
zhou 7
wu 8
zheng 9
wang 0
zhang 2
********************
#include #include #define maxsize 11 // 靜態鍊錶的長度
typedef char elemtype[8]; // 元素的型別,規定姓氏不超過7個字元
typedef struct
nodetype; // 節點型別
nodetype space[maxsize]; // 用來儲存節點的陣列,相當於一般鍊錶中的記憶體,
// 只是那個記憶體是系統分配的,我們看不到
typedef struct
slinklist; // 靜態鍊錶型別的定義,和一般的鍊錶類似
int locateelem_sl(slinklist& s, elemtype e)
void initspace_sl()
int malloc_sl()
void free_sl(int k)
void insert_sl(slinklist& s, int i, elemtype e)
newnodeindex = malloc_sl(); // 分配新的節點
strcpy(space[newnodeindex].data,e); // 在新的節點中存入資料
space[newnodeindex].cur = 0; // 指標為空,這一點很重要
space[newnodeindex].cur = space[cur].cur; // 插入靜態鍊錶中
space[cur].cur = newnodeindex;
s.length++; // 插入後靜態鍊錶長度加1
}void delete_sl(slinklist& s, int i)
delcur = space[cur].cur; // 找到待刪除節點的下標
space[cur].cur = space[delcur].cur; // 刪除節點
free_sl(delcur); // 釋放節點
s.length--; // 刪除後靜態鍊錶長度減1
}void createlist_sl(slinklist& s) // 建立靜態鍊錶
void show_space()
{ // 將靜態鍊錶中所有的節點顯示出來
int i;
for(i=0; i
HNCU1742 演算法3 3 迷宮
有乙個 10 x 10 的迷宮,起點是 s 終點是 e 牆是 道路是空格。乙個機械人從起點走到終點。當機械人走到乙個通道塊,前面已經沒有路可走時,它會轉向到當前面向的右手方向繼續走。如果機械人能夠過,則留下足跡 如果走不通,則留下標記 下面給出書中的演算法,請你模擬機械人的走法輸出最終的狀態。圖 迷...
《演算法導論》習題2 1 3
考慮以下查詢問題 輸入 n個數的乙個序列a 和乙個值 v 輸出 下標i使得 v a i 或者當 v 不在 a中時,v 為特殊值nil。寫出線性查詢的偽 它掃瞄整個序列來查詢 v。使用乙個迴圈不變式來證明你的演算法是正確的。確保迴圈不變式滿足三條必要的性質。偽 find key a,v fori 1 ...
HNCU 1746 演算法4 1,4 3 定位子串
題目描述 將子串在母串中第一次出現的位置找出來。圖1 在母串中第pos個位置定位子串的演算法 圖2 從母串中第pos個位置獲得長度為len的子串 輸入 若干對字串,每對字串佔一行並用乙個空格分開。前乙個字串為母串,後者為子串。字串只包含英文本母的大小寫。每個字串不超過98個字元。輸出 輸出子串在母串...