0

所以我在运行这个时得到一个“第 51 行:错误:取消引用指向不完整类型的指针”:

int main(void)
{
  Tree * testTree;

  testADT * data1;

  testTree = createTree(compare,destroy);

  data1 = malloc(sizeof(testADT));

  data1->val = 10;

  /* Line 51 */ addToTree(testTree,testTree->root,data1);

  destroyBinTree(testTree);

  return(0);
}

我的 addToTreeFunction:

TreeNode * addToTree(Tree * theTree,TreeNode * theTreeNode, TreeDataTypePtr data)
{
TreeNode * newNode;
if(isEmpty(theTree))
{
    newNode = malloc(sizeof(TreeNode));
    newNode->height = 0;
    newNode->data = data;

    theTree->root = newNode;
    return theTree->root;
}else{
    if(theTree->compare(theTreeNode->data,data) == 1) /* shows root data is smaller */
    {
        theTreeNode->right = addToTree(theTree,theTreeNode->right,data);
    }else 
    if(theTree->compare(theTreeNode->data,data) == 0) /* shows root data is larger */
    {
        theTreeNode->left = addToTree(theTree,theTreeNode->left,data);
    }
}
return theTreeNode;
}

我的 typedef 和结构:

struct tADT{
int val;
};

typedef struct tADT testADT;

typedef void * TreeDataTypePtr;

谁能提供一些关于发生了什么的见解?提前致谢!

编辑:这是我的模块(.c)

struct AvlNode{
void * data;
struct AvlNode * left;
struct AvlNode * right;
int height;
};


struct AvlTree{
int (*compare) (TreeDataTypePtr data1, TreeDataTypePtr data2);
void (*destroy) (TreeDataTypePtr data);
struct AvlNode * root;
};

这是在标题(.h)中

struct AvlTreeNode;
struct AvlTree;

typedef struct AvlTree Tree;
typedef struct AvlNode TreeNode;
typedef void * TreeDataTypePtr;

通过在标头中定义所有结构/类型定义来解决问题:

typedef struct AvlTree Tree;
typedef struct AvlNode TreeNode;
typedef void * TreeDataTypePtr;

struct AvlNode{
void * data;
struct AvlNode * left;
struct AvlNode * right;
int height;
};


struct AvlTree{
int (*compare) (TreeDataTypePtr data1, TreeDataTypePtr data2);
void (*destroy) (TreeDataTypePtr data);
struct AvlNode * root;
};
4

3 回答 3

1

您是否在某个头文件中的某处定义“树”?失败模块的第 51 行可以看到该标题吗?

您必须定义“树”:)

====================== 附录====================

感谢您使用树的“定义”更新您的帖子:

// .h file
struct AvlTreeNode;
struct AvlTree;
typedef struct AvlTree Tree;
...

但事实仍然存在——这些都是“不完整的类型”。

你说你在你的模块(.c)中定义了 AvlTree 和 AvlTreeNode 。

问:哪个.c 翻译单元?

问:在您尝试使用它之前,它是否已在该翻译单元中定义?

问:它是否用于任何其他翻译单元?

问:为什么重复/冗余/混淆 typedef 别名?

问:看在上帝的份上,为什么不直接在 .h 文件中定义它?

于 2012-11-28T04:59:02.047 回答
1

testTree->rootdereferences testTree,它是 type Tree,没有在任何地方定义。

于 2012-11-28T04:59:55.917 回答
1

该错误表明您有 的前向声明Tree,但没有其相应结构的完整定义。这就是为什么您可以声明指向 的指针Tree,但不允许取消引用其成员的原因。

确保包含的编译单元在包含定义的头文件的顶部main有一个,这将解决这个问题。#includestruct Tree

于 2012-11-28T05:00:29.617 回答