作者game0416 (鳳狼)
看板NTUE-CS102
標題Re: [閒聊] 程設作業
時間Thu Mar 18 00:47:49 2010
hmmmm
我沒朋友,也開不起玩笑。
--
延續插排的概念...作業五的構成
腦袋還沒空掉的話,鏈結可以當成是一套隨時變動長度的陣列
在基本盤來說,能用鏈結串列來做插排確實會比用陣列來得符合概念
只是實做上複雜性比較高一點,建立過程問題比較多,昨天抓個首項bug玩掉一小時(倒
好...再來先做個接下來用的表格說明
正確的長度會隨著說明一個一個冒出來,這裡先當做做出十個了
┌—┬—┬—┬—┬—┬—┬—┬—┬—┬—┐
|0|1|2|3|4|5|6|7|8|9| ←建立順、ID,兩者相同
├—┼—┼—┼—┼—┼—┼—┼—┼—┼—┤
|0|1|2|3|4|5|6|7|8|9| ←串列內順序
├—┼—┼—┼—┼—┼—┼—┼—┼—┼—┤
|1|1|2|4|6|8|9|10|80|99| ←分數內容
└—┴—┴—┴—┴—┴—┴—┴—┴—┴—┘
: 類別部分採前文用的名字、內容
--
先來說明實作法,有其他概念再談hmm
這邊隨意排幾組
┌—┐ ┌—┐ ┌—┐ ┌—┐ ┌—┐
|0| |3| |1| |2| |4|
├—┤ ├—┤ ├—┤ ├—┤ ├—┤
|0| |1| |2| |3| |4|
├—┤ ├—┤ ├—┤ ├—┤ ├—┤
|1| |3| |6| |8| |9|
└—┘ └—┘ └—┘ └—┘ └—┘
現在假設有第5個、4要插入,就沿著串列順序去找大於4的那一個
確認是順序在2的1比較大,就把5的指標指向1(順序2)、3指向5
(5取代成為第2項、後面的跟著自動會往後退一個順序)
變成是
--
插入
↓
┌—┐ ┌—┐ ┌—┐ ┌—┐ ┌—┐ ┌—┐
|0| |3| |5| |1| |2| |4|
├—┤ ├—┤ ├—┤ ├—┤ ├—┤ ├—┤
|0| |1| |2| |3| |4| |5|
├—┤ ├—┤ ├—┤ ├—┤ ├—┤ ├—┤
|1| |3| |4| |6| |8| |9|
└—┘ └—┘ └—┘ └—┘ └—┘ └—┘
我不想多擠一行寫指向的下一項,所以就請稍微心領神會
每一個指向的下一項就看編號順
--
首先,在開始時是NULL,只建立幾個aclass *p指標準備
或是你喜歡也能先
new個位址給指標
我自己是試著整套用同個邏輯走,都放在迴圈內生成
int main(){
aclass *p,*head,*tmp;
}
這裏三個指標,一個用來做運作(p),一個用來指示起始點(head)
tmp主要用來記錄前一項的位址,因為p一定會像前面例子跑到2,抓不到前一個1在哪
: 有另外建立前項指標的寫法另論
再來進每次輸入、生成的部份...因為無聊,所以寫成跟陣列的範例一樣沒有最大上限
這裡用
while製作
剛進迴圈,一樣先不要管類別部份
我們就先接受id、grade後再研究要幹嘛
while(
true){
int id,grade;
cin>>id >>grade;
}
--
針對第一項輸入沒有前後、內容,當作一個特例處理,在while之前設一個bool標記第一次
其他就照常輸入就好
bool start=
true;
while(
true){
int id,grade;
cin>>id >>grade;
if (start){
start =
false;
p = head =
new aclass;
p->setid(id);
p->setgrade(grade);
p->setptr(NULL);
}
else{
}
}
然後是之後開始輸入的每一項,都在else內處理
--
從第二項開始,因為都不確定應該插在哪
因此從頭開始沿著串列比大小,把p跟tmp一起歸零回到第一項
開始沿著過程比大小,找出從哪個地方開始比輸入來得大
尋找要從哪裡插入
else{
p=tmp=head;
while (
true) {
if (grade < p->getgrade())
break;
else {
tmp=p;
if (p->getptr()==NULL)
break;
p=p->getptr();
}
}
--
因為每次都是確定p->getgrade()小於輸入後tmp才變為p
一旦發現有比輸入值來得大的,或是一路沒有比輸入值來得小的數值就跳出
所以整個回圏結束時,tmp的位置一定會剛好是要插入的前一項
: 這部份不懂就多畫幾次圖,搞不懂來問我也無妨...我會看是誰決定怎樣說明
知道要插在哪項之後就很簡單...
new個物件給p、把東西裝裝進去就是了
然後替換一下指標指向位址就好
p =
new aclass;
p->setid(id);
p->setgrade(grade);
p->setptr(tmp->getptr());
tmp->setptr(p);
--
就這樣...插入結束後就把內容印出來看有沒有問題
p=head;
while (
true){
cout <<p->getid() <<'\t' <<p->getgrade() <<'\n';
if (p->getptr()==NULL)
break;
p=p->getptr();
}
嗯...上面這樣算寫完八成左右
殘餘會出現一個bug,在第一項變成新的輸入值時會出錯
會插入到第二項,而不是第一項
為了這點,我是再針對這個特例做處理
在前面偵測要插入在哪的地方多加一點變數判斷
--
加個bool記錄一下是不是第一項需要換
else{
p=tmp=head;
bool first=
true;
while (
true) {
if (grade < p->getgrade())
break;
else {
first=
false;
tmp=p;
if (p->getptr()==NULL)
break;
p=p->getptr();
}
}
--
再來隨著這個判斷
將配置物件內指標指向的地方做一點修改
避免因為first判斷讓程式誤認為只要是first都要擺到第一項前
在判斷式確定應該在前或在後
p =
new students;
p->setid(id);
p->setgrade(grade);
if (first && grade<tmp->getgrade()) {
p->setptr(tmp);
head = p;
}
else {
p->setptr(tmp->getptr());
tmp->setptr(p);
}
這樣就算完成....大概吧
--
完整內容大概就這樣
#include<iostream>
using namespace std;
class students{
public:
int getid();
int getgrade();
students* getptr();
void setid(
int ID);
void setgrade(
int GRADE);
void setptr(students *PTR);
private:
int id;
int grade;
students *ptr;
};
void students::setid(
int ID){id=ID;};
void students::setgrade(
int GRADE){grade=GRADE;};
void students::setptr(students *PTR){ptr=PTR;};
int students::getid(){
return id;};
int students::getgrade(){
return grade;};
students* students::getptr(){
return ptr;};
int main()
{
students *p,*head,*tmp;
bool start=
true;
while(
true){
int id,grade;
cin>>id >>grade;
if (start){
p = head = new students;
p->setid(id);
p->setgrade(grade);
p->setptr(NULL);
start=
false;
}
else{
p=tmp=head;
bool first=
true;
while (
true) {
if (grade < p->getgrade())
break;
else {
first=
false;
tmp=p;
if (p->getptr()==NULL)
break;
p=p->getptr();
}
}
p =
new students;
p->setid(id);
p->setgrade(grade);
if (first && grade<tmp->getgrade()) {
p->setptr(tmp);
head = p;
}
else {
p->setptr(tmp->getptr());
tmp->setptr(p);
}
}
p=head;
while (
true){
cout <<p->getid() <<'\t' <<p->getgrade() <<'\n';
if (p->getptr()==NULL)
break;
p=p->getptr();
}
}
}
--
所恐懼的,不是沒有知識的大眾 所憎恨的,不是深沉幽暗的人心
而是自以為是的思考之聲 而是自恃甚高的執法者
所毀滅的,不是溫馨和諧的世界 這是我最後的期許,沒有憤怒、沒有悔恨
而是自欺欺人的夢境 只剩下,渾沌的死亡呼吸
節自 新月神話-弒王者
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 58.114.76.199
1F:推 CaptainWill:鳳狼幹嘛這麼說... 03/18 00:48
2F:推 Arashinoon:害我突然很好奇到底是發生什麼事情= = 03/18 00:53
3F:推 ip3311:12~34 建立順? 03/18 00:54
4F:→ ip3311: 行 03/18 00:54
5F:→ game0416:建立順序...表示產生的順序(輸入順序) 03/18 00:55
6F:推 yantchen:我的朋友 是鳳娘(握 03/18 00:55
7F:推 CaptainWill:元品跳針= = 03/18 00:56
8F:推 Arashinoon:誰跳針=__= 不就是鳳狼最近文章火藥味很濃 03/18 00:57
9F:推 Arashinoon:我很好奇發生什麼事情霸了 03/18 00:57
10F:噓 dosomethnig:我們是馬吉耶!!! 馬吉PO文 就是要推阿!! 03/18 00:57
11F:→ dosomethnig:準備怒吼了媽?? 沒關係 你問小胖我睡覺都帶耳塞 03/18 00:58
12F:推 suan710:看來當事者出面了.. 03/18 00:58
13F:→ dosomethnig:我們是馬吉耶 03/18 00:59
14F:→ Arashinoon:所以到底是發生什麼大事可以讓鳳狼這麼生氣?? 03/18 00:59
15F:→ Arashinoon:  ̄ ̄ 03/18 01:00
16F:→ suan710:請一哥說明: 03/18 01:00
17F:推 CaptainWill:一哥表示: 03/18 01:01
18F:噓 dosomethnig:ㄜ...我按錯了 我要按1推文的 03/18 01:01
19F:→ dosomethnig:誤會一場 等我睡醒 再幫他推回來 03/18 01:01
20F:推 suan710:看來誤會大囉 揪竟會怎麼樣呢? 讓我們繼續看下去 03/18 01:03
21F:推 Arashinoon:說好的資科向心力呢 快GG了 03/18 01:05
22F:推 CaptainWill:一哥只是開玩笑,別認真 03/18 01:05
23F:推 Arashinoon:我幫一哥推回來一個 03/18 01:07
24F:→ CaptainWill:一哥表示 03/18 01:07
25F:→ s86186654418: 好像在看連載唷 03/18 01:14
26F:推 suan710: 什麼時候出下一集 03/18 01:15
27F:→ Arashinoon: 下集待續 03/18 01:16
28F:→ CaptainWill:你們這群顧吃雞排不幫忙解決事情的人 囧 03/18 01:18
29F:→ Arashinoon:樓上別這樣 我也有幫忙 03/18 01:18
30F:→ s86186654418:coming soon 03/18 01:21
31F:→ CaptainWill: 是說我想吃宵夜了... 03/18 01:23
32F:推 suan710:遺憾的是宿舍出不去派克又關了.. 03/18 01:25
33F:→ Arashinoon:看到上面的雞排我肚子餓了 03/18 01:29
34F:→ CaptainWill:雞排 珍奶 茄汁牛肉麵 味噌拉麵 麻辣鍋 臭豆腐....... 03/18 01:30
35F:→ Arashinoon:幹= = 03/18 01:30
36F:→ CaptainWill:幹很餓.... 03/18 01:31
38F:→ Arashinoon:幹 樓上恐怖連結都不用說的喔 03/18 01:37
39F:→ CaptainWill:說了你會點?! 03/18 01:37
41F:→ Genya0:呵呵呵 03/18 01:40
42F:→ CaptainWill:呵呵 03/18 01:41
43F:→ Arashinoon:我沒存糧了 好餓.... 03/18 01:41
45F:→ Arashinoon:草尼馬的魷魚+美乃滋 03/18 01:42
46F:推 suan710:存糧大拍賣!! 03/18 01:43
47F:→ Arashinoon:樓上有啥 說來聽聽 幹還是算了 會更餓 03/18 01:43
48F:推 pk873: ╴╴╴╴ ▌ 03/18 01:44
49F:→ pk873: /∵ ∴ ∵\ \ ̄ ̄ ̄ ̄ ̄ ̄/ 03/18 01:44
50F:→ pk873: /∴ ∵ ∴ ∵ \ \ / 03/18 01:44
51F:→ pk873: ███████▋ \ / 03/18 01:44
52F:→ pk873: \ ∴ ∵ ∴ ∵/ \ / 03/18 01:44
53F:→ pk873: \∵ ∴ ∵/ \____/ 03/18 01:44
54F:→ pk873:  ̄ ̄ ̄ ̄ 03/18 01:44
55F:→ pk873:頭痛...睡覺去... 03/18 01:44
56F:→ suan710:泡麵X N 糖果 口糧 應有盡有喔 揪咪 03/18 01:45
58F:→ suan710:算了真的要睡了...8點記得叫我 03/18 01:46
59F:→ CaptainWill:這樣睡得著嗎 阿辣? 03/18 01:46
60F:→ Arashinoon:阿花洗個澡?? 還是洗過了 03/18 01:46
61F:→ CaptainWill:我下午從陽明山觀光回來的時候洗過了-ˇ- 03/18 01:47
62F:→ CaptainWill:我要用睡眠來克服肌餓了...掰 03/18 01:49
63F:→ Arashinoon:掰... 03/18 01:51
64F:→ CaptainWill: (講得自己很像難民= = 03/18 01:53
65F:推 pig456654: ◢████████████◤▏ 03/18 10:30
66F:→ pig456654: ◢◤____◢◤____◢◤____◢◤╱ 03/18 10:30
67F:→ pig456654: ◢◤╱ ◢◤╱ ◢◤╱ ◢◤╱ 03/18 10:30
68F:→ pig456654: ◢████◤╱ ◢████◤╱ 03/18 10:30
69F:→ pig456654: ◢◤▏ ▕╱ ▕______◢◤╱ 03/18 10:30
70F:→ pig456654: ◢◤╱ ̄ ̄ ̄ ̄ ◢◤╱ 03/18 10:30
71F:→ pig456654: ◢◤╱ ◢████◤▏ ◢◤╱ 03/18 10:30
72F:→ pig456654: ◢◤╱ ◢◤____◢◤╱ ◢◤╱ 03/18 10:30
73F:→ pig456654: ◢◤╱ ◢◤╱ ◢◤╱ ◢◤╱ 03/18 10:30
74F:→ pig456654:◢████████████◤╱ 03/18 10:30
75F:→ pig456654:▏ ▕╱ 03/18 10:30
76F:→ pig456654: ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 03/18 10:30
小修個BUG
※ 編輯: game0416 來自: 120.127.47.93 (03/22 10:15)