整个链表作为形参 传递

#include<stdio.h>#include<conio.h>typedefstructlnode{intn;structlnode*next;}*linklist... #include<stdio.h> #include<conio.h> typedef struct lnode { int n; struct lnode *next; }*linklist,lnode; void nochange(lnode l) { l.n=3; l.next->n=4; } int main() { linklist l; l=(linklist)malloc(sizeof(lnode)); l->n=1; l->next=(linklist)malloc(sizeof(lnode)); l->next->n=2; printf("%d",l->n); printf("%d\n",l->next->n); nochange(*l); printf("%d",l->n); printf("%d",l->next->n); getch(); } 这样也不能达成目标,只是传入了第一个节点首地址,next中下一个地址值没有变,怎么能完全把一个链表作为形参处理? 如不想伤害原来链表,难道只能复制链表? 展开
 我来答
隐安梄c
推荐于2017-11-26 · TA获得超过127个赞
知道答主
回答量:121
采纳率:0%
帮助的人:123万
展开全部
整个链表作为形参传递 可以只将链表的首地址传递。如果对链表发生了更改,而且保留更改,在更改的函数中,链表参数前加 & 例如在本程序中 void nochange(linklist &l);如果不愿保留对链表的更改,就不要加&,但在函数体中,需再定义一个指针,用他去执行对链表的操作。void nochange(linklist l){ linklist p = l; p->n = 3; p->next->n = 4; }
牛牪犇E6

2020-11-05 · TA获得超过5.9万个赞
知道大有可为答主
回答量:7.2万
采纳率:93%
帮助的人:5174万
展开全部
你的看法没有错,因为你的程序仅仅拷贝了第一个节点,而第二个乃至以后的节点仍然会受到影响。我想这里涉及到一个程序设计的问题,直观上说如果你不复制第二个练表,不可能让一个如你的nochange()函数不去改变第一个练表值的。原因很简单,你的nochange()修改了练表节点的值,这个修改假如不影响你原来的练表,自然应该是复制出来的第二个练表。比如你的程序复制了头节点,所以头节点没受影响,但是没有复制第二节点,第二个节点的操作当然是原来练表的节点。假如你仅仅想保护以前的练表内容不被修改,建议你考虑c++的数据隐藏,即将数据定义成private并提供读的接口。假如你需要修改练表的值做一些事情,又希望最后能保留练表的初始状态,只能或者复制一个练表,或者保存练表的初始状态,最后恢复。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式