靜態鍊錶詳解(C語言版)

2021-10-09 21:48:11 字數 4142 閱讀 2735

邏輯結構上相鄰的資料元素,儲存在指定的一塊記憶體空間中,資料元素只允許在這塊記憶體空間中隨機存放,這樣的儲存結構生成的鍊錶稱為靜態鍊錶。也就是說靜態鍊錶是用陣列來實現鏈式儲存結構,目的是方便在不設指標型別的高階程式語言中使用鏈式結構。它的優點是和動態鍊錶一樣,刪除和插入元素時間複雜度低;不足是和陣列一樣,需要提前分配一塊較大的空間。

1、結構描述

使用結構體陣列來構造靜態鍊錶,結構體陣列內的每乙個元素充當靜態鍊錶的結點。每個結點都包含資料域與游標這兩部分,資料域用來存放資料、游標用來指示該結點的下乙個結點對應的陣列下標。有了這樣的乙個結構那麼我們要如何來對靜態鍊錶進行管理呢?靜態鍊錶的管理分為對已申請結點的管理和對未申請結點的管理。

首先來談談如何來對已申請結點進行管理,將靜態鍊錶0位置的結點設定為頭結點head,用它來對已申請的結點進行管理。該結點的特點是資料域不存資料,游標為第乙個申請結點所對應的下標(如果該靜態鍊錶還未申請結點來存放資料,那麼該值為-1表示該靜態鍊錶為空。),這樣一來就可將各個結點像動態鍊錶結點一樣組織連線起來進行管理。

了解了對已申請結點的管理方法之後,我們再來談談對未申請結點的管理。未申請的結點也就是待分配的結點,對它們的管理方式可以模仿對已申請結點的管理方式。我們可以將靜態鍊錶1位置的結點設定為備用區的頭結點pool,它的資料域不存放資料,它的游標值是第乙個未申請結點對應的下標(如果該結點之後不存在未申請的結點,那麼游標值為0表示該結點之後不存在未申請的結點),這樣一來也就可以將各個未申請的結點像動態鍊錶結點一樣組織連線起來進行管理。

2、**描述

這裡將靜態鍊錶的最大空間設定成20個結點(未申請結點+已申請結點),讀者可根據需求更改靜態鍊錶的最大空間。

#define max_size 20

#define elemtype char

typedef

struct listnode

listnode;

//靜態鍊錶實際上就是乙個結構體陣列

typedef listnode staticlist[max_size]

;

1.初始化

//初始化

void

initslist

(staticlist &space)

//備用區的最後乙個空間,後無可以空間,游標為0

space[max_size-1]

.cur =0;

//初始化時為空的靜態鍊錶,無資料結點,頭結點的游標為-1

space[0]

.cur =-1

;}

2、結點資料顯示

//顯示靜態鍊錶中的資料

void

showslist

(staticlist &space)

printf

("nul.\n");

}

3、結點申請

//申請靜態鍊錶結點

intmalloc_sl

(staticlist &space)

4、頭插

//靜態鍊錶的頭插

void

insert

(staticlist &space, elemtype x)

space[i]

.data = x;

//如果之前靜態鍊錶中無資料結點,需要更改頭結點的指向

if(space[0]

.cur ==-1

)else

//如果之前已經有資料結點那麼直接頭插

space[0]

.cur = i;

}

5、釋放結點(空間**)

//**空間

void

free_sl

(staticlist &space,

int k)

6、頭刪

//靜態鍊錶的頭刪

void

delete

(staticlist &space)

下面給出靜態鍊錶測試原始碼

main.cpp

#include

"staticlist.h"

void

main()

//顯示靜態鍊錶的資料

showslist

(sl)

;delete

(sl)

;//頭刪

showslist

(sl)

;}

staticlist.h

#ifndef __staticlist_h__

#define __staticlist_h__

#include

#define max_size 20

#define elemtype char

typedef

struct listnode

listnode;

//靜態鍊錶實際上就是乙個結構體陣列

typedef listnode staticlist[max_size]

;int

malloc_sl

(staticlist &space)

;void

free_sl

(staticlist &sapce,

int k)

;void

initslist

(staticlist &space)

;void

insert

(staticlist &space, elemtype x)

;void

delete

(staticlist &space)

;void

showslist

(staticlist &space)

;#endif

//__staticlist_h__

staticlist.cpp

#include

"staticlist.h"

//申請靜態鍊錶結點

intmalloc_sl

(staticlist &space)

//**空間

void

free_sl

(staticlist &space,

int k)

//初始化

void

initslist

(staticlist &space)

//備用區的最後乙個空間,後無可以空間,游標為0

space[max_size-1]

.cur =0;

//初始化時為空的靜態鍊錶,無資料結點,頭結點的游標為-1

space[0]

.cur =-1

;}//靜態鍊錶的頭插

void

insert

(staticlist &space, elemtype x)

space[i]

.data = x;

//如果之前靜態鍊錶中無資料結點,需要更改頭結點的指向

if(space[0]

.cur ==-1

)else

//如果之前已經有資料結點那麼直接頭插

space[0]

.cur = i;

}//顯示靜態鍊錶中的資料

void

showslist

(staticlist &space)

printf

("nul.\n");

}//靜態鍊錶的頭刪

void

delete

(staticlist &space)

迴圈鍊錶(C語言版)

circlelinklist.h define ok 1 define error 0 typedef int status typedef int elemtype typedef struct cnode cnode typedef struct cnode clinklist status i...

資料結構鍊錶C語言版 單向鍊錶詳解

最近在準備計算機考研,正在複習資料結構的知識點,剛開始學習鍊錶的時候實在是有些痛苦,在痛苦了幾個小時後,終於有所收穫,在此記錄一下 相鄰元素之間通過指標連線。最後乙個元素的後繼指標為null。鍊錶的空間能夠按需分配。沒有記憶體空間的浪費。typedef struct node node 定義乙個st...

LeetCode 旋轉鍊錶 C語言版

題目 給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 k 個位置,其中 k 是非負數。輸入 1 2 3 4 5 null,k 2 輸出 4 5 1 2 3 null 解釋 向右旋轉 2 步 4 5 1 2 3 null 解題思路 首先用len記錄鍊錶長度 只需要用k模上len,就可以判斷是否鍊錶是否...