数据结构-线性表问题(严蔚敏C语言版清华大学出版社)

第二章中:
抽象数据类型线性表的定义(第19页):
其中有一个基本操作:GetElem( L, i, &e){……}其e采用的是引用型参数。
但是:
在第20页算法2.1中有GetElem( L, i, e);我想问的是为什么不是GetElem( L, i, &e)?
在算法2.2中也有类似的问题:GetElem( La, i, ai)为什么不是GetElem( La, i, &ai)?我在猜是不是此处的ai不用返回到函数外面,所以不把ai当做引用型参数?
算法2.2中还有ListInsert(Lc,++K,bj)不是ListInsert(&Lc,++K,bj),是不是因为最前面已经定义了viod MergeList(List La,List Lb,List &Lc),所以ListInsert(Lc,++K,bj)的Lc就省略&……是这样的吗?
void MergeList(List La, List Lb, List &Lc) {
// 本算法将非递减的有序表 La 和 Lb 归并为 Lc
InitList(Lc); // 构造空的线性表 Lc
i = j = 1; k = 0;
La_len = ListLength(La);
Lb_len = ListLength(Lb);
while ((i <= La_len) && (j <= Lb_len)) { // La 和 Lb 均不空 }
GetElem(La,i,ai); GetElem(Lb, j, bj);
if(ai<=bj) { ListInsert(Lc, ++K, ai); ++i; }
else{ListInsert(Lc, ++K, bj); ++j;}
while (i <= La_len) { // 当La不空时
GetElem(La, i++, ai);
ListInsert(Lc, ++k, ai);
} // 插入 La 表中剩余元素
while (j <= Lb_len) { // 当Lb不空时
GetElem(Lb, j++, bj);
ListInsert(Lc, ++k, bj);
} // 插入 Lb 表中剩余元素

} // merge_list

这个程序的
InitList(Lc); 不是InitList(&Lc);
GetElem(La,i,ai); 不是GetElem(La,i,&ai);
GetElem(Lb, j, bj);不是GetElem(Lb, j, &bj);
ListInsert(Lc, ++K, ai); 不是 ListInsert(&Lc, ++K, ai);
现在可以解释了原因了……呵呵

很简单,写算法时,要返回的传地址,不需要返回的,传值
也可以这么说,要在函数中改变的,传地址,不需要改变的,传值
比如GetElem( L, i, &e)说明e的值在函数中会改变,需要返回到主函数中,因此要传地址,而i,L只是在函数中引用一下,不要返回到主函数中
实参传入函数中时,会在内存中另开辟一个空间,比如上面在主函数中调用
GetElem( L, i, &e);
此时在内存中复制一份
L,i,&e,因此在内存中操作L,i,是不会改变主函数中的值,而e复制的是地址(指针),照样指向主函数中的e,因此,改变*(&e)的内容,照样能改变主函数的e的值
-----------------------------
1正确
2你能不能把算法的功能简单的说下,还有函数的各个参数的用途
前面定义和本函数无关,只要在本函数中改变,就需要传地址
温馨提示:答案为网友推荐,仅供参考