递归函数使用引用传递的问题
来源:互联网 发布:mac合盖播放 编辑:程序博客网 时间:2024/05/19 03:17
对于算法:
使用递归方法,删除无头结点单链表中所有值为x的结点。
考虑下面程序:
void Del_X_3(LinkList &L,ElemType x) { LNode *p; if(L==NULL) return ; if(L->data==x) { p=L; L=L->next; //问题出在这里 free(p); Del_X_3(L,x); }else { Del_X_3(L->next,x); } }
思考该程序发现,会有疑问:
删除结点p时没有更改p前结点的指针,是否会造成链表短链呢?答案是不会。
[分析]
为了简化,思考链表中某三个结点:1,3,5。现欲删除链表中所有3。
第一次递归:
L指向1结点,递归调用Del_X_3(L->next,x);
注意这里,L->next是什么?
相当于这个Node*类型的指针L所指向的结点的next域里面的指针,其存储的值为下一个结点的地址。也就是(*L).next;
第二次递归:
现在进入递归的L实际上是(*L).next;
注意:当代码执行到L=L->next;
这里问题出现了。
这句话其实相当于(*L).next = (*L).next->next;也就是1指向了5!
注意引用传递
函数void Del_X_3(LinkList &L,ElemType x)
LinkList使用引用传递,这是有原因的。
注意这里的每一个L都是一个指针,其值都来自于链表结点的next域。
那么我们现在要更改链表,就必然要使用指针的引用。
因为这里我们要更改的是指针本身!而不再是指针所指的对象。
阅读全文
0 0
- 递归函数使用引用传递的问题
- PHP 函数的引用传递(地址传递&)问题
- CLR中函数引用传递无法使用ref class成员变量的问题
- js函数传参是值传递引用传递问题
- C++之递归函数的参数传递问题
- C# 函数引用传递(址传递)ref、out以及值传递之间的运行效率问题
- Perl函数参数中传递数组和引用的使用
- Perl函数参数中传递数组和引用的使用
- JavaScript 函数的引用传递
- 函数的值传递和引用传递
- javascript中值传递,地址传递,引用传递的问题(使用js创建list对象时会用到)
- 问题:向函数中传递指针和传递指针的引用的区别
- Java中函数参数的值传递与引用传递问题
- javascript中值传递,地址传递,引用传递的问题。
- 值传递、地址传递与引用传递的使用
- PHP函数按引用传递的例子
- Python的函数参数传递:传值?引用?
- Python的函数参数传递:传值?引用?
- day3
- 深度探索C++对象模型——Data Member的布局(2)书上的错误
- 继承和多态
- 正则表达式--1
- 14_调整数组顺序使奇数位于偶数前面
- 递归函数使用引用传递的问题
- xargs和grep的区别
- 1009. 说反话 (20)
- 机器学习中数据优化的几种方法
- PE 格式详解
- 网络请求+购物车
- 十一个行为型模式9:策略模式-Strategy Pattern【学习难度:★☆☆☆☆,使用频率:★★★★☆】
- codeforces 827F. Dirty Arkady's Kitchen
- 看时序图写程序