结构体指针操作理解应用

来源:互联网 发布:淘宝bose官方旗舰店 编辑:程序博客网 时间:2024/06/04 20:01

     前几天写数据结构作业时候,写到了树,在操作结构体指针的时候遇到了很多的麻烦,在这里与大家分享一下,牛人请选择无视,渣渣看过来。

    我遇到的问题是,使用一级指针直接在void函数里面构建树为什么传回来的根节点是空的,就是说什么都没有,这个根根本没有被操作。

    如果你也遇到了这个问题并且深感困惑,那我要告诉你一个好消息和一个坏消息。

    坏消息是你跟我一样渣,这么基础的东西都不会云云,好消息是,你竟然来搜索这个问题的答案,这比抄代码而不知所以然的人要强那么一点点。

好,言归正传。

首先要记住这么几个忠告:

  【函数不可能改变参数本身】

  【如果函数的参数是一个指针,不要期望用该指针去申请动态内存内容】

    C++的函数操作参数的原理是这样的:首先为参数复制一个映像,他和原来的参数一模一样,接下来的所有操作都是针对这个映像的,这就是你老师上课给你讲的那句话:

函数不可能改变参数的值,这是接下来的根本。

   那么如果一个函数里面是对指针的操作,情况也是一样的,我们知道指针这个东西也是一个变量,只是它存的是地址,它本身就是地址http://baike.baidu.com/link?url=Usw5gcHw14CdEpROaHsGrWJyTTQtHqxUbl0oxVsqBMuTuuEXOuVmgnsfHv9FZfqQ50Qf0pkJ3fle6TqxNAfNBTbWjbm1x7nTtH9hxObhj1a 那么在一个函数中引用了这个指针,最后再去访问,你会发现没有任何变化,应用前面的结论:参数指针指向的地址没变,参数指针指向的内容变了,映像指针的地址和内容都变了。指针的地址都不变,又怎么去为搞根节点的儿子,不存在啊。

解决这个问题的方式有两种:

一是使用双指针,像上面说的那样,双指针在函数中不能改变,也就是双指针指向的地址不变还是他自己,但是双指针指向的地址的内容会变也就是一级指针,这样才算真正的给一级指针赋值了。

二是使用地址引用,传引用的时候,函数操作的就不是愚蠢的映像了,而是真真切切的参数本身,这种方式不需要更多的解释了。

懂了这些,前序二叉树就是printf那么简单

#include <iostream>
#include "Interface.h"
using namespace std;
typedef struct node
{
char data;
struct node *left;
struct node *right;
}Bnode,*Btree;
void createTree(Btree *root)
{
char ch;
cin >> ch;
if (ch == '#')*root = NULL;
else
{
*root = (Bnode*)malloc(sizeof(Bnode));
(*root)->data = ch;
createTree(&(*root)->left);
createTree(&(*root)->right);
}
}
void traveltree(Btree root)
{
if (root != NULL)
{
cout << root->data;
traveltree(root->left);
traveltree(root->right);
}
}
int main()
{
Btree root = NULL;
createTree(&root);
traveltree(root);
system("pause");
return 0;
}

0 0
原创粉丝点击