我在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;
}
答案 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);
create
将root*
作为其第一个参数。因此,它可以更改此参数指向的内存。执行该函数后,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);
返回指向树根的指针,您现在可以在任何地方维护对树的引用,并且它应该与您的其他函数一起正常工作。