我正在尝试在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 - 这将包含树的节点的数据结构的声明,可以调用实现树的不同功能的各种功能(可以在不同的源文件中)< / p>
typedef struct node {
struct node* left;
struct node* right;
int key; // contains value
}NODE;
当我尝试在typedef extern struct node
中添加extern时,它会出现多个存储类的错误,但如果我错过它,我会得到多个定义的错误。
以下是我的其他源文件
traverse.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("\n\nThe 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 ("\n\nIn 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 ("\n\nIn 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);
}
}
这是我第一次尝试这种做法,请建议我的程序结构良好,还是应该尝试其他方法。
答案 0 :(得分:28)
在C中,结构没有链接,只有对象和函数。所以你可以这样写:
// header file 'node.h'
typedef struct node_
{
/* ... */
} node;
extern node root_node;
然后在某处提供实现:
// source file
#include <node.h>
node root_node;
答案 1 :(得分:25)
你不能制作一个结构extern
。只需在include-guard保护的头文件中定义它,并在您需要的任何地方包含该头文件。
我在the following way中使用这些热量:
结构类型定义描述属于的成员 结构体。它包含struct关键字后跟可选项 标识符(结构标记)和括号括起的成员列表。
结构声明与结构定义具有相同的形式 除了声明没有括号括起的成员列表。
所以“定义”正是我的意思。
答案 2 :(得分:2)
在头文件中声明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;