資料結構 C 實現之靜態鍊錶

2021-10-04 19:12:02 字數 3739 閱讀 4259

1、概念

靜態鍊錶,也是線性儲存結構的一種,它兼顧了順序表和煉表的優點於一身,可以看做是順序表和煉表的公升級版。使用靜態鍊錶儲存資料,資料全部儲存在陣列中(和順序表一樣),但儲存位置是隨機的,資料之間"一對一"的邏輯關係通過乙個整形變數(稱為"游標",和指標功能類似)維持(和鍊錶類似)。

2、儲存結構

struct component

;typedef component staticlinklist[maxsize]

;//結構體陣列

3、初始化陣列中的第乙個元素和最後乙個元素作為特殊元素處理,不存放資料。通常把陣列中未存放資料的元素稱為備用鍊錶。而陣列的第乙個元素,即下表為0的元素的cur存放備用鍊錶的第乙個結點的下標;陣列中最後乙個元素,即下標為(maxsize - 1)的元素的cur存放第乙個有數值的元素的下標,相當於單鏈表中頭結點的作用。

/*初始化陣列線性表,也是將陣列鏈結成備用鍊錶,其中space[0].cur代表頭指標*/

status initlist

(staticlinklist &space)

4、靜態鍊錶插入操作1)插入前我們需要考慮,由於要多存入乙個元素,那麼就要考慮分配空間問題。即從鍊錶中備用空間裡拿出一空間,具體如下:

/*靜態鍊錶返回空閒空間下標,也是進行插入元素的準備操作(類似動態鍊錶的分配空間)*/

intmalloc_sl

(staticlinklist space)

//返回分配的結點下標,否則返回0

return i;

}

2)插入新元素,具體我們這裡舉例將在「乙」 「丁」中間插入「丙」

/*靜態鍊錶的插入操作*/

status listinsert

(staticlinklist &l,

int i, elemtype e)

return error;

}

5、靜態鍊錶刪除操作1)刪除時,需要考慮第一刪除位置合不合理?

2)刪除元素資料後,資料空間的**問題,即怎麼將它恢復到備用鍊錶中?

3)刪除元素的目標鍊錶實際元素資料長度?多長問題

4)就是刪除元素的前後元素游標怎麼變化?下面以刪除「甲」為例

//將刪除節點空間進行**,**為備用鍊錶中

void

free_sl

(staticlinklist &space,

int k)

//k表示刪除元素再鍊錶中的下標

/*返回靜態鍊錶中資料元素的個數*/

intlistlength

(staticlinklist l)

return count;

}/*刪除l中第i元素的資料e*/

status listdelete

(staticlinklist &l,

int i)

6、完整**

#include

"iostream"

using

namespace std;

/*線性表的操作包括如下幾種

(1) initlist(&l) 初始化,構造乙個空的線性表

(2) listempty(&l) 判斷線性表是否為空,true or flase

(3) clearlist(&l) 清空線性表中的內容

(4) getelem(&l,i,e) 返回線性表i位置上的元素值,通過e返回

(9) listinsert(&l,i,e) 如果線性表存在了,而且i符合條件,則在i位置插入乙個元素e

(10)listdelete(&l,i,) 刪除i位置上的元素

(5) listlength(l) 返回線性表的長度

*/#define maxsize 1000

#define ok 1

#define error 0

typedef

int status;

typedef

int elemtype;

struct component

;typedef component staticlinklist[maxsize]

;//typedef可以掩飾復合型別,如指標和陣列

/*初始化陣列線性表,也是將陣列鏈結成備用鍊錶,其中space[0].cur代表頭指標*/

status initlist

(staticlinklist &space)

/*靜態鍊錶返回空閒空間下標,也是進行插入元素的準備操作(類似動態鍊錶的分配空間)*/

intmalloc_sl

(staticlinklist space)

//返回分配的結點下標,否則返回0

return i;

}/*返回靜態鍊錶中資料元素的個數*/

intlistlength

(staticlinklist l)

return count;

}/*靜態鍊錶的插入操作*/

status listinsert

(staticlinklist &l,

int i, elemtype e)

return error;

}//將刪除節點空間進行**,**為備用鍊錶中

void

free_sl

(staticlinklist &space,

int k)

//k表示刪除元素再鍊錶中的下標

/*刪除l中第i元素的資料e*/

status listdelete

(staticlinklist &l,

int i)

intmain()

cout << endl;

cout <<

"please hello world!"

<< endl;

listdelete

(mylist,2)

;//刪除元素

//遍歷並輸出該鍊錶上的所有資料

cout <<

"遍歷並輸出該鍊錶上的所有資料:"

<< endl;

i = mylist[

999]

.cur;

while

(i) cout << endl;

system

("pause");

return0;

}}

輸出結果:

遍歷並輸出該鍊錶上的所有資料:13

250please hello world!

遍歷並輸出該鍊錶上的所有資料:12

50

C 資料結構之靜態鍊錶

struct node class slist 1.建構函式 new乙個很大的陣列,輸入n個元素,並把next賦值為下乙個元素的下標 陣列中的所有next都要初始化 在非空表的最後設定結束標誌,next不指向任何下標,賦值為 1,初始化非空表和空閒表的頭指標 slist slist int n fo...

C資料結構 靜態鍊錶

對於線性鍊錶可用一維陣列來進行描述,這種描述方法便於在沒有指標型別的高階程式語言中使用鍊錶結構,即使用陣列描述的鍊錶稱為靜態鍊錶。由於全域性陣列是儲存在靜態區也叫做靜態鍊錶。c語言具有指標能力使其非常容易地操作記憶體中的位址和資料,對於物件導向的語言雖然不使用指標,但因為啟用了物件引用機制,從某種角...

資料結構鍊錶 靜態鍊錶

1 在這裡我們首先要複習一下鍊錶c語言的定義 這看起來很簡單,但實際上至關重要!data域 存放結點值的資料域。next域 存放結點的直接後繼的位址 位置 的指標域 鏈域 也就是說next域儲存的是乙個位址,這個位址是下一節點的位址。注意 鍊錶通過每個結點的鏈域將線性表的n個結點按其邏輯順序鏈結在一...