严蔚敏的数据结构与算法(c语言版) 中关于引用
大家好,在严蔚敏的数据结构与算法(c语言版)的书中,在讲到线性链表时,我感到有很多引用调用都是不必要的,当然我不觉得这是书的错,可我想知道这是为什么,我觉得有很多引用调用...
大家好,在严蔚敏的数据结构与算法(c语言版)的书中,在讲到线性链表时,我感到有很多引用调用都是不必要的,当然我不觉得这是书的错,可我想知道这是为什么,我觉得有很多引用调用若采用值调用,同样可以达到效果。下面看个例子:
status listinsert_l(linklist &l,int i,elemtype e)
{
p=l;j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
return error;
s=(linklist)malloc(sizeof(lnode));
s->data=e;
s->next=p->next;
p->next=s;
}
不单单是这个我觉得listdelete等等只要不涉及l值变化的函数都不必要用引用调用,(初始化涉及到l值的变化所以应该用引用调用)。
请高手解释一下,谢谢....
我主要想知道,l值不会变,可又为什么要用linklist &l, 而不用linklist l 展开
status listinsert_l(linklist &l,int i,elemtype e)
{
p=l;j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
return error;
s=(linklist)malloc(sizeof(lnode));
s->data=e;
s->next=p->next;
p->next=s;
}
不单单是这个我觉得listdelete等等只要不涉及l值变化的函数都不必要用引用调用,(初始化涉及到l值的变化所以应该用引用调用)。
请高手解释一下,谢谢....
我主要想知道,l值不会变,可又为什么要用linklist &l, 而不用linklist l 展开
5个回答
展开全部
引用常常是有必要的,他十分重要的一点就是可以避免对象的复制!
同样是传递,如果你要传递的是一个非常庞大的对象,这时候不用引用的话,传给函数的就是这个对象的一个副本,构造这样一个副本会调用拷贝构造函数,如果对象庞大,可能会花费大量的系统资源,所以引用的有意义的。而用了引用,就可以避免这样一个拷贝过程。举例,MFC中大量使用的就是常引用,因为他的类往往是一个控件或者是一个对话框。
如果为了避免或者强调传递的对象不发生改变,可以用“常引用”
就是const type &name的形式,这样既可以避免修改也可以避免拷贝。
用linklist l,这个子程序里面的l是外面传值传过来的一个linklist的拷贝,要做一次复制操作,会花费一定系统开销!
用linklist &l,不需要这个复制操作,节省资源!
这里并不关心改不改变l的值,使用引用不只是为了让l的值能改变,还有我说的这个作用
同样是传递,如果你要传递的是一个非常庞大的对象,这时候不用引用的话,传给函数的就是这个对象的一个副本,构造这样一个副本会调用拷贝构造函数,如果对象庞大,可能会花费大量的系统资源,所以引用的有意义的。而用了引用,就可以避免这样一个拷贝过程。举例,MFC中大量使用的就是常引用,因为他的类往往是一个控件或者是一个对话框。
如果为了避免或者强调传递的对象不发生改变,可以用“常引用”
就是const type &name的形式,这样既可以避免修改也可以避免拷贝。
用linklist l,这个子程序里面的l是外面传值传过来的一个linklist的拷贝,要做一次复制操作,会花费一定系统开销!
用linklist &l,不需要这个复制操作,节省资源!
这里并不关心改不改变l的值,使用引用不只是为了让l的值能改变,还有我说的这个作用
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
展开全部
l这个链表在listinsert_l(linklist &l,int i,elemtype e)函数中,进行了插
入操作,使链表l发生了变化,函数就需要引用调用l啊!
status listinsert_l(linklist &l,int i,elemtype e)
这个函数的返回值是状态码,而不是返回l链表的头结点地址。
入操作,使链表l发生了变化,函数就需要引用调用l啊!
status listinsert_l(linklist &l,int i,elemtype e)
这个函数的返回值是状态码,而不是返回l链表的头结点地址。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是的,老实说这本书写的很不怎么样,很多算法实现的乱七八糟,丝毫不能体现出数据结构和算法的美,反而会让初学者感到很难掌握。同样的一个算法,如果看一下sedgewick《算法:c语言实现》上面的,就会发现其实可以用更简洁,更对称,更容易理解的方式来实现。
说到你提到的这个问题,我也认为是这样的,多用引用没什么好处,只会增加函数产生更多的有意或无意的副作用。
说到你提到的这个问题,我也认为是这样的,多用引用没什么好处,只会增加函数产生更多的有意或无意的副作用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是的,完全没有必要使用引用,只需要传LNode *或者LinkList就可以了,函数都没有改变L的值,也就没必要用引用。我用代码试了,不用引用完全没有问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
L的地址没变但是整个链表内容变了,L指向的地址有可能变大了(malloc)。所以要引用。你可以写个程序试试,不引用会出错。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询