| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1038 人关注过本帖
标题:[求助] 创建链表的相关问题
只看楼主 加入收藏
qkjenjoy
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2007-8-24
收藏
 问题点数:0 回复次数:11 
[求助] 创建链表的相关问题
struct node { ---
int date; |
node* next; |--->定义了一个node结构(其中包含了数据域和指针域)
}; |
---

void push (node** headRef,int date) {
node* newNode=new node;
newNode->date=date;
newNode->next=*headRef;
*headRef=newNode;
}

void main() {
node* head=NULL;
push(&head,3);
push(&head,2);
push(&head,1);
}
请各位友人帮我逐条解释下以下语句流程,实在弄不明白了!
特别请讲解一下那些红色字体的东西 等等的东西,谢谢,在线等~~~

[此贴子已经被作者于2007-9-3 9:26:02编辑过]

搜索更多相关主题的帖子: 链表 
2007-09-03 09:13
qkjenjoy
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2007-8-24
收藏
得分:0 
2007-09-03 09:40
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 

你拿支笔,在纸上把各个对象标示出来,再跟着push函数,画他的运行过程,你就清楚了!

其实不用指针的指针也行,就用个结点指针按引用传递也OK!

[此贴子已经被作者于2007-9-3 11:29:13编辑过]


Fight  to win  or  die...
2007-09-03 11:03
wsy
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2007-9-2
收藏
得分:0 
我也是个菜 不太懂  一起慢慢 学 呵呵

2007-09-03 12:33
qkjenjoy
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2007-8-24
收藏
得分:0 
3楼兄弟:给个具体点的讲解嘛,学习一下。
2007-09-03 14:52
qwl1982
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2007-9-3
收藏
得分:0 

流程是这样的
首先定义结构体node~ 它拥有两个数据成员
整形的data和指针型的next
node* head=NULL;//把头指针置空
push(&head,3);//添加第一个节点,调用push函数
此时push函数执行的操作是
node* newNode=new node;//建立一个新节点
newNode->date=date; 把//data的值也就是3赋给该节点的data;
newNode->next=*headRef;//把该节点的next指针指向headRef 此时headRef为NULL
*headRef=newNode;//把该节点,也就是第一个节点的地址赋给headRef
这样链表的第一个节点就完成了,他的next指针为空,data值为3
然后开始添加第二个节点
push(&head,2);//添加第二个节点,调用push函数
此时push函数执行的操作是
node* newNode=new node;//建立一个新节点
newNode->date=date; 把//data的值也就是2赋给该节点的data;
newNode->next=*headRef;//把该节点的next指针指向headRef 此时headRef为第一个节点的地址
*headRef=newNode;//把第二个节点的地址赋给headRef
这样第二个节点完成了,他的next指针指向第一个节点的地址,data值为2
同理,建立第三个节点
push(&head,1);添加第三个节点,调用push函数
第三个节点的next指针为第二个节点的地址,data值为1.

我也是初学者,希望能和大家互相交流共同提高。同时也希望老鸟高手们不吝赐教,多加指点。谢谢~


2007-09-04 02:32
qwl1982
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2007-9-3
收藏
得分:0 
补充一下,因为使用的是引用调用,每次调用push函数后headRef的值都保留了下来。所以其实headRef是一个临时的指针变量。作用是把上一个节点的地址赋给当前节点的next指针后,存储当前节点的地址。以便在添加后续节点时,通过headRef获取前一个节点的地址。

2007-09-04 02:38
qkjenjoy
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2007-8-24
收藏
得分:0 
有点不明白函数调时Push(&head,3) 其中第一个参数&head,是对一个空指针的引用,

而函数定义时,void Push(node** headRef,int date),其中node** headRef,是一个什么类型啊? 形参类型和实参类型是一样的吗????
2007-09-04 08:32
qwl1982
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2007-9-3
收藏
得分:0 

这是函数按地址传递参数。 以我的理解 headRef 是结构体对象的指针 head也是结构体对象指针
因为是node *head嘛


2007-09-04 09:00
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
以下是引用qkjenjoy在2007-9-4 8:32:38的发言:
有点不明白函数调时Push(&head,3) 其中第一个参数&head,是对一个空指针的引用,

而函数定义时,void Push(node** headRef,int date),其中node** headRef,是一个什么类型啊? 形参类型和实参类型是一样的吗????

int *p1 = 0;
int **p2 = &p1;

这样就能解释你的疑问了。

那里之所以要用指向指针的指针,是因为剩去了函数的引用参数传递。
void push (node *&head,int date) { //引用参数传递
node* newNode=new node;
newNode->date=date;
newNode->next=head;
head=newNode;
}

如果去掉引用,这段代码就是错的,因为这时head=newNode这个head是传入参数的副本(指针的地址不一样)。不能作用于实参。

而如果用上面的指向指针的指针,尽管也copy了一次,但是对这个副本解引用*headRef=newNode得到的地址是实际参数。

用笔比画比画将会更透彻。


Fight  to win  or  die...
2007-09-04 09:12
快速回复:[求助] 创建链表的相关问题
数据加载中...
 
   



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

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