作者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)