C++中交换两个数/二叉树的建立
来源:互联网 发布:海关进口数据查询 编辑:程序博客网 时间:2024/06/03 16:04
我的个人博客:http://www.imekaku.com/2015/11/19/exchange-point-binarytree/
C++中利用指针交换两个数:
#include <iostream>using namespace std; void exchange(int*, int*);void swap(int *, int *);int main(){ int *p, *q; int a = 10; int b = 20; p = &a; q = &b; cout<<"交换前"<<endl; cout<<"p存放的地址是: "<<p<<endl; cout<<"q存放的地址是: "<<q<<endl; exchange(p, q); cout<<"交换之后"<<endl; cout<<"p存放的地址是: "<<p<<endl; cout<<"q存放的地址是: "<<q<<endl; swap(a, b); cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; return 0;} void exchange(int *p, int *q){ int* temp; temp = p; p = q; q = temp; cout<<"交换过程中"<<endl; cout<<"p存放的地址是: "<<p<<endl; cout<<"q存放的地址是: "<<q<<endl;} void swap(int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp;} /* 输出结果: 交换前 p存放的地址是: 0023F7FC q存放的地址是: 0023F7F8 交换过程中 p存放的地址是: 0023F7F8 q存放的地址是: 0023F7FC 交换之后 p存放的地址是: 0023F7FC q存放的地址是: 0023F7F8 a = 20 b = 10*/
可以看到a和b的值确实是交换了,也就是说a和b空间存放的值发生了改变
是因为p,q利用他们存放的地址,改变了以这个值为地址的空间内的值,
但是p和q也只是作为参数传入函数,并不该改变p和q所存放的值。
【通俗的讲:】
好比有P和Q两个Boss:
其中Q这个Boss有b这户人家的地址,Q就把这个地址告诉了小弟q(Q传入函数的参数),
然后小弟q按照这个地址吧b这户人家给修理了一顿(改变了其中的值)。但是就算现在有谁来报复Q,
也只能修理q, 而对Q毫发无损。
同样的P也修理了a这户人家。
这里的修理方式,交换了a, b两个的值。
* P, Q两个实参不会改变这一点很重要。
比如在二叉树的创建和遍历的工程中:
/* 建立二叉树 二叉树的遍历 2015年11月18日11:27:58*/ #include <iostream>using namespace std; /*二叉树结构体*/struct BinaryTreeNode{ char data; BinaryTreeNode* theLeft; BinaryTreeNode* theRight;}; /* 创建一个二叉树 这里的参数应该为二叉树的指针,因为需要定义出口 即当输入的字符为'X'时,不在递归创建二叉树 同时,需要要引用符&。 在创建二叉树时,需要为二叉树分配空间,使用new方法 T = new BinaryTreeNode; 表示新开辟一个大小为BinaryTreeNode的空间,并将此地址赋值给T, 如果不加引用符,那么T的值将不会改变,也就不能达到开辟空间的效果*/void createBinaryTreeNode(BinaryTreeNode* &T){ char data; cin >> data; if(data == 'X')//这里不能使用双引号 T = NULL; else { T = new BinaryTreeNode; T->data = data; createBinaryTreeNode(T->theLeft); createBinaryTreeNode(T->theRight); }}void visit(char data, int level){ cout<<data<<" 在第 "<<level<<" 层"<<endl; } void crossBinaryTreeNode(BinaryTreeNode* T, int level) { if(T == NULL) return; else { visit(T->data, level); crossBinaryTreeNode(T->theLeft, level+1); crossBinaryTreeNode(T->theRight, level+1); }} /* 释放空间时必须采用后序遍历,根节点必须在子节点释放之后才能被释放 不然是找不到子节点的*/void deleteBinaryTreeNode(BinaryTreeNode* T){ if(T == NULL) return; else { deleteBinaryTreeNode(T->theLeft); deleteBinaryTreeNode(T->theRight); delete T; }} int main(){ BinaryTreeNode* T = NULL; int level = 1; createBinaryTreeNode(T); crossBinaryTreeNode(T, level); deleteBinaryTreeNode(T); return 0;} /* 结果: input: ABXDXXCEXXFXX output: A 在第 1 层 B 在第 2 层 D 在第 3 层 C 在第 2 层 E 在第 3 层 F 在第 3 层 图示: A / \ B C \ / \ DE F */
如果创建二叉树时,不使用引用符,那么就不能成功的将new新开辟的空间的地址放在T中,就达不到创建二叉树的效果。
当然,在使用完成之后,还需要释放用new开辟的空间。
0 0
- C++中交换两个数/二叉树的建立
- 关于c语言中交换两个数的方法
- C语言中有关两个数,值的交换
- 关于C语言中交换两个数的代码探讨
- C语言中交换两个数的方法
- 交换二叉树中每个节点的两个子女
- c c++ 交换两个数的值
- c语言--交换两个数的函数
- C语言交换两个数的值
- 【C语言】交换两个数的内容
- 交换两个数的C语言程序
- C语言交换两个数的值
- C++中两个数的交换
- C#中交换两个数的值
- C#中交换两个数的值
- 两个数的交换
- 两个数的交换
- 两个数的交换
- Matlab实现决策树算法进行数字识别
- OpenTSDB设计解读
- Struts2的简单配置
- android加载速度优化,通过项目的优化过程分析
- [HNOI2008]Cards (polya定理+乘法逆元,费马小定理)
- C++中交换两个数/二叉树的建立
- 第3章 数据链路层
- 【Leetcode】Copy List with Random Pointer
- 网站开发进阶(十五)JS基础知识充电站
- Visual Studio 2015安装心得
- Mac添加环境变量
- 习题3-11 UVa1588 Kickdown
- Android性能优化典范
- CSS进阶3: inline-block 的前世今生