二叉树和传递参数

时间:2013-01-13 16:40:11

标签: c++ function arguments

我在C ++中有一个二叉树程序,它解析一串字符,然后根据它构成一个二叉树。我有一个问题,即将参数传递给我的函数。我尝试阅读关于将参数传递给c中的函数的教程,并更改了我的代码,但它似乎没有用。我希望有人帮我修复参数的传递。

标题:

     #define NULL 0

 struct TreeEl {

   char inf;
struct TreeEl * st, * dr;

};

typedef struct TreeEl root;


root* add(root *r, char st[], int &pos, int &n);
root* create(root *r, char st[100], int n);

void visit(root*);
void preorder(root *r, void visit(root*));
void inorder(root *r, void visit(root*));
void postorder(root *r, void visit(root*));

代码:

    #include "arbore_binar.h"
#include <stdio.h>



using namespace std;

void visit(root *r)
    {

    printf("Node %c",r->inf);

    }


root* add(root *r, char st[], int &pos, int &n)
{

int done=0;

do
{
    pos++;
    printf(" procesing character:,%c \n",st[pos]);
    switch (st[pos])
    {
        case '(':
        {
            add(r->st, st, pos, n);
            break;
        }
        case ')':
        {
            done=1;
            break;
        }
        case ',':
        {
            add(r->dr, st, pos, n);
            break;
        }
        case '$':
        {
            if (st[pos+1]==',')
                done=1;
            if (st[pos+1]==')')
                done=1;
            break;
        }
        default:
        {
            if ((st[pos]>=65)&&(st[pos]<=90))
             {
                 printf(" Added: ,%c \n" ,st[pos]);

                 root *p;
                 p = new root;
                 p->inf=st[pos];
                 p->st=NULL;
                 p->dr=NULL;
                 r=p;
                 if (st[pos+1]==',')
                    done=1;
                 if (st[pos+1]==')')

                    done=1;




             }
             else
                printf("Error,unknown character: %d ",st[pos]);
        }
    }
} while ((done==0)&&(pos<n));
return r;
}

root* create(root *r, char st[100], int n)
{

    int pos=-1;
    root* nod = add(r, st, pos, n);
    return nod;
}
void preorder(root *v, void visit(root*))
{
  if (v == NULL)

      return;


else {
visit(v);
preorder(v->st, visit);
preorder(v->dr, visit);
}
}
void inorder(root *v, void visit(root*))
{
  if (v == NULL) return;
else {
inorder(v->st, visit);
visit(v);
inorder(v->dr, visit);
}
}
void postorder(root *v, void visit(root*))
{
  if (v == NULL) return;
else {
postorder(v->st, visit);
postorder(v->dr, visit);
visit(v);
}
}



void print(root* x)
{
    printf("%c" , x->inf ,"  " );
}

int main()
{
//char a[100] = "A(B(J,$),C(X,D(E,F($,Y))))";
//char a[100] = "A(B,C(X,D(E,F($,Y))))";
char a[100] = "A(B(C(M,$),D),E(F(X,$),G($,Y)))";
root *r;
r=NULL;
r=create(r, a, 31);

printf("Preorder traversal:" );
preorder(r, print);
printf("\n");
printf("Inorder traversal: ");
inorder(r, print);
printf("\n");
printf("Postorder traversal: ");
postorder

(r,print); 的printf( “\ n”);

的getchar(); 返回0;

}

2 个答案:

答案 0 :(得分:2)

请记住,C按值传递指针。因此像root *p;r=p;这样的代码不会修改函数外部的root值。

在要重新分配r的函数中,您可能希望将其作为指针指针传递,或root **r。您可以将此类函数称为create(&amp; r,a,31);将指针变量的地址作为指向r指针的指针传递给函数。

答案 1 :(得分:2)

您遇到的麻烦与通过按值和按引用语义传递参数有关。在C中,所有变量都按值传递。指针通常被称为“按引用”传递,但它们不是。相反,它们以类似于引用语义的方式启用其他值的修改。

问题是你有添加功能:

void create(root *r, char st[100], int n);

createroot*作为其第一个参数。因此,它可以更改此参数指向的内存。执行该函数后,r指向的内存可能不同,但r本身将具有相同的值 - 也就是说,指针变量r将始终指向相同的值的地方。

为什么这有关系?查看您的main功能,并注意r的初始值为NULL。将r传递给create函数后,r 仍必须 NULL。因此,你根本没有指向树的指针!

这似乎不适合您,因为在create函数中,您为r(特别是行r=p)分配了一个值。不幸的是,该行只修改r功能 - 本地副本,因此更改不会反映在main中。

你怎么能解决这个问题?您可以将main函数更改为返回r而不是{create,而不是尝试修改create函数中root*的{​​{1}}本地副本。 1}}。然后,在void中,将您对函数的调用更改为:

main

如果r = create(r, a, 31); 返回指向树根的指针,您现在可以在任何地方维护对树的引用,并且它应该与您的其他函数一起正常工作。