C語言程式設計練習53 靜態鍊錶

2022-06-20 19:00:10 字數 3706 閱讀 4058

題目描述

靜態鍊錶是使用順序儲存結構來實現的鍊錶。嚴蔚敏《資料結構(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個星號的行。

樣例輸入

copy

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

show

樣例輸出 copy

203

4567

89100

********************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

********************

提示1、怎樣將字串型別定義為elemtype呢?形如typedef int num一樣,陣列或者指標可以放在定義的型別名後面,例如將具有8個字元的姓氏定義為elemtype可以這樣定義:typedef char elemtype[8]。

2、題目和書中給的演算法描述還缺少靜態鍊錶的插入、刪除以及顯示,都需要自己寫。

3、要求每個指令輸出後跟乙個空行,別忘了。

4、姓氏佔8個字元,數字佔2個字元,姓氏左對齊,可以這樣輸出printf("%-8s%2d");對於指令search也要輸出佔2個字元的數字。

5、靜態鍊錶初始化時將所有記憶體設為空,可以在initspace_sl中使用下面的方法:

memset(space, 0 ,sizeof(space));

總結:

#include #include #include #include #include #include #include #include #include #include using namespace std;

#define maxsize 11//靜態鍊錶的長度

typedef char name[8];//元素的型別,規定姓氏不超過8個字元

typedef struct

nodetype;//節點型別

nodetype space[maxsize];

typedef struct

slinklist;//靜態鍊錶型別的定義

slinklist s;

void initspace_sl()//初始化

{ //將一維陣列space中的各分量連成乙個備用鍊錶,space.cur為頭指標

//『0』表示空指標

memset(space,0,sizeof(space));

for(int i=0;i**來自:

靜態鍊錶實現(C語言)

對於線性鍊錶,也可用一維陣列來進行描述。這種描述方法便於在沒有指標型別的高階程式語言中使用鍊錶結構。先上 include define maxsize 7 typedef struct slinklist maxsize 初始化靜態鍊錶 void list init slinklist list 插...

靜態鍊錶 C語言描述

靜態鍊錶 1.下標為0的游標存放最後存放資料節點的游標,即是第乙個沒有存放元素 備用鍊錶 的下標 2.最後乙個的節點存放第乙個由數值得下標 3.第乙個和最後乙個都不存放資料 即是備用鍊錶的第乙個的下標 4.最後乙個儲存資料的節點的游標為0 靜態鍊錶主要是根據游標來遍歷,以前沒有指標用的思想 假如我要...

C語言靜態鍊錶和動態鍊錶

1.靜態鍊錶 結構體中的成員可以是各種型別的指標變數,當乙個結構體中有乙個或多個成員的基型別是本結構體型別時,則稱這種結構體為 引用自身的結構體 如 struct link a p是乙個可以指向 struct link 型別變數的指標成員。因此,a.p a 是合法的表示式,由此構成的儲存結構如圖1所...