错误' - >'的无效类型参数(有'树')

时间:2015-12-15 16:33:58

标签: c pointers

我试着在我的树中插入节点,但是我收到了错误

  

的无效类型参数
#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);
        }
    }
}

当我在列表中使用这样的代码时,它可以被编译,我的指针是错误的吗?

1 个答案:

答案 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指令中的预处理器。