靜態鍊錶的介紹及實現

2021-10-19 12:15:28 字數 4140 閱讀 2713

解題**

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

使用乙個陣列e[n]來儲存資料,e[i]表示節點i的值。ne[n]表示當前節點的next指標,ne[i]表示節點i的 next 指標是多少。使用head表示頭指標,用來儲存頭結點的下標,初始狀態下head指向尾結點,使用-1表示尾結點。使用idx表示當前已經用到了那個點,從第0個點開始。

例如第乙個節點儲存的資料為6,它的下乙個節點的編號為1,編號為1的節點儲存的資料為9,下乙個節點為尾結點。那麼可以表示為:

初始狀態下頭指標head指向尾結點,表示空鍊錶。尾結點可以使用-1來表示。乙個節點也沒有分配,所以idx初始狀態下為0。這裡的idx可以想象為當前分配的記憶體空間的位址。

// 靜態鍊錶初始化

void

init()

假設當前鍊錶中已經有了寫資料,表示為下圖:

現在要求在第乙個節點之前插入乙個新的節點,節點的值為9。當前狀態下頭指標指向第乙個節點的位址0idx = 2,表示要插入節點的編號為2。首先將數值存入到單鏈表中即e[2] = 9;先讓編號為2的節點的指標指向第乙個節點,即ne[2] = 0;然後再讓頭指標指向編號為2的點,即head = 2,最後將idx++表示下乙個新節點的將要使用的記憶體位址。

// 向煉表頭插入乙個元素

void

addtohead

(int x)

這裡的最後兩步可以直接簡寫為一步使idx先賦值後加一,即head = idx++;。因此頭插法的**可以寫為:

// 向煉表頭插入乙個元素

void

addtohead

(int x)

靜態鍊錶不僅支援在頭結點的位置插入元素,還可以支援在任一乙個合法的位置插入乙個節點。只要是單鏈表可以實現的操作靜態鍊錶都可以實現。以在下標為k的節點的後面插入乙個節點為例:

首先將資料x儲存到新申請到的節點中,即e[idx] = x;,再使新節點的next指標指向第k個節點的下乙個節點的位址,即ne[idx] = ne[k - 1]因為下標是從0開始的,所以第k個節點的下標為k - 1。最後使idx++

同樣也可以將最後兩步進行合併:

靜態鍊錶還有很多操作可以實現,只要單鏈表可以實現的操作這裡提到的靜態鍊錶都可以實現。比如尾插法插入元素、查詢元素、輸出單鏈表的長度等等。這裡就不一一介紹了,感興趣的小夥伴可以按照已有的**自己實現一下。

acwing 826. 單鏈表

實現乙個單鏈表,鍊錶初始為空,支援三種操作:

(1) 向煉表頭插入乙個數;

(2) 刪除第k個插入的數後面的數;

(3) 在第k個插入的數後插入乙個數;

現在要對該鍊錶進行m次操作,進行完所有操作後,從頭到尾輸出整個鍊錶。

注意:題目中第k個插入的數並不是指當前鍊錶的第k個數。例如操作過程中一共插入了n個數,則按照插入的時間順序,這n個數依次為:第1個插入的數,第2個插入的數,…第n個插入的數。

第一行包含整數m,表示操作次數。

接下來m行,每行包含乙個操作命令,操作命令可能為以下幾種:

(1) 「h x」,表示向煉表頭插入乙個數x。

(2) 「d k」,表示刪除第k個插入的數後面的數(當k為0時,表示刪除頭結點)。

(3) 「i k x」,表示在第k個插入的數後面插入乙個數x(此操作中k均大於0)。

共一行,將整個鍊錶從頭到尾輸出。

1 ≤ m ≤ 100000

所有操作保證合法。

10

h 9i 1 1

d 1d 0

h 6i 3 6

i 4 5

i 4 5

i 3 4

d 6

6 4 6 5

#include

using

namespace std;

const

int n =

1e5+10;

int e[n]

, ne[n]

, head, idx;

// 靜態鍊錶初始化

void

init()

// 向煉表頭插入乙個元素

void

addtohead

(int x)

void

del(

int k)

void

add(

int k,

int x)

intmain()

else

if(op ==

'd')

else

}for

(int i = head; i !=-1

; i = ne[i]

) cout << e[i]

<<

" ";

return0;

}

未完待續,持續更新中……

靜態鍊錶的實現

include include define size 6 define struct of static list typedef struct stlist stlist 初始化靜態鍊錶分配空間大小為size個 stlist initlist stlist tempptr of for i in...

靜態鍊錶的實現

用陣列來代替指標,來描述單鏈表 將陣列元素分成兩個資料域,data和cur。data用來存放資料元素,cur存放該元素的後繼在陣列中的下標 游標 游標實現法 線性表的靜態鍊錶儲存結構 define maxsize 1000 typedef struct component,staticlinklis...

靜態鍊錶的實現

2018 8 23 21 35 靜態鍊錶的實現 陣列中第乙個結點表示備用鍊錶的第乙個結點 陣列中最後乙個結點表示鍊錶的第乙個結點 當next域為0時均代表到了當前鍊錶的結尾,因此有兩個陣列單元 0與max 1 無法儲存目標資料 include define max 10 此時靜態鍊錶中只能儲存8個元...