作者cpfmarnbg (秋虫回音)
看板NTUE-CS100
标题Re: [课业]召唤守护神建中哥Q口Q
时间Fri Mar 28 23:48:58 2008
※ 引述《yantchen (球童Yanting)》之铭言:
: ※ 引述《gingkoginkgo (人中拉拉!)》之铭言:
: : node本身就是像int一样的资料型别(型态?)吗?
: : 还是说他还有其他的功用?
: node 在标准的 C++ 里面不存在喔
: 要用 class 自己定义
: : 那 所谓的heap(head?)是什麽呢?
: : 今天上课看到老师似乎有宣告了出这个鬼O_O?
: : 就我那一天只要一碗饭一瓢水的大脑 理解出来是这样Orz
: : 每个data被存放的记忆体位置不同 但是我们在读取时必须要照顺序
: : 所以需要利用指标来标记
: : 记 忆 体 位 置 非 连 续
: : heap(?) A1 B2 C3 D4 E5
: : ▔▔▔▔ ▔▔▔▔ ▔▔▔▔ ▔▔▔▔ ▔▔▔▔ ▔▔▔▔
: : 我是空的 data01 data02 data03 data04 null
: : 没资料 ↘ ↑ ↘ ↑
: : 指标L1 指标L2
: heap是一种父亲一定比小孩大或小的complete binary tree
: link list 里面只向第一个项目的指标叫做 head
: 用箭头是我们示意的表示法 实际上电脑记忆体里面长这个样子
: instance | head a1 a2 a3 a4
: --------------------------------------------
: address | 0x12 0x18 0x23 0x11 0x56
: |
: data | null 1 3 2 7
: |
: link | 0x18 0x23 0x11 0x56 null
: 只要有head指向第一个资料 就可以利用link找到下一个资料
: 另外语法的部份
: C++里面
: int a; // a 是 int 型态的变数
: mystack b; // b 是 mystack 型态的变数
: int* c;
: int *c; // c 是 指标变数 指向 int 型态的变数 *号两个位置都OK
: mystack* d;// d 是 指摽变数 指向 mystack 型态的变数
: 指标变数的用法:
: c=&a; // &a代表a的位址(例如0x8793) c是指标 所以里面存的是位址
: e=*c; // *c代表c这个位址里面的资料 因为c指向a 所以 e 会得到 a 的数值
: 假设class mystack的定义如下
: class mystack{
: int data;
: mystack* link;
: }
: b.data=10;
: b.link=&e;
: d->data=15;
: d->link=&b;
: class里面定义的属性
: 一般变数用.来存取 例如上面的b.data
: 指标变数用->来存取 例如上面的d->data
: : 就概念来讲 电脑读完data01後 接着找的是指标L1 而L1本身是纪录data02的位置
: : 就可以读取到data02 後面就一直跟着指标走到null
: : 有错请用力鞭<(_ _)>
: : 不过 还是有不知道该怎麽打的问题
: : 问题(a).和-> 两个差在那里? 要用在哪里?(因为像老师在黑板上用的是->而非.)
: : (b)如果是三个data还好 不过如果是50个的话 我猜就会用回圈来写了
: : 不过要怎麽写?(建立一个阵列去存指标吗? )
: : 引申的问题有两个(1)怎麽才能存那堆指标的? 用阵列? stack?
: : (2)要怎样才能输出?
: : 插入和删除的部分我还要再研究(叹)
: 的确是用回圈
: 假设你要找第50笔资料
: 就用回圈从head的link往下找50次
前面就恕我不整理了
有关於 (b)如果是三个data还好 不过如果是50个的话 我猜就会用回圈来写了
不过要怎麽写?(建立一个阵列去存指标吗? )
引申的问题有两个(1)怎麽才能存那堆指标的? 用阵列? stack?
(2)要怎样才能输出?
建立阵列去存指标会遇到一点问题
比如说
建立了一个50个指标的阵列
但是你还是只得到了50个指标而已
并没有得到50个物件
如果未了产生这些物件而去建立一个50个物件的阵列
那就失去做这样一个串链(?)的意义了
在下经过一些尝试後写出了以下的碗公 不嫌弃的话就加减看看吧
以下是我的物件写法
先大概看一下有啥就好後面会在介绍哪里用到什麽东西
class chain{ //因为觉得有点像链子的资料型态 所以用chain命名
public:
void dti(int &i){data=i;} //输入资料用函数 读入一个整数参考
int dto(){return data;} //输出资料用 回传"data"
void pti(chain *i){link=i;} //输入连结对象用 读入一个"chain的指标"
/*(这里虽然用"i"和上面的"dti(int &i)"相同 不过这个读入部分取的名称
只会作用在这个函数之内 所以只要读入的名称和含数里用的名称相呼应
和其他函数重复也没有关系)*/
chain *pto(){return link;} //输出连结对象 回传"link"
private:
int data; //存放一个整数资料
//(如果要存放其他型态的资料或着更多其他资料也是在这边宣告.命名)
chain *link; //存放连结到下一个资料的指标
};
要怎麽用这碗公
该include的那些 该using namespace那些 就掠过
灰字的部份是详细解释
main(){
int i=0,j=0,k=0,sum=0;//操作用
//(这些东西用来操纵回圈 输入资料 妙用无穷(?!))
chain *h = new chain;//标示串链起始位置的指标
/*(就是所谓的头(head?) 用来标示资料串的起始位置
并确保资料串的起始位置不会在程式执行中遗失)*/
chain *ptct = new chain;//指定作业对象的指标
/*(就是让程式记忆 "现在" 东西执行到哪里(哪一个资料)
如果将资料比喻成很多台电脑 那麽这个指标就好像是我的"手"
将它放在哪一台电脑的键盘滑鼠上 就可以控制那一台电脑做事)*/
//制造chain
ptct=h; //先将我的控制目标指向这串资料的头
cin >> j; //指定要建造几个资料
while(i<j){ //会执行j次(0,1,2...(j-1))
(/*我曾经试着用for 不过好像会失败 编译没有问题
但是程式会作业无效)*/
ptct->pti(new chain);
/*(都知道"new"这个指令是向程式要求一个资料(变数) "并且回传他的位置"
EX:int char ...当然包含用class定义过的chain
课本里可以找到的用法如 int *a = new int;
"建立一个新的指标"a" 然後将他的值 指定为"一个新的int资料的位置"
而ptct->pti(xxx)则是会将"xxx"输入到ptct的"link"
也就是说 这句话的意思相当於
"用ptct->pti()这个函数存入一个位置到"指标ptct->link" 而这个位置是
来自於 new chain 这个指令(建立一个新的chain资料并回传其位置)
所以 在这一行里 我们同时执行了
1.建立新chain
2.将新chain的位置储存到ptct->link(存放连结到下一个资料的指标))*/
ptct=ptct->pto();//将ptct->pto()的回传值送回ptct
/*(ptct->pto()这个函式是将ptct->link中的位置读出来
当这个位置送入了ptct(指标)的时候 ptct也就指向了一个不同的资料
也就是我们刚刚将他的地址存入的 新chain资料
注意 在执行完这行指令之前 我们操纵的是"h" 执行完这行指令之後
我们操纵的就是一个新资料 我们姑且称之为"h1"
(因为使用new产生的资料并不具备程式中的名称))*/
sum++;//这部份是为了将来输出全部资料和掌握总资料数而设定的
i++;//这部份是为了控制回圈
/*(要分开两个变数是因为以後i在其他地方使用的时候还会改变
所以无法取代sum的功能 i在此只做为这个回圈的控制变数而已)*/
}
}
这样就把资料建立好噜
那要怎麽存东西进去咧
有一个方法是建立的时候同时输入
也就是ptct->pti(new chain);的下面
直接加上
cin >> k;
ptct->dti(k);
这样就可以在建立资料的同时输入资料值
另外的方法则是建立後利用for回圈
ptct=h; //一样 在进行操作前先将控制目标转移到头
for(i=0;i<sum;i++){ //这时候sum的功能就出来了
ptct=ptct->pto();//将控制目标转到下一个资料
/*(也就是说 你一开始进来的时候指向"h"跑完这行就会指向"h1"
等到回圈跑完又回到这里 就会从指向"h1"变成指向"h2" 依此类推)*/
cin >> k;
ptct->dti(k);//这边就是将资料输入到目前指向的资料
}
ok 回圈跑完也输入完了
读取 就将输入那2行换成cout << ptct->dto(); //(排版的部份可以适当使用endl之类)
至於其他的 目前我想到的 像是 指定目标编辑/读取.搜寻 等等 都是用类似的概念
至於怎麽"插入"新资料 之类的 我还没研究 可能就以後再说 或着交给能人啦 XD~
另外因为个人函数名称变数名称啥的都取的怪里怪气 造成各位阅读困扰 在此致歉噜
其实也不难看出涵义 EX:dto 就是 data out. ;pt则是连结的简写 ;ct是control之类
那...明天还要早起...
各位晚安~
祝 游戏愉快 (?!)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.166.221.141
※ 编辑: cpfmarnbg 来自: 118.166.221.141 (03/28 23:55)
※ 编辑: cpfmarnbg 来自: 118.166.221.141 (03/28 23:57)