c++简单问题
下面是建立链表的函数,我有很多地方不懂,帮帮忙啊structnode{intdata;node*next;};node*Creat(){node*p1,*p2,*head...
下面是建立链表的函数,我有很多地方不懂,帮帮忙啊
struct node{
int data;
node * next;
};
node * Creat()
{
node *p1,*p2,*head;
int a;
head=0; //A 为什么要把头指针置为0?头指针不是指向第一个节点的地址吗?
cout<<"产生一条无序链表,请输入数据,以-1结束:"<<endl;
cin>>a;
while(a!=-1){
p1=new node; B //建立新节点,动态为结点分配内存空间?然后使一个结构体指针指向这个结点?
p1->data=a; C // 给指针p1指向的节点的数据域赋值?
if(head==0){ //前面已经使头指针置为0了,为什么此处还要判断呢?
head=p1;p2=p1;//这个我就不明白了?p1怎么同时赋给p1,p2?
}
else{
p2->next=p1;p2=p1;//还有这个
}
cin>>a;
}
if(head)p2->next=0; //怎么又判断头指针啊
return(head);
}
我自学的,没人教,菜鸟,高手来耐心指导一下啊
建立链表的过程中不需要指明节点变量名,只需要声明指向该结点的指针名,对吗?头结点是不是第一个元素的节点?这个程序有没有涉及到?头指针是指向头结点还是指向第一个元素的节点啊?要昏啊?大家来说说啊
看我的问题补充啊,我菜鸟一个 展开
struct node{
int data;
node * next;
};
node * Creat()
{
node *p1,*p2,*head;
int a;
head=0; //A 为什么要把头指针置为0?头指针不是指向第一个节点的地址吗?
cout<<"产生一条无序链表,请输入数据,以-1结束:"<<endl;
cin>>a;
while(a!=-1){
p1=new node; B //建立新节点,动态为结点分配内存空间?然后使一个结构体指针指向这个结点?
p1->data=a; C // 给指针p1指向的节点的数据域赋值?
if(head==0){ //前面已经使头指针置为0了,为什么此处还要判断呢?
head=p1;p2=p1;//这个我就不明白了?p1怎么同时赋给p1,p2?
}
else{
p2->next=p1;p2=p1;//还有这个
}
cin>>a;
}
if(head)p2->next=0; //怎么又判断头指针啊
return(head);
}
我自学的,没人教,菜鸟,高手来耐心指导一下啊
建立链表的过程中不需要指明节点变量名,只需要声明指向该结点的指针名,对吗?头结点是不是第一个元素的节点?这个程序有没有涉及到?头指针是指向头结点还是指向第一个元素的节点啊?要昏啊?大家来说说啊
看我的问题补充啊,我菜鸟一个 展开
6个回答
展开全部
//A 为什么要把头指针置为0?头指针不是指向第一个节点的地址吗?
第一次产生是,链表为空,此为初始化链首指针;
B //建立新节点,动态为结点分配内存空间?然后使一个结构体指针指向这个结点?
对呀!
C // 给指针p1指向的节点的数据域赋值?
有什么问题?给数据赋值啊
//前面已经使头指针置为0了,为什么此处还要判断呢?
以处来区分加入的节点是不是链表第一个节点,也即是否是链首节点
;//这个我就不明白了?p1怎么同时赋给p1,p2?
这是指对节点为链首节点的情况,加入节点后,链首指针指向此节点,当前节点指针也是指向该节点
//还有这个
这个为不是链首节点的情况,把哨兵节点指向该节点,然后把哨兵节点往后移,即为当前节点,注:可以理解哨兵节点为上一个节点
//怎么又判断头指针啊
非零(空)即为真,此时链表不为空了,此处表明已经结束输入,已经把所有节点加入链,然后把链尾指针置为空
回答者: meteortent - 助理 三级 11-12 10:19
head=0; //A 为什么要把头指针置为0?头指针不是指向第一个节点的地址吗?
A:因为现在没有任何节点。
p1=new node; B //建立新节点,动态为结点分配内存空间?然后使一个结构体指针指向这个结点?
B:你说的对。pi是一个指针,它的值就是新建结构体申请到的内存空间地址。
p1->data=a; C // 给指针p1指向的节点的数据域赋值?
C:你说的对。
if(head==0){ //前面已经使头指针置为0了,为什么此处还要判断呢?
因为这是循环,表头在没有任何节点的情况下,要给它一个地址,否则,就给最后一个节点“连”在后面。
head=p1;p2=p1;//这个我就不明白了?p1怎么同时赋给p1,p2?
p2->next=p1;p2=p1;//还有这个
这是写代码的人的问题,他变量名字没有起好。实际上p1的作用是每次记录新申请到的节点地址。p2的作用是记录目前链表最后一个节点地址。没次p1申请到一块,如果head=0,那么它就是表头,当然也是表尾,给p2。
又申请到一块,判断一下,表头已经有了,那么就人让它连到当前最后节点p2后面(p2->next=p1;),然后p2再指向插入后的最后节点。这样越连越长……
if(head)p2->next=0; //怎么又判断头指针啊
循环已经结束。
如果head有值,说明表已建立好,让最后一个节点的next指针为0;不然表不就一直乱指了?
a.头指针初始化,因为现在链表是空的,所以先指向空,等有了内容再指向头,这句通常不这么写,指针通常不赋值为0,通常赋值为NULL,虽然意义是一样的。
b.为p1分配内存
c.把输入的数据赋给p1的数据。
if(head==0)这句你看好是在循环里的,如果是第一个数据,那就是把头指向它了,如果不是,那就执行else里的语句,把数据连接进链表
if(head)p2->next=0;这句就是判断链表是否为空,如果不为空,就把链表的最后一个数据的指针置空,标示是链表结尾。
另外你这个程序除了new是c++的东西,其他的都是c语言,如果你没有c语言基础,最好先看c语言再学c++,申请内存可以用malloc
有其他问题可以发站内信。
先看下head,p1,p2的作用,p1是用来保存临时的数据a的,head指向表头,p2指向表尾。
head设置为0和head设置为NULL在这里是一样的。
B,C就是你说的那样。
head==0是判断表头是否为空。
表头为空,p1赋值给表头,链表就1个元素,所以把表尾p2也设置为p1。
p2->next=p1把p2的next指向新建立的p1.p2=p1还是把p2指向表尾,实际上就是p2=p2->next.
if(head)p2->next=0;输入结束后,判断链表是否为空,不为空则给p2->next赋值NULL,标记链表结束。
node * Creat()
首先这个函数头就写错了.用结构体声明时应前加struct,应该是struct node * Creat().
A:头结点为0是因为刚开始链表为空,head=NULL.NULL在宏定义中为0.
B:对.
C:对.
D:这个判断是为链表刚开始创建的时候做的工作
E:赋给head是为了使head指向链表的头;P1是申请的结点,P2是链表里的尾结点
F:将尾结点P2里的next指针指向P1刚申请的结点,并使P1刚申请的结点作为尾结点,并让P2始终指向链表的尾结点.
G:上面while语句结束,表明链表输入结束,最后要使尾结点的NEXT指向空,否则不知道next里的值是什么,执行后果严
第一次产生是,链表为空,此为初始化链首指针;
B //建立新节点,动态为结点分配内存空间?然后使一个结构体指针指向这个结点?
对呀!
C // 给指针p1指向的节点的数据域赋值?
有什么问题?给数据赋值啊
//前面已经使头指针置为0了,为什么此处还要判断呢?
以处来区分加入的节点是不是链表第一个节点,也即是否是链首节点
;//这个我就不明白了?p1怎么同时赋给p1,p2?
这是指对节点为链首节点的情况,加入节点后,链首指针指向此节点,当前节点指针也是指向该节点
//还有这个
这个为不是链首节点的情况,把哨兵节点指向该节点,然后把哨兵节点往后移,即为当前节点,注:可以理解哨兵节点为上一个节点
//怎么又判断头指针啊
非零(空)即为真,此时链表不为空了,此处表明已经结束输入,已经把所有节点加入链,然后把链尾指针置为空
回答者: meteortent - 助理 三级 11-12 10:19
head=0; //A 为什么要把头指针置为0?头指针不是指向第一个节点的地址吗?
A:因为现在没有任何节点。
p1=new node; B //建立新节点,动态为结点分配内存空间?然后使一个结构体指针指向这个结点?
B:你说的对。pi是一个指针,它的值就是新建结构体申请到的内存空间地址。
p1->data=a; C // 给指针p1指向的节点的数据域赋值?
C:你说的对。
if(head==0){ //前面已经使头指针置为0了,为什么此处还要判断呢?
因为这是循环,表头在没有任何节点的情况下,要给它一个地址,否则,就给最后一个节点“连”在后面。
head=p1;p2=p1;//这个我就不明白了?p1怎么同时赋给p1,p2?
p2->next=p1;p2=p1;//还有这个
这是写代码的人的问题,他变量名字没有起好。实际上p1的作用是每次记录新申请到的节点地址。p2的作用是记录目前链表最后一个节点地址。没次p1申请到一块,如果head=0,那么它就是表头,当然也是表尾,给p2。
又申请到一块,判断一下,表头已经有了,那么就人让它连到当前最后节点p2后面(p2->next=p1;),然后p2再指向插入后的最后节点。这样越连越长……
if(head)p2->next=0; //怎么又判断头指针啊
循环已经结束。
如果head有值,说明表已建立好,让最后一个节点的next指针为0;不然表不就一直乱指了?
a.头指针初始化,因为现在链表是空的,所以先指向空,等有了内容再指向头,这句通常不这么写,指针通常不赋值为0,通常赋值为NULL,虽然意义是一样的。
b.为p1分配内存
c.把输入的数据赋给p1的数据。
if(head==0)这句你看好是在循环里的,如果是第一个数据,那就是把头指向它了,如果不是,那就执行else里的语句,把数据连接进链表
if(head)p2->next=0;这句就是判断链表是否为空,如果不为空,就把链表的最后一个数据的指针置空,标示是链表结尾。
另外你这个程序除了new是c++的东西,其他的都是c语言,如果你没有c语言基础,最好先看c语言再学c++,申请内存可以用malloc
有其他问题可以发站内信。
先看下head,p1,p2的作用,p1是用来保存临时的数据a的,head指向表头,p2指向表尾。
head设置为0和head设置为NULL在这里是一样的。
B,C就是你说的那样。
head==0是判断表头是否为空。
表头为空,p1赋值给表头,链表就1个元素,所以把表尾p2也设置为p1。
p2->next=p1把p2的next指向新建立的p1.p2=p1还是把p2指向表尾,实际上就是p2=p2->next.
if(head)p2->next=0;输入结束后,判断链表是否为空,不为空则给p2->next赋值NULL,标记链表结束。
node * Creat()
首先这个函数头就写错了.用结构体声明时应前加struct,应该是struct node * Creat().
A:头结点为0是因为刚开始链表为空,head=NULL.NULL在宏定义中为0.
B:对.
C:对.
D:这个判断是为链表刚开始创建的时候做的工作
E:赋给head是为了使head指向链表的头;P1是申请的结点,P2是链表里的尾结点
F:将尾结点P2里的next指针指向P1刚申请的结点,并使P1刚申请的结点作为尾结点,并让P2始终指向链表的尾结点.
G:上面while语句结束,表明链表输入结束,最后要使尾结点的NEXT指向空,否则不知道next里的值是什么,执行后果严
展开全部
head=0; //A 为什么要把头指针置为0?头指针不是指向第一个节点的地址吗?
A:因为现在没有任何节点。
p1=new node; B //建立新节点,动态为结点分配内存空间?然后使一个结构体指针指向这个结点?
B:你说的对。pi是一个指针,它的值就是新建结构体申请到的内存空间地址。
p1->data=a; C // 给指针p1指向的节点的数据域赋值?
C:你说的对。
if(head==0){ //前面已经使头指针置为0了,为什么此处还要判断呢?
因为这是循环,表头在没有任何节点的情况下,要给它一个地址,否则,就给最后一个节点“连”在后面。
head=p1;p2=p1;//这个我就不明白了?p1怎么同时赋给p1,p2?
p2->next=p1;p2=p1;//还有这个
这是写代码的人的问题,他变量名字没有起好。实际上p1的作用是每次记录新申请到的节点地址。p2的作用是记录目前链表最后一个节点地址。没次p1申请到一块,如果head=0,那么它就是表头,当然也是表尾,给p2。
又申请到一块,判断一下,表头已经有了,那么就人让它连到当前最后节点p2后面(p2->next=p1;),然后p2再指向插入后的最后节点。这样越连越长……
if(head)p2->next=0; //怎么又判断头指针啊
循环已经结束。
如果head有值,说明表已建立好,让最后一个节点的next指针为0;不然表不就一直乱指了?
A:因为现在没有任何节点。
p1=new node; B //建立新节点,动态为结点分配内存空间?然后使一个结构体指针指向这个结点?
B:你说的对。pi是一个指针,它的值就是新建结构体申请到的内存空间地址。
p1->data=a; C // 给指针p1指向的节点的数据域赋值?
C:你说的对。
if(head==0){ //前面已经使头指针置为0了,为什么此处还要判断呢?
因为这是循环,表头在没有任何节点的情况下,要给它一个地址,否则,就给最后一个节点“连”在后面。
head=p1;p2=p1;//这个我就不明白了?p1怎么同时赋给p1,p2?
p2->next=p1;p2=p1;//还有这个
这是写代码的人的问题,他变量名字没有起好。实际上p1的作用是每次记录新申请到的节点地址。p2的作用是记录目前链表最后一个节点地址。没次p1申请到一块,如果head=0,那么它就是表头,当然也是表尾,给p2。
又申请到一块,判断一下,表头已经有了,那么就人让它连到当前最后节点p2后面(p2->next=p1;),然后p2再指向插入后的最后节点。这样越连越长……
if(head)p2->next=0; //怎么又判断头指针啊
循环已经结束。
如果head有值,说明表已建立好,让最后一个节点的next指针为0;不然表不就一直乱指了?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
//A 为什么要把头指针置为0?头指针不是指向第一个节点的地址吗?
第一次产生是,链表为空,此为初始化链首指针;
B //建立新节点,动态为结点分配内存空间?然后使一个结构体指针指向这个结点?
对呀!
C // 给指针p1指向的节点的数据域赋值?
有什么问题?给数据赋值啊
//前面已经使头指针置为0了,为什么此处还要判断呢?
以处来区分加入的节点是不是链表第一个节点,也即是否是链首节点
;//这个我就不明白了?p1怎么同时赋给p1,p2?
这是指对节点为链首节点的情况,加入节点后,链首指针指向此节点,当前节点指针也是指向该节点
//还有这个
这个为不是链首节点的情况,把哨兵节点指向该节点,然后把哨兵节点往后移,即为当前节点,注:可以理解哨兵节点为上一个节点
//怎么又判断头指针啊
非零(空)即为真,此时链表不为空了,此处表明已经结束输入,已经把所有节点加入链,然后把链尾指针置为空
第一次产生是,链表为空,此为初始化链首指针;
B //建立新节点,动态为结点分配内存空间?然后使一个结构体指针指向这个结点?
对呀!
C // 给指针p1指向的节点的数据域赋值?
有什么问题?给数据赋值啊
//前面已经使头指针置为0了,为什么此处还要判断呢?
以处来区分加入的节点是不是链表第一个节点,也即是否是链首节点
;//这个我就不明白了?p1怎么同时赋给p1,p2?
这是指对节点为链首节点的情况,加入节点后,链首指针指向此节点,当前节点指针也是指向该节点
//还有这个
这个为不是链首节点的情况,把哨兵节点指向该节点,然后把哨兵节点往后移,即为当前节点,注:可以理解哨兵节点为上一个节点
//怎么又判断头指针啊
非零(空)即为真,此时链表不为空了,此处表明已经结束输入,已经把所有节点加入链,然后把链尾指针置为空
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
先看下head,p1,p2的作用,p1是用来保存临时的数据a的,head指向表头,p2指向表尾。
head设置为0和head设置为NULL在这里是一样的。
B,C就是你说的那样。
head==0是判断表头是否为空。
表头为空,p1赋值给表头,链表就1个元素,所以把表尾p2也设置为p1。
p2->next=p1把p2的next指向新建立的p1.p2=p1还是把p2指向表尾,实际上就是p2=p2->next.
if(head)p2->next=0;输入结束后,判断链表是否为空,不为空则给p2->next赋值NULL,标记链表结束。
head设置为0和head设置为NULL在这里是一样的。
B,C就是你说的那样。
head==0是判断表头是否为空。
表头为空,p1赋值给表头,链表就1个元素,所以把表尾p2也设置为p1。
p2->next=p1把p2的next指向新建立的p1.p2=p1还是把p2指向表尾,实际上就是p2=p2->next.
if(head)p2->next=0;输入结束后,判断链表是否为空,不为空则给p2->next赋值NULL,标记链表结束。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
node * Creat()
首先这个函数头就写错了.用结构体声明时应前加struct,应该是struct node * Creat().
A:头结点为0是因为刚开始链表为空,head=NULL.NULL在宏定义中为0.
B:对.
C:对.
D:这个判断是为链表刚开始创建的时候做的工作
E:赋给head是为了使head指向链表的头;P1是申请的结点,P2是链表里的尾结点
F:将尾结点P2里的next指针指向P1刚申请的结点,并使P1刚申请的结点作为尾结点,并让P2始终指向链表的尾结点.
G:上面while语句结束,表明链表输入结束,最后要使尾结点的NEXT指向空,否则不知道next里的值是什么,执行后果严重.
首先这个函数头就写错了.用结构体声明时应前加struct,应该是struct node * Creat().
A:头结点为0是因为刚开始链表为空,head=NULL.NULL在宏定义中为0.
B:对.
C:对.
D:这个判断是为链表刚开始创建的时候做的工作
E:赋给head是为了使head指向链表的头;P1是申请的结点,P2是链表里的尾结点
F:将尾结点P2里的next指针指向P1刚申请的结点,并使P1刚申请的结点作为尾结点,并让P2始终指向链表的尾结点.
G:上面while语句结束,表明链表输入结束,最后要使尾结点的NEXT指向空,否则不知道next里的值是什么,执行后果严重.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询