作者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
1F:推 CaptainWill:我成功了,感谢彦廷~ 03/15 23:19
2F:推 pk873:大推前面 只不过最後一句....宵夜文 囧 03/15 23:22
3F:推 Arashinoon:还剩下38分钟 这篇文章能救到多少人呢 03/15 23:22
4F:→ pk873:钰安表示:昨天作业就交了 今天看你们在那边赶作业 真爽 03/15 23:23
5F:→ yantchen:我先把时间开到3点好了XD 03/15 23:23
6F:→ CaptainWill:感谢大神 囧rz 03/15 23:24
7F:推 dosomethnig:好神= = 03/15 23:27
8F:推 gcobc12632:我可以直接问 这次两个作业都没交会怎样吗(抖 03/15 23:35
9F:推 CaptainWill:会GG.... 03/15 23:39
10F:推 tea19901028:耶~~感谢彦廷 听说时间改道3点罗!!还有救啦! 03/15 23:50
11F:推 gentlefaith:阿牧要来不及了= = 03/15 23:53
12F:→ gentlefaith:耶斯!! 我要来得及了!! 03/15 23:55
13F:推 Tuko:学长有讲到我耶~好高兴! 03/16 00:05
14F:推 garfield112:真的是3点吗@@? 03/16 00:15
15F:推 gcobc12632:作业3的互换要怎麽搞= =? 03/16 00:17
16F:推 Arashinoon:楼上你被骗了 其实到12点而已 (逃 03/16 00:17
17F:推 CaptainWill:凸口你说讲到你是在说最後一句吗? 03/16 00:25
18F:→ yantchen:欸欸太过分了居然有人怀疑我说的话 03/16 00:32
19F:推 Tuko:第25行的回答:挖阿灾~ 03/16 00:36
20F:推 gentlefaith:花花好球XD 03/16 00:41
21F:→ yantchen:花花!! 我不要吃凸口.. 囧 03/16 00:49
22F:推 CaptainWill:XD 03/16 00:52
23F:推 Arashinoon:我猜是这句吧 ( 我画那麽多口干麻呀 凸口 ) 03/16 00:53
24F:→ Tuko:楼上英明 03/16 07:49