我试着在我的树中插入节点,但是我收到了错误
的无效类型参数
#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);
}
}
}
当我在列表中使用这样的代码时,它可以被编译,我的指针是错误的吗?
答案 0 :(得分:3)
使用gcc -E
对此代码运行预处理器会显示可能会使这些错误更加清晰的替换。
void insert(tree *T,int x){
data baru;
data bantu;
baru = (data)malloc(sizeof(node));
(baru)->left = (baru)->right = ((void *)0);
(baru)->info = x;
bantu = (*T).root;
if(isEmpty(*T)){
(*T).root = baru;
}
else if(bantu == ((void *)0)){
baru = bantu;
}
else{
if(x < (bantu)->info){
bantu = (bantu)->left;
insert(&(*T)->left,x);
}
else{
bantu = (bantu)->right;
insert(&(*T)->right,x);
}
}
}
如果T
的类型为“指向树的指针”,则(*T)
的类型为“树”。因此(*T)->left
无效,因为->
运算符会尝试取消引用(*T)
而不是指针!
此处可能还有其他错误,但这可以帮助您解决问题。希望您可以看到宏的这种使用如何模糊您的代码,在这种情况下,如果您在代码体中使用->
和.
运算符而不是代码,那么您的代码将更易读并且更不容易出错通过#define
指令中的预处理器。