作者yantchen (球童Yanting)
看板NTUE-CS102
標題Re: [課業] 前三個作業
時間Mon Mar 15 23:18:08 2010
作業3是我要用火車來解釋
火車一定有個頭 然後每節車廂後面都有個勾勾 勾到下一節車廂
之前的陣列呀 他是一連串的東西 佔用連續的空間
如果以後要寫很大的程式 他需要很大的空間
例如說 int a[129938493803928304803843];
假設你記憶體也是夠 只是同時執行了別的程式
□是空的
■是被佔用的
□□□□□□■■■□□□□■□□□□□
這時候 直接要記憶體 電腦就跟你說他沒了
但是如果一塊一塊要的話 把它串起來
□→
□→
□→
□→
□→
□■■■□→
□→
□→
□■□→
□→
□→
□→
□
\__↗ \↗
( 我畫那麼多口幹麻呀 凸口 )
這樣就可以把零碎的空間拿起來用了
首先 我門需要一個火車頭 勾到第一節火車 這樣我門才知道整串火車在哪
一開始 鐵軌上面是空的 head火車頭鉤子是放在地板上 俗稱接地
head-
--------------------------→地
這是軌道
然後我門需要另外一個火車頭 把新的車廂(st) 帶到軌道上 跟 head還有其他節接再一起
node→
[st]☆
先把 st 後面的鉤鉤
勾到 head後面的車廂 也就是 地
head-
--------------------------→地
↗
node→
[st]┘
最後把 head 接到 st
head-
-------------------┐ 地
↘ ↗
node→
[st]┘
這樣就完成第一節
head-
-------------------→[st]-→地
↑
node
接著是第二節
先產生新的給node帶進來
head-
-------------------→[st]-→地
node→
[st]
然後重複上面的步驟
把新的st接到原本head接的地方(這次不是地囉)
head-
-------------------→[st]-→地
↗
node→
[st]
然後把 head 改接到新的st上面
head-
----------------┐ [st]-→地
↘ ↗
node→
[st]
第二節就接上去了
head-
-----------→[st]--→[st]-→地
重複上面的步驟 就可以串n節火車囉
切換到程式碼
首先 st 要新增一個指到下一個的指標 老師用 ptr 我覺得還是改用 next 比較會意
class st{
int id;
int grade;
st *next;
public:
void setid(int i)
{
id=i;
}
int getid()
{
return id;
}
void setgrade(int g)
{
grade=g;
}
int getgrade()
{
return grade;
}
void setnext(st *n)
{
next=n;
}
st *getnext()
{
return next;
}
};
主程式的部份 先寫輸入 等下講輸出
為了簡化 我這裡先寫5節
你可以自己想想怎麼改成n節(例如先輸入n 或者學號輸入-1代表後面沒了)
int main(){
int x,y,i;
st *head=NULL, *node;
for(i=0;i<5;i++)
{
// 產車廂
node=new st; // 也可以寫 new(st);
// cin輸入
cout<<"..."; // 這裡可以加請輸入blabla
cin>>x>>y;
node->setid(x); // st物件的時候用 .setid
node->setgrade(y); // st指標的時候用 ->setid
// 接到原本head接的
node->setnext(head);
// head接上來
head=node;
}
}
這樣就完成接火車的動作囉
最後是印出來
印出來很簡單
第一節就是 head 印出第一節的分數就是
cout<<head->getgrade();
第二節就是 head->getnext(); 印出分數就是
cout<<head->getnext()->getgrade();
所以要印出第6節的分數就是
head->getnext()->getnext()->getnext()->getnext()->getnext()->getgrade();
很麻煩吧 要是要印出第100節的東西
改一個寫法
node=head; // 一開始node跟head勾到同一節
cout<<node->getgrade(); // 印出node的分數
node=node->getnext(); // 改勾下一節
cout<<node->getgrade(); // 印出node的分數
node=node->getnext(); // 改勾下一節
cout<<node->getgrade(); // 印出node的分數
node=node->getnext(); // 改勾下一節
...
這樣
然後再簡化 把它改成迴圈
因為我們知道最後一節是接地(NULL)
所以可以把迴圈設定成 看到地 就不玩了
node=head;
while(node!=NULL)
{
cout<<node->getgrade();
node=node->getnext();
}
這樣全部拼起來 第三個作業就OK了
還有些缺的地方啦 像是只會印出成績 你可以加上ID跟第幾名
至於他印出來的順序 剛好跟輸入的順序相反
這是對的
你可以想想怎麼把它改成正的 但有點麻煩 下次上課會說
呼呼 吃宵夜去
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 120.127.36.183
推 CaptainWill:我成功了,感謝彥廷~ 03/15 23:19
推 pk873:大推前面 只不過最後一句....宵夜文 囧 03/15 23:22
推 Arashinoon:還剩下38分鐘 這篇文章能救到多少人呢 03/15 23:22
→ pk873:鈺安表示:昨天作業就交了 今天看你們在那邊趕作業 真爽 03/15 23:23
→ yantchen:我先把時間開到3點好了XD 03/15 23:23
→ CaptainWill:感謝大神 囧rz 03/15 23:24
推 dosomethnig:好神= = 03/15 23:27
推 gcobc12632:我可以直接問 這次兩個作業都沒交會怎樣嗎(抖 03/15 23:35
推 CaptainWill:會GG.... 03/15 23:39
推 tea19901028:耶~~感謝彥廷 聽說時間改道3點囉!!還有救啦! 03/15 23:50
推 gentlefaith:阿牧要來不及了= = 03/15 23:53
→ gentlefaith:耶斯!! 我要來得及了!! 03/15 23:55
推 Tuko:學長有講到我耶~好高興! 03/16 00:05
推 garfield112:真的是3點嗎@@? 03/16 00:15
推 gcobc12632:作業3的互換要怎麼搞= =? 03/16 00:17
推 Arashinoon:樓上你被騙了 其實到12點而已 (逃 03/16 00:17
推 CaptainWill:凸口你說講到你是在說最後一句嗎? 03/16 00:25
→ yantchen:欸欸太過分了居然有人懷疑我說的話 03/16 00:32
推 Tuko:第25行的回答:挖阿災~ 03/16 00:36
推 gentlefaith:花花好球XD 03/16 00:41
→ yantchen:花花!! 我不要吃凸口.. 囧 03/16 00:49
推 CaptainWill:XD 03/16 00:52
推 Arashinoon:我猜是這句吧 ( 我畫那麼多口幹麻呀 凸口 ) 03/16 00:53
→ Tuko:樓上英明 03/16 07:49