老牛来学习 发表于 2020-4-16 19:04:46

C语言



这题推的过程麻烦大佬讲一下可以吗?谢谢。

BngThea 发表于 2020-4-16 19:08:59

答案A
因为q是原来的首节点,通过while循环找到尾节点,然后将q放到最后
也就是A

老牛来学习 发表于 2020-4-16 19:15:30

BngThea 发表于 2020-4-16 19:08
答案A
因为q是原来的首节点,通过while循环找到尾节点,然后将q放到最后
也就是A

但是按照这上面写的第一行之后,是不是s,s->next和p都是首节点的地址?

老牛来学习 发表于 2020-4-16 19:31:51

BngThea 发表于 2020-4-16 19:08
答案A
因为q是原来的首节点,通过while循环找到尾节点,然后将q放到最后
也就是A

我理解的这个程序是:s把他的地址给q,此时q和s同时指向首节点。
s->next为首节点的地址,那么s=s->next之后s为首节点,又把s赋值给p
此时sp为首节点,q为头指针。

进入循环:
p->next为第二个节点,所以p=p->next之后p为第二个节点。指向顺序为q-s-p
q为头指针把它赋值给p->next;和q->next = NULL;是什么意思?没弄明白

耻思lhj 发表于 2020-4-16 19:33:50

本帖最后由 耻思lhj 于 2020-4-16 19:35 编辑

老牛来学习 发表于 2020-4-16 19:15
但是按照这上面写的第一行之后,是不是s,s->next和p都是首节点的地址?

不是只有q---->首节点,s,p,s->next这三个都等于q->next,也就是原来首节点的next,

老牛来学习 发表于 2020-4-16 19:35:21

耻思lhj 发表于 2020-4-16 19:33
不是只有q---->首节点,s,p,s---->next这三个都等于q---->next,也就是原来首节点的next,

是头指针的next把?
这个明白,while循环没明白

耻思lhj 发表于 2020-4-16 19:38:23

老牛来学习 发表于 2020-4-16 19:35
是头指针的next把?
这个明白,while循环没明白

while就是判断,你现在p是不是最后一个节点(如果是最后一个节点p->next是指向null的),不是就再往后挪。找到后就把p->next指向原来的首节点。

老牛来学习 发表于 2020-4-16 20:04:19

耻思lhj 发表于 2020-4-16 19:38
while就是判断,你现在p是不是最后一个节点(如果是最后一个节点p->next是指向null的),不是就再往后挪 ...

while循环里的执行顺序:

p = pnext之后pnext是第三个节点;指向顺序为 q->s和snext的地址->p
pnext = q之后pnext是首节点;指向顺序为q->s和snext的地址->p->q变成死循环了;
q->next等于NULL;指向顺序为q->s和snext的地址->p->q结束;

下一次循环

pnext=p相当于把q赋给p,由于qnext为NULL,所以指向变成q->s和snext的地址->p结束;
q又赋值给pnext,顺序又变成q->s和snext的地址->p->q结束;

这不就指向顺序一直没变吗??并没有达到你说的效果啊?我理解的有错误?

耻思lhj 发表于 2020-4-16 20:07:21

老牛来学习 发表于 2020-4-16 20:04
while循环里的执行顺序:

p = pnext之后pnext是第三个节点;指向顺序为 q->s和snext的地址->p


你看到最后一句代码了吗,q->next=null。
没有这一句之前,链表变成一个圆了{:5_109:}
还有,你这个是真的看的我头晕

老牛来学习 发表于 2020-4-16 20:10:00

耻思lhj 发表于 2020-4-16 20:07
你看到最后一句代码了吗,q->next=null。
没有这一句之前,链表变成一个圆了
还有,你这个 ...

嗯,看到了,我上面也说了,死循环,之后加上NULL,进入下一次循环,你可以看看我写的对不对,但是按照这个推 好像并没有达到效果呢{:10_266:}

老牛来学习 发表于 2020-4-16 20:10:46

BngThea 发表于 2020-4-16 19:08
答案A
因为q是原来的首节点,通过while循环找到尾节点,然后将q放到最后
也就是A

while循环里的执行顺序:

p = pnext之后pnext是第三个节点;指向顺序为 q->s和snext的地址->p
pnext = q之后pnext是首节点;指向顺序为q->s和snext的地址->p->q变成死循环了;
q->next等于NULL;指向顺序为q->s和snext的地址->p->q结束;

下一次循环

pnext=p相当于把q赋给p,由于qnext为NULL,所以指向变成q->s和snext的地址->p结束;
q又赋值给pnext,顺序又变成q->s和snext的地址->p->q结束;

这不就指向顺序一直没变吗??并没有达到你说的效果啊?我理解的有错误?

耻思lhj 发表于 2020-4-16 20:10:53

本帖最后由 耻思lhj 于 2020-4-16 20:12 编辑

老牛来学习 发表于 2020-4-16 20:04
while循环里的执行顺序:

p = pnext之后pnext是第三个节点;指向顺序为 q->s和snext的地址->p


最后有一行代码q->next=null,没有这代码之前,链表变成一个圆了。

这代码不看他用来Temp的变量,其实用图来表示就是,链表的尾部和头部连在一起了,让后又把它从a前面的地方切断。

耻思lhj 发表于 2020-4-16 20:17:52

老牛来学习 发表于 2020-4-16 20:10
while循环里的执行顺序:

p = pnext之后pnext是第三个节点;指向顺序为 q->s和snext的地址->p


我觉得是你看错了,while()后面没有大括号,就只执行p=p->next.
这个循环的作用就是找到最后面的节点而已

老牛来学习 发表于 2020-4-16 20:21:44

耻思lhj 发表于 2020-4-16 20:17
我觉得是你看错了,while()后面没有大括号,就只执行p=p->next.
这个循环的作用就是找到最后面的节点而 ...

{:10_266:}我吐了,可能是盯的眼睛有点瞎,这都弄错了。。。

BngThea 发表于 2020-4-16 20:22:41

老牛来学习 发表于 2020-4-16 20:10
while循环里的执行顺序:

p = pnext之后pnext是第三个节点;指向顺序为 q->s和snext的地址->p


while循环不是只是移动p到末尾吗?只有一条语句啊

老牛来学习 发表于 2020-4-16 20:25:04

BngThea 发表于 2020-4-16 20:22
while循环不是只是移动p到末尾吗?只有一条语句啊

刚看错了,老眼昏花

耻思lhj 发表于 2020-4-16 20:29:24

老牛来学习 发表于 2020-4-16 20:25
刚看错了,老眼昏花

我刚刚也把鱼友看成色友了。。。。{:5_104:}

老牛来学习 发表于 2020-4-16 21:15:54

耻思lhj 发表于 2020-4-16 20:29
我刚刚也把鱼友看成色友了。。。。

那这就是你的问题了,兄嘚{:10_257:}
页: [1]
查看完整版本: C语言