- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
单链表函数中的引用传递
hlt原创,转载请注明出处:
c++语言中,函数参数传递一般分为两种类型:值传递和地址传递。值传递比较简单,形参定义同一般变量的形式;而实现地址传递,需要利用指针变量*或通过引用。需要注意的是,指针传递和引用传递在实现机理上不完全相同,因此不是所有的引用传递都可以用指针传递代替。下面重点阐述和测试单链表相关操作函数:
这里以严蔚敏、李冬梅教材上的相关操作的实现为例,链表为带有表头结点的情况。
结点结构如下:
单链表的基本操作函数有许多,这里仅仅讨论具有代表性的4个函数:
===================================================
Status InitList_L(LinkList L){ //算法2.5 单链表的初始化
//构造一个空的单链表L
L=new LNode; //生成新结点作为头结点,用头指针L指向头结点
L-next=NULL; //头结点的指针域置空
return OK;
}
分析:该函数中,采用了引用符号实现地址传递,代表给传入的实参ml一个别名L,实际上两者都同一个变量;此时对L的操作相当于对ml的操作。如图1,ml开始为null,然后通过引用方式传递,给L分一个结点,相当于给ml分一个结点。
ml-null
ml-null
^
ml(L)
图1
若不加引用,采用如下形式:
Status InitList_L(LinkList L){ //算法2.5 单链表的初始化
//构造一个空的单链表L
L=new LNode; //生成新结点作为头结点,用头指针L指向头结点
L-next=NULL; //头结点的指针域置空
return OK;
}
分析,此时L为Lnode指针类型,则通过形参,ml将null传递给了L;而后L分了新结点,但ml没有发生任何变化,仍然是null;此时对L的操作对ml没有其作用。因此,将达不到为ml分配头结点的过程,不能如此写。
ml-null
ml-null
L=null
ml-null
^
L
图2
为了实现采用指针传递地址,不用引用方式传递地址,可以采用指向指针的指针即LinkList* L作为形参(相当于Lnode** L)。此时的函数写法如下:
=========================================
对于创建链表函数,也存在上述情况。若函数CreateList_L(LinkList L,int n)中的形参L不加引用符号实现地址传递,则ml将地址传给L后,在CreateList_L函数执行时,因为给L分配了新的结点,从而使得L和ml没有任何关系了,此时对L后面所加入的所有数据结点都不会反映在ml上。因此,如下函数形式中,必须采用引用传递。
void CreateList_L(LinkList L,int n){ //算法2.11 后插法创建单链表
//正位序输入n个元素的值,建立到头结点的单链表L
LNode *r,*p;
L=new LNode;
L-next=NULL; //先建立一个带头结点的空链表
r=L; //尾指针r指向头结点
cout请输入 n 个数:\n;
for(int i=0;in;i++){
p=new LNode; //生成新结点
cinp-data; //输入元素值
p-next=NULL;r-next=p; //插入到表尾
r=p; //r指向新的尾结点
}
;
} //CreateList_L
对于上述函数,一种例外的情况时(图3),若分配头结点是在CreateList_L函数之外,这个函数仅仅负责增加数据结点,则是可以不加引用,而是通过简单的指针方式传递地址。此时,在输入数据之前,ml先通过initList函数分配了头结点。这种情况与链表的插入删除函数的参数传递同理。此时CreateList_L函数将不需要要L=new LNode; L-next=NULL; 这两句。在形参中可以不加符号,而是采用指针传递地址即可。
ml
ml
L
ml
L
a
b
1、ml将头结点地址传给L
2、利用L在头结点后面插入数据节点,此时修改L就是修改ml
图3
===============================================
链表查找函数,由于该函数不改变L的结点情况,因此采用指针实现地址传递即可(这里不采用值传递,因为链表访问都是采用指针形式实现的)。这个也可以采用,但是没有必要。
Status GetElem_L(LinkList L,int i,Ele
您可能关注的文档
最近下载
- 清真保证体系培训.ppt VIP
- 2023年中外电影史论题库答案完成版.doc VIP
- (高清版)B-T 15596-2021 塑料 在玻璃过滤后太阳辐射、自然气候或实验室辐射源暴露后颜色和性能变化的测定.pdf VIP
- 学校食堂从业人员管理培训记录(40篇).doc VIP
- 《苏格兰的风》阅读练习及答案.doc VIP
- 调色师:达芬奇视频剪辑调色从入门到精通(上篇,共上中下3篇).pptx VIP
- 2025 银行公开招聘工作人员简章.pdf VIP
- 初中满分优秀作文五篇(写成长、写人生、写逐梦、写逆风、写母爱).docx VIP
- 《GBT 11345-2023 焊缝无损检测 超声检测 技术、检测等级和评定》专题研究报告.pptx VIP
- 6-特种设备安全附件、安全保护装置、测量调控装置及有关附属仪器仪表定期校验、检修及记录制度.doc VIP
原创力文档


文档评论(0)