BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #77571同步于 2014/3/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

单链表逆置问题

LMY198818
2014/3/18镜像同步24 回复
struct node { int data; struct node *next; }; typedef struct node *linklist; void reverselink(linklist &head) { node *ppre = head; node *pcur = ppre->next; node *pnext = NULL; while(pcur != NULL) { pnext = pcur->next; pcur->next = ppre; ppre = pcur; pcur = pnext; } head->next = NULL; head = ppre; } //请问各位 在这里&号的的作用是什么 有其他更好的实现方法吗 感谢
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
LMY198818机器人#1 · 2014/3/19
见笑了… 谢谢你的回复,那为什么用“*” 取代“&”会报错呢 【 在 byr10th 的大作中提到: 】 : 取头结点的地址...
gdl机器人#2 · 2014/3/19
函数参数用&是引用传参的意思。前面有typedef struct node *linklist; 定义了一个node指针类型linklist,本身就是一个指针,你用linklist *head做参数,那么head就是一个指向linklist指针的指针,在这句node *ppre = head;赋值由于ppre和head类型不同报错。
tangzehang机器人#3 · 2014/3/19
typedef struct node *linklist; 这一句是重定义了node的指针命名方式.. 然后linklist &head 这句是引用.引用了一个node指针.(有没有这个&都可以运行成功.可以试试把&去掉.) 你可以尝试在函数内.对head指向另外一个地方..然后跳出函数..再重新遍历链表.这样你就理解那个&做什么用的了. 倒置算法.我给你一个吧.你去试试.我自己现在木有编译环境. linklist reverselink(linklist first,linklist next) { if(next->next != NULL) { linklist nnext=next->next;//获取它的下一个节点 next->next=first; return reverselink(linklist next,linklist nnext);//递归倒置 } else //最后一个节点了.直接返回这个节点 { next->next=first; return next; } } 之后调用的时候..就直接这样用 head = reverselink(NULL,head);
LMY198818机器人#4 · 2014/3/19
有点明白了 感谢 【 在 gdl 的大作中提到: 】 : 函数参数用&是引用传参的意思。前面有typedef struct node *linklist; 定义了一个node指针类型linklist,本身就是一个指针,你用linklist *head做参数,那么head就是一个指向linklist指针的指针,在这句node *ppre = head;赋值由于ppre和head类型不同报错。
hlxwin机器人#5 · 2014/3/19
linklist是一个指向链表节点的指针,而&是引用的意思,代表引用linklist里存的地址值,由于如果不加&就相当于直接传递linklist里面存的地址值,而值传递会造成很多问题,那么只能用*和&,*的话会有两层指针可读性不好,&引用传递是最好也是最简单的方式。在这个问题中head中存的是引用linklist的地址值,所以在函数内可以当成一个指针,但是在函数间的传递不会出现值传递的问题。
LMY198818机器人#6 · 2014/3/19
感谢 我在VC6下面将&去掉后 发现不能逆置链表,这是什么原因呢 【 在 tangzehang 的大作中提到: 】 : typedef struct node *linklist; : 这一句是重定义了node的指针命名方式.. : 然后linklist &head 这句是引用.引用了一个node指针.(有没有这个&都可以运行成功.可以试试把&去掉.) : ...................
tangzehang机器人#7 · 2014/3/19
发现问题了..最关键的一句...就是你代码的最后一句 head = ppre; 这一句.注定你要用引用..如果不用引用..你的head出跳出函数后还是原来的地方. 如果去掉&.. 让函数return ppre; 之后head = reverselink(head);
LMY198818机器人#8 · 2014/3/19
非常感谢 明白了 【 在 hlxwin 的大作中提到: 】 : linklist是一个指向链表节点的指针,而&是引用的意思,代表引用linklist里存的地址值,由于如果不加&就相当于直接传递linklist里面存的地址值,而值传递会造成很多问题,那么只能用*和&,*的话会有两层指针可读性不好,&引用传递是最好也是最简单的方式。在这个问题中head中存的是引用linklist的地址值,所以在函数内可以当成一个指针,但是在函数间的传递不会出现值传递的问题。
LMY198818机器人#9 · 2014/3/19
[em68] 说得完全正确 感谢你 【 在 tangzehang 的大作中提到: 】 : 发现问题了..最关键的一句...就是你代码的最后一句 : head = ppre; : 这一句.注定你要用引用..如果不用引用..你的head出跳出函数后还是原来的地方. : ...................