c-如何使结构外部化并定义其typedef



我正在尝试在C中实现树算法。我在一个完全独立的头文件(b_tree_ds.h)中声明了一个外部结构。现在我计划在所有想要使用该结构的源文件中导入该文件。所以我必须在头中使用extern来声明它。

现在的问题是,我也想定义它的typedef。编译器给出了多个存储类的错误。我该怎么做。

typedef extern struct node {
    struct node* left;
    struct node* right;
    int key;    // contains value
}NODE;

实际问题如下,我仍然无法解决???我最近学到了如何使用带有头文件的多个源文件来使代码具有可移植性和层次性。为了做到这一点,我厌倦了使用这个主体创建树程序。这是我的文件

b_tree_ds.h-这将包含一个树节点数据结构的声明,它可以被调用到实现树不同功能的各种函数(可能在不同的源文件中)

typedef struct node {
    struct node* left;
    struct node* right;
    int key;    // contains value
}NODE;

当我尝试在typedef extern struct node中添加一个extern时,它会给出多个存储类的错误,但如果我错过了它,我会得到多个定义的错误。

这是我的其他源文件

遍历.h-包含遍历函数的声明

void traverse_print (NODE* p);

这里我也得到未知标识符NODE 的错误

traverse.c-包含该函数的定义

#include <stdio.h>
#include "b_tree_ds.h"
#include "traverse.h"
void traverse_print(NODE* p)
{
    if(p->left != NULL)
    {
        traverse_print(p->left);
    }
    if (p->right != NULL)
    {
        traverse_print(p->right);
    }
    printf ("n%d",p->key);
}

最后是main.c

#include <stdio.h>
#include "traverse.h"
void main()
{
    // input
    NODE p;
    printf("nInput the tree");
    input_tree (&p);
    printf("nnThe tree is traversing ...n")
    traverse_print(&p);
}
void input_tree (NODE *p)
{
    int in;
    int c;
    NODE *temp;
    printf("n Enter the key value for p: ");
    scanf("%d", &in);
    p->key  =in;
    printf ("nnIn relation to node with value %d",in);
    printf ("Does it have left child (Y/N): ")
    if ((c = getchar()) == Y);
    {
        //assign new memory to it.
        temp = (NODE *)malloc(sizeof(NODE));
        input_tree(temp);
    }
    printf ("nnIn relation to node with value %d",p->key);
    printf ("nDoes it have right child (Y/N): ")
    if ((c = getchar()) == Y);
    {
        //assign new memory to it.
        temp = (NODE *)malloc(sizeof(NODE));
        input_tree(temp);
    }
}

这是我第一次尝试这样的练习,请建议我的课程结构是否良好,或者我应该尝试其他东西。

不能生成结构体extern。只需在包含保护的标头中定义它,并在任何需要的地方包含该标头。

编辑SquareRootOfTwentyThree

我以以下方式使用这些热量:

结构类型定义描述了属于结构它包含struct关键字,后跟可选关键字标识符(结构标记)和包含大括号的成员列表。

结构声明的形式与结构定义的形式相同除非声明中没有包含大括号的成员列表。

所以"定义";这正是我的意思。

在C中,结构没有链接,只有对象和函数可以链接

// header file 'node.h'
typedef struct node_
{
    /* ... */
} node;
extern node root_node;

然后在某个地方提供一个实现:

// source file
#include <node.h>
node root_node;

在头文件中声明node.h,如下

#ifndef NODE_H
#define NODE_H
#ifdef  __cplusplus
extern "C" {
#endif
typedef struct node {
        struct node* left;
        struct node* right;
        int key;    // contains value
    }NODE;

#ifdef  __cplusplus
}
#endif
#endif  /* NODE_H */  

你可以在任何c程序中包含这个头文件,并像一样使用它

NODE* newNode = NULL;