我的个人博客: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开辟的空间。