其實鍊錶很早就學過了,但我當時的寫法侷限於陣列模擬,沒有考慮過指標實現(好吧其實當時也就不知道指標這個玩意)但今天突然有人在qq上問我:為什麼用指標實現的鍊錶居然會超時(luogu p1160 佇列安排)!!!然而這個題用陣列模擬就可以過了。
於是我copy了一下她的源**
hljs haskell">#include
#include
using namespace std;
int n,m,p,k,x;
bool b[100001]=;
struct lian;
void show(lian * head)
coutcoutelse
}else
else
}//show(head);
}cin>>m;
for(int i=1;i<=m;i++)
else
else}}
//show(head);
}show(head);
return 0;
}
看完我就震驚了 100多行的 list .
於是就有了乙個指標新手除錯程式的過程。
其實指標還是挺好理解的,大致可以理解為你在乙個變數裡存了乙個位址,這個位址指向了乙個準確的數值,當然也可以指向另乙個指標。通過指標與指標之間的相互操作,我們可以優化很多**。
指標在定義時一般為
hljs cpp">int *x;//定義了乙個int值的指標
/* 其實也可以對結構體定義指標;
*/struct node*list[100],a;//可以定義指標指向結構體
首先,根據題目要求,我需要乙個雙端鍊錶;
而我特別鍾愛於使用結構體
於是就有了先前的定義
hljs perl">struct node
}*list[100100];
然後便開始了模擬的過程,不管三七二十八,先寫了 main 函式。
hljs cpp">int main()
cin>>m;
for(int i=1;i<=m;i++)
outputans();
return
0;}
這裡還差了三樣東西
然後便開始了思考的過程
首先解決插入
由於往乙個數左邊加數和右邊加數完全等價(或者說是逆向操作)
所以只要做出向左邊加數的情況
然後向右加數的時候便可以複製貼上了
重點看**吧,自認為比較易懂
void insert(int num,int i,int op)
list[num]->r=list[i];
list[i]->l=list[num];
}//下面的**是複製過去的,吧 l 和 r 換了一下
if(!op)
list[num]->l=list[i];
list[i]->r=list[num];
}}
這個其實寫過陣列模擬的應該都會
只是稍微注意一下用指標找值的時候用的是「->」
(用慣了結構體的我不知道多少次寫成「.」qaq)
然後是刪除(其實和插入也差不多,每個操作反向來一遍)
hljs cpp">void erase(int num)
if(list[num]->r)
list[num]->l=list[num]->r=null;//刪掉這個點的指標
}
至於輸出時的思路就不在說啦
迴圈跑一邊就過去了
#include
#include
using
namespace
std;
bool b[100100];
struct node
}*list[100100],*temp;
/*用乙個 *list 來存列表
list[1]表示數字1的位置
list[2]表示數字2的位置
以此類推
這樣在 n 左邊或右邊修改時;
直接訪問 list[n] 就好了
少了掃一遍鍊錶的時間
*/int n,m,start;
void insert(int num,int i,int op)
list[num]->r=list[i];
list[i]->l=list[num];
}if(!op)
list[num]->l=list[i];
list[i]->r=list[num];
if(num==start)start=i;
}}void erase(int num)
if(list[num]->r)
list[num]->l=list[num]->r=null;
}int main()
cin>>m;
for(int i=1;i<=m;i++)
node *s=list[start];
while(s)
}
#include
#include
#include
#include
#include
using
namespace
std;
struct nodelist[500500];
int n,m,k,p;
int u;
void output()
cout
void rightadd(int k,int i)
int main()
cin>>m;
for(int i=1;i<=m;i++)
output();
return
0;}
由於是新手,所以指標的**寫的很醜也很長…….. luogu p1160 佇列安排
傳送門 乙個學校裡老師要將班上 n 個同學排成一列,同學被編號為 1 sim n 他採取如下的方法 先將 1 號同學安排進佇列,這時佇列中只有他乙個人 2 n 號同學依次入列,編號為i的同學入列方式為 老師指定編號為i的同學站在編號為 1 sim i 1 中某位同學 即之前已經入列的同學 的左邊或右...
P1160 佇列安排
乙個學校裡老師要將班上n個同學排成一列,同學被編號為1 n,他採取如下的方法 先將1 11號同學安排進佇列,這時佇列中只有他乙個人 2 n 2 n2 n號同學依次入列,編號為i的同學入列方式為 老師指定編號為i的同學站在編號為1 i 1 1 sim i 1 1 i 1 中某位同學 即之前已經入列的同...
P1160 佇列安排
p1160 佇列安排 昨天下午看了一下,感覺肯定要用vector或者佇列,想著自己用的不怎麼好,就沒寫,然後晚上睡不著的時候想到了這題,突然就想到解題辦法了,要不是太晚了我就起床寫了,今天寫了一遍就ac了,哈哈哈 這題比較好玩吧。定義乙個二維陣列,每個數的左右兩個數分別用第二維的陣列0和1存,進行操...