为了账号安全,请及时绑定邮箱和手机立即绑定

C语言结构体,主要后面那个循环不懂

C语言结构体,主要后面那个循环不懂

C
qq_放声就去笑_1 2018-01-02 11:29:54
#include <stdio.h> struct node { int data; struct node *next; } ; typedef struct node NODE; main() { NODE a,b,c,*h,*p; a.data=10;b.data=20;c.data=30; h=&a; a.next=&b;b.next=&c;c.next='\0'; p=h; printf("%d\n",p->data); while(p) { printf("%d",p->data); p=p->next; printf("\n"); } }
查看完整描述

3 回答

?
onemoo

TA贡献883条经验 获得超454个赞

所以你应该已经弄懂了 struct 的定义和 typedef 是怎么回事吧。


那么,在 main 中你定义了 a、b、c 这三个 NODE,并且让 a 链到 b,b 链到 c,c 的 next 指向“空”

虽然运行起来没有错,但额外说一下:c.next='\0' 这里你把 next 赋值为 '\0',这是“空字符”。而这里在逻辑上你需要的是让 next 为“空指针”(也就是让 next 的值为 0),那么直接赋值 0 或 NULL 就可以了。 因为 '\0' 的值也是 0,所以这里没有运行错误,但这么写逻辑上就有些混乱了。


h 和 p 是指针,h 指向 a,而 p 一开始也指向 a。


while 循环的条件是 p 不为空指针。那么一开始 p 指向 a,所以进入循环:

首先打印 p 指向的节点的 data 值。

然后 p = p -> next,这句就是让 p 指向下一个节点

如果某次循环时 p 已经指向最后一个节点了(这例子中就是 c),那么 p = p -> next 之后 p 就是空指针了(因为 c 的 next 是空指针,表明 c 为最后一个节点),再进入 while 时 p 为空指针,所以会结束循环。


那么整个 while 就是利用 p 指针,遍历了一遍 a b c 节点链接而成的链表(对,这样的结构就叫“链表”)

查看完整回答
1 反对 回复 2018-01-02
?
qq_放声就去笑_1

TA贡献5条经验 获得超1个赞

嗯嗯typedef struct  我都理解了,只是这个循环我还是有点迷糊,为什么p的值会移动,会发生变化,还有–>这个符号的用法,具体作用什么?

查看完整回答
反对 回复 2018-01-03
  • 通病KKK
    通病KKK
    结构体变量指向里边的成员用'.',比如a.data。 结构体指针变量指向成员用的就是'->'比如p->data和p->next。 结构体的成员里边定义了一个指针变量就是next,你的程序里边把b的地址赋值给了a的next,c的地址给了b的next。p一开始是a的地址,么p->data就是是a.data,p->next就是b的地址。p=p->next就是将b的地址给赋值给了p,此时p就是b的地址可以访问b的数据就是p->data以此类推。 建议你看看结构体定义还有数据结构的链表。讲真这个代码写的太不标准了。
  • qq_放声就去笑_1
    qq_放声就去笑_1
    谢谢我懂了
  • 3 回答
  • 0 关注
  • 1524 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信