【发布时间】:2016-03-21 13:24:14
【问题描述】:
我试图在我的树中插入节点,但我得到了错误
类型参数无效
#define info(p) (p)->info
#define left(p) (p)->left //error here
#define right(p) (p)->right // and here
#define root(t) (t).root
#define infoRoot(t) ((t).root)->info
#define nil NULL
typedef struct treenode *data;
typedef struct treenode {
int info;
data right;
data left;
}node;
typedef struct{
data root;
}tree;
当我尝试使用这个程序时:
void insert(tree *T,int x){
//Kamus
data baru;
data bantu;
//Algoritma
baru = (data)malloc(sizeof(node));
left(baru) = right(baru) = nil;
info(baru) = x;
bantu = root(*T);
if(isEmpty(*T)){
root(*T) = baru;
}
else if(bantu == nil){
baru = bantu;
}
else{
if(x < info(bantu)){
bantu = left(bantu);
insert(&left(*T),x);
}
else{
bantu = right(bantu);
insert(&right(*T),x);
}
}
}
当我在列表中使用这样的代码时,它可以被编译,我是不是用指针做错了?
【问题讨论】:
-
你为什么使用宏 - 并没有真正改进代码。
-
你为什么要这样做?!?这如何使您的代码变得更难阅读!
-
如果你给出完整的错误和它发生的行(并且你没有使用这些宏)会有所帮助,但是在快速浏览之后,你通过
*T(atree) 到left()和right()宏中,这似乎需要一个指向node的指针。 -
lol '我认为通过使用宏可以帮助我们的代码易于使用'。请不要想太多。
-
并且不要
typedef指针。混淆语义(即降低代码的可读性)并且容易出错。