| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1320 人关注过本帖
标题:[原创]基础单链表思考,初学链表者请进
只看楼主 加入收藏
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
结帖率:66.67%
收藏
 问题点数:0 回复次数:10 
[原创]基础单链表思考,初学链表者请进

很久以前学链表的时候写的,想在以前做斑竹的一个论坛发,结果都没发就倒闭了,汗! 本来我想请教的,不过后来我想明白了,写了一些通俗的解释,希望初学链表的看得懂。 老问题了,小弟不才,连最简单的链表都还没understand,希望大家知道什么说什么。 小弟还未弄懂的是其中“can't understand”的两句,我不能想像它们在内存中的工作,

#include<iostream.h> typedef int ElemType; struct LNode { ElemType data; LNode* next; };

void main() { LNode *p, *q, *p1; p1=p=new LNode; for(int i=0; i<3; i++) { q=new LNode; cin>>q->data;

p->next=q; //can't understand p=q; //can't understand

} p->next=NULL; p=p1->next; while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; }

p->next=q; //p的指针指向q p=q; //这句到底是怎么赋值法?把q->data和q->next分别赋给p->data和p->next吗?

但是输入的是q->data,储存的是p->data,why?老师说用先进后出的压栈图形来理解…… 还是不懂,相信很多初学者也和我一样困扰在链表的抽象工作方式上吧, 请高手们不吝指点,也请和我一样初学的人知道多少就说多少,我真的不懂!谢谢!

PS: 上年学C++基础时就没搞懂,现在正学C++数据结构,还是没懂,真不配做版主,不好意思哦^_^

上贴是上个星期想问的问题,不过那天论坛上不了,所以现在才发,但现在我经已想通了。

我觉得,可能很多高手都明白的知识,在像我这样的初学者看来是晦涩难懂的, 所以我写了一些注释,希望和大家切磋一下怎么理解链表的抽象赋值和遍历形式。

#include<iostream.h>

typedef int ElemType;

struct LNode { ElemType data; LNode* next; };

void main() { LNode *p, *q, *p1; //p1是表头指针,p1单链表 //p是遍历指针,q是临时储存结点

p1=p=new LNode; //p1和p指向同一个新申请的结点 //p1不作结点用,也不再变动

for(int i=0; i<3; i++) { q=new LNode; cin>>q->data; //新建一个结点,作临时用

p->next=q; //p指针现在处于表头指针p1的位置 //此句即是把表头指针指向新建的结点

p=q; //这句就是令我费解多时的表达式 //开始以为是把q的结点值data和next指针赋给p //我就傻眼了,怎么把临时值赋回头了 //原来p也作指针用,此句只是把p指针从p1的位置 //移到当前临时结点q的位置罢了 //值得注意的是,下一次循环新建q指向的结点 //令原先建的临时结点不再属于q指针 //所以才会定义一个p指针作移动用途 //只不过此p指针带有data结点罢了,但在 //储存过程不须用到,打印时才用到 }

p->next=NULL; //循环结束后最后一个结点的next指针置空值NULL

p=p1->next; //移动指针p重新指向表头指针所指的第一个结点 //为遍历链表作准备

while(p!=NULL) //当移动指针p没到最后的NULL时执行循环 { cout<<p->data<<" "; p=p->next; //此处也是抽象之极,开始想不通怎么把自己的next指针 //所指向的结点反赋给自己,后来才知道,不是赋值语句 //而p把自己在当前结点的data位置移动到有本身next //所指的下一个结点的data上,这样当cout打印的时候, //p->data就一直往后移,达到遍历效果 } cout<<endl; }

搜索更多相关主题的帖子: 链表 单链 内存 LNode 基础 
2004-08-31 23:11
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 

写得不错嘛~~来,给颗糖鼓励你一下.

怎么收起玩心不和KNOCKER吵架啦?


淘宝杜琨
2004-09-01 00:27
天使预备役
Rank: 2
等 级:论坛游民
威 望:3
帖 子:670
专家分:10
注 册:2004-4-6
收藏
得分:0 

老兄你又出错了,怎么new(运算符)可以在C中使用么????

[此贴子已经被作者于2004-09-01 09:40:55编辑过]


差点把你忘了...
2004-09-01 09:40
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 

大哥,这是C语言教室,记住是C啊,不是C++;

俺 看不懂


2004-09-01 14:01
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
以下是引用天使预备役在2004-09-01 09:40:29的发言:

老兄你又出错了,怎么new(运算符)可以在C中使用么????

呵呵,不好意思,我以前在旧论坛做的是C++的斑竹,我知道不行的。不过用惯了VC,没注意到
2004-09-01 19:05
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

没关系的,我顺便讲解一下,new的作用比malloc好得多,不是我说的,C++所有教材都是这样说。

例如我们要申请内存空间,就这样:

char *a; //定义一个指针 a = new char[6]; //new关键字后跟类型char,一般该类型都和指针a一致,也可以不一致。而中括号里面的数字代表要申请的空间量,这里6是说要申请6个char字符型的空间。然后要注意的是,括号里面的一定要是常量。

2004-09-01 19:10
niujiba
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2004-9-2
收藏
得分:0 

感谢斑竹给小弟上了一课!!!!!!

2004-09-03 19:47
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
以下是引用niujiba在2004-09-03 19:47:53的发言:

感谢斑竹给小弟上了一课!!!!!!

我回帖不是因为你的感谢,而是因为你的ID名字也太……

2004-09-03 22:04
忆楠
Rank: 1
等 级:新手上路
帖 子:721
专家分:0
注 册:2004-7-5
收藏
得分:0 
以下是引用live41在2004-09-03 22:04:16的发言:

我回帖不是因为你的感谢,而是因为你的ID名字也太……

哈哈 我也看到了 用这样的ID 不怕管理员封你的号阿

点 鼠 标 , 救 饥 民 http://www./
2004-09-03 22:12
Liming_686
Rank: 1
等 级:新手上路
帖 子:64
专家分:0
注 册:2006-4-9
收藏
得分:0 

感谢斑竹了,我是初学.

2006-12-13 09:40
快速回复:[原创]基础单链表思考,初学链表者请进
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018788 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved