目錄演算法理解
鍊錶的組成
演算法實現
板子題-解析
約瑟夫:luogu p1145
由於約瑟夫僅僅涉及到了鍊錶的刪除,所以這裡換一題:
題目描述
有n個人(編號1到n)排隊,一開始這n個人從1到n號順序排隊,接下來出現q次插隊,每一次為x號插入到了y號的後面,詢問最終結果。
輸入第一行兩個數字,代表\(n\),\(q\)
接下來\(q\)行,每行兩個數字\(x\),\(y\)代表\(x\)號插入到了\(y\)號的後面
輸出\(q\)次插入後的結果
樣例輸入
5 3樣例輸出1 22 4
3 5
1 4 2 5 3提示
【樣例解釋】
原始資料:1 2 3 4 5
一次插隊:2 1 3 4 5
兩次插隊:1 3 4 2 5
三次插隊:1 4 2 5 3
\(1\leq n,q\leq100000\)
鍊錶其實就是一種資料結構,鍊錶的每乙個節點可以分成兩個區域,分別是資料域和指標域,資料域代表鍊錶的資料,可以是乙個變數或陣列,也可以是一堆變數(結構體)。而指標域就可以分為前驅和字尾。
struct node;//其實不一定要用指標(我也不用)
這裡就貼一張圖吧。預設資料域有乙個int型別的數字,並且帶有字首的鍊錶。
graph lr
a[鍊錶]-->b(頭指標)
a-->c(乙個節點)
d(最後乙個節點)-->e(尾)
其中尾一般就是nuul(空指標)或者是\(-1\)。
首先,為初賽的同學們說一下,鍊錶和陣列各有長處,沒有好壞,除非拿出一道具體的題目出來。
刪除鍊錶的刪除就不想陣列那麼麻煩,因為指標域有很大的好處,方法如下:(雙向鍊錶)
就這樣,**如下:
a[a[x].pre].nex=a[x].nex;
a[a[x].nex].pre=a[x].pre;//刪去x點
這裡就不怎麼需要順序。
插入插入就不畫圖了,你們應該懂,但是插入就需要順序了,這個很重要。**:
a[a[y].nex].pre=x;
a[x].nex=a[y].nex;
a[y].nex=x;
a[x].pre=y;
這裡吧x插在y的後面。
雖然從字面上來看,僅僅是插入,但是在插入之前,這個點要刪除掉,所以必須要用雙向鍊錶。
**::
#include#define maxn 100039
using namespace std;
int n,t;
struct nodea[maxn];
int head,x,y,i;
int main(){
scanf("%d%d",&n,&t);
for(i=2;iend.
學習筆記 鍊錶 鍊錶入門
重新學習程式語言日記,2011年12月29日 09 17分 定義乙個結構體 struct linkhead,p1,p2 首先定義了乙個結構體,結構體包括指標域,資料域。這個結構體就是你鍊錶裡面的節點。每個節點都包括了資料域,指標域。有了這麼乙個結構體。肯定就需要初始化這個結構體了。寫個函式來初始化鍊...
鍊錶學習筆記 順序鍊錶
順序鍊錶的主要思想就是使用乙個整型陣列來儲存資料的指標。在建立記憶體的時候如圖,用後面的陣列來儲存指標。大量使用 給void重新起個名字 封裝使用的資料j 讓其對使用者是透明的 typedef void seqlist typedef void seqlistnode seqlist seqlist...
鍊錶學習筆記 雙向鍊錶
這次 寫的是迴圈鍊錶,用的是節點連線。雙向鍊錶相比與一般鍊錶要注意的地方就是 頭部插入和尾部插入 不要進行空指標操作。非鍊錶尾部的處理 if next null node pre current 如果是在頭部插如 則沒有 前節點 if i 0 tlist lenght return 0 dlinkl...