0

我在 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,打印);printf("\n");

获取字符();返回0;

}
4

2 回答 2

2

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

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

于 2013-01-13T16:47:24.810 回答
2

您面临的麻烦与通过按值和按引用语义传递参数有关。在 C 中,所有变量都是按值传递的。指针通常被称为“按引用”传递,但事实并非如此。相反,它们能够以类似于引用语义的方式修改其他值。

问题是你有 add 功能:

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

create将 aroot*作为第一个参数。因此,它可以更改此参数指向的内存。函数执行后,所指向的内存r可能不同,但r本身会具有相同的值——即指针变量r总是指向同一个地方。

为什么这是相关的?查看您的main函数并注意 的初始r值为NULL。传递rcreate函数后,r 必须仍然是 NULL. 因此,您根本没有指向树的指针!

这对您来说可能不是这种情况,因为在函数中,您为(特别是 line )create分配了一个值。不幸的是,该行仅修改 的函数本地副本,因此更改不会反映在.rr=prmain

你怎么能解决这个问题?与其尝试修改函数内的main-local 副本,不如将函数更改为 return而不是. 然后,在 中,将您对函数的调用更改为:rcreatecreateroot*voidmain

r = create(r, a, 31);

如果create返回一个指向树根的指针,您现在将能够在任何地方维护对您的树的引用,并且它应该与您的其他函数一起正常工作。

于 2013-01-13T16:48:04.187 回答