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所存放的值。


【通俗的讲:】

好比有PQ两个Boss:

其中Q这个Boss有b这户人家的地址,Q就把这个地址告诉了小弟qQ传入函数的参数),

然后小弟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
原创粉丝点击