解題**
用陣列描述的單鏈表叫做靜態鍊錶,它兼顧了順序表和煉表的優點於一身,可以看做是順序表和煉表的公升級版。使用靜態鍊錶儲存資料,資料全部儲存在陣列中(和順序表一樣),但儲存位置是隨機的,資料之間"一對一"的邏輯關係通過乙個整形變數(稱為"游標",和指標功能類似)維持(和鍊錶類似)。
使用乙個陣列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。當前狀態下頭指標指向第乙個節點的位址0。idx = 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
所有操作保證合法。
10h 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個元...