用二级指针作为形参建立二叉树
来源:互联网 发布:java如何导入jar包 编辑:程序博客网 时间:2024/06/05 14:27
今天在写二叉树的建立时,遇见了指针作为参数的bug。经过查找,进一步的理解了二级指针。
二级指针,也就是指针的指针,作用主要是为了改变指针本身的数据,在这里,可以把指针本身看成一个变量,既然是变量,那就肯定可以修改其内容,所以可以借助一个二级指针来改变指针本身的数据。
用指针作为形参,类似二叉树先序遍递归历的方法,建立二叉树。写了如下代码。
typedef struct node { char data; struct node *lchild,*rchild; }BiNode,*BiTree;
void CreatBiTree(BiTree T) { char a; scanf("%c",&a); if(a=='@') T=NULL; else { T=(BiTree)malloc(sizeof(BiNode)); T->data=a; CreatBiTree(T->lchild); CreatBiTree(T->rchild); } }运行没有错误,可以结果不对。后发现是形参出错了。
递归函数传递一级指针T,并在函数中重新malloc()是有问题的!
在递归过程中,函数的形参一级指针 T 压入栈中,函数执行时一级指针 T 却被malloc()改变,当函数返回时,形参的指针与函数中的指针不同,不能形参逻辑上的联系,则二叉树不能建立。
相当于如下问题
int main(){ int a =2; foo1(a);}void foo1( int a){a = 4;}a 作为foo(a)的形参 a = 2,在foo(a)内发生改变 a = 4,但在返回main()时,仍 a = 2;
解决的方法是 使用二级指针作为形参(传递的是一级指针的地址)。如下代码。这样malloc() 就可以改变一级指针 *T的值,但递归函数之间是通过 一级指针(*T)的地址(&*T)联系的。一级指针的地址是不会发生变化的,所以实现了即改变一级指针的内容,又实现了函数的递归。
void CreatBiTree(BiTree *T) { char a; scanf("%c",&a); if(a=='@') *T=NULL; else { *T=(BiTree)malloc(sizeof(BiNode)); (*T)->data=a; CreatBiTree(&((*T)->lchild)); CreatBiTree(&((*T)->rchild)); } }
0 0
- 用二级指针作为形参建立二叉树
- 二叉树常见为什么用二级指针
- 二叉树为什么用二级指针来构造的原因
- 利用二级指针创建满二叉树
- 用二级指针求解二叉树根节点
- 二级指针作为参数分析
- 二级指针的使用——二叉树的创建
- 数据结构 二叉树的创建 关于二级指针的问题
- 二级指针作为函数参数申请内存
- 二级指针作为函数参数传递初始化的一点总结
- 二级指针作为函数输入的三种实现方式:
- 二级指针(作为输入)的3中内存模型
- 二级指针作为函数参数传递初始化的一点总结
- 二叉树的建立和遍历、引用和二级指针传参
- 前序建立二叉树(使用和不使用二级指针)
- 二级指针、数组指针、二维数组、指针数组作为函数形参时可传入的实参
- 指针作为形参
- ※ Leetcode - Tree - 226. Invert Binary Tree(反转二叉树 使用二级指针交换两个指针的地址)
- 软件自动化实现的原理
- hdu 5347 MZL's chemistry(15多校第五场1005)
- 通过script向tpl页面插入一个form表单
- 关于Oracle复制一张表和复制表中的一条数据
- 如何获取网络标准时间
- 用二级指针作为形参建立二叉树
- linux下的vim快捷键
- Java 模拟 HTTP Get Post 请求实现论坛自动回帖
- Django synchronize unmigrated apps解决办法
- 免费用正版Win10完全攻略
- IDEA 配置
- MS笔试题 -- Joseph_Circle整理全
- haproxy The Response line
- PID算法通俗教程