这是一个普通的二进制搜索遍历程序...文件名是BinaryFile.c
....
#include"bq.h" //****
typedef struct tree
{
int info;
struct tree *left;
struct tree *right;
}
tree; //line at which error is....previous definition of tree was here
tree *head;
createBST()
{
head=NULL;
}
inputBST(int element)
{
tree *node;
node=malloc(sizeof(tree));
tree *ptr;
ptr=head;
node->info=element;
node->left=NULL;
node->right=NULL;
if(head==NULL)
{
head=node;
}
else
{
while(ptr->left!=NULL || ptr->right!=NULL)
{
if(node->info < ptr->info)//means ptr it has to go to the left of the tree
{
if(ptr->left==NULL)
break;
ptr=ptr->left;
}
if(node->info > ptr->info)//this ptr means that it has to go to the right of the root
{
if(ptr->right==NULL)
break;
ptr=ptr->right;
}
}
if(node->info < ptr->info)//means ptr it has to go to the left of the tree
{
ptr->left=node;
}
if(node->info > ptr->info)//this ptr means that it has to go to the right of the root
{
ptr->right=node;
}
//ptr=head;
}
}
printBST_1()
{
tree *ptr;
ptr=head;
enqueue(ptr);
while(is_empty()!=0)
{
ptr=dequeue();
if(ptr->left!=NULL)
enqueue(ptr->left);
if(ptr->right!=NULL)
enqueue(ptr->right);
printf("%d ",ptr->info);
}
}
main()
{
int element,number;
printf("enter the no. of elements..\n");
scanf("%d",&number);
int i;
for(i=0;i<number;i++)
{
printf("\n-> ");
//element=gettint();
scanf("%d",&element);
inputBST(element);
}
//printBST(head);
printBST_1();
getch();
}
****和文件&#34; bq.h&#34;是....
#include "BinaryFile.c" //please note that appropriate include guard have been used....``
typedef struct queue
{
//int info;
tree *info;//tree node in queue....
struct queue *next;
}
q;
q *front;
q *rear;
createemptystack()
{
front=NULL;
rear=NULL;
}
enqueue(tree *element)
{
q *ptr;
ptr=malloc(sizeof(q));
if(front==NULL)
{
ptr->info=element;
ptr->next=NULL;
rear=ptr;
front=ptr;
}
else
{
ptr->info=element;
ptr->next=NULL;
rear->next=ptr;
rear=ptr;
}
}
tree * dequeue()
{
q *ptr;
ptr=malloc(sizeof(q));
ptr=front;
front=front->next;
return ptr;
free(ptr);
}
tree * peek()
{
tree *x;
x=rear->info;
return x;
}
int is_empty()
{
if(head==NULL)
return 0;
else
return 1;
}
我在这里做的是使用队列文件(bq)对用户在BinaryFile.h
中进行的二叉搜索树进行水平顺序遍历。
在文件BinaryFile.h
(第一个代码)中,其中声明的每个函数的编译器显示
error: redefinition of (function name)
error: previous definition of (function name) was here
请解释为什么会出现此错误以及如何解决。
答案 0 :(得分:1)
你的代码结构有点疯狂。通常,您不应该包含.c
文件,尤其不应包含在标头中。你正在做的事情更令人困惑:你在bq.h
和BinaryFile.c
BinaryFile.c
中加入了bq.h
,形成了无限循环的包含。
你应该做的是......好吧,这取决于你。这段代码看起来很简单,您可以将它全部放在一个.c
文件中,并完成它。
如果要以使用多个文件的方式构建代码,则应考虑模块,即相关功能的单元。例如,您可以拥有一个定义二叉树类型的模块和可在该树上运行的函数。
对于每个这样的模块,您将编写一个描述模块接口的.h
文件和一个实现该接口的.c
文件。
您的代码可以分为三个部分:二叉树模块,队列模块和主程序。
您将拥有二叉树标题tree.h
:
#ifndef TREE_H_
#define TREE_H_
typedef struct tree
{
int info;
struct tree *left;
struct tree *right;
}
tree;
void createBST(void);
void inputBST(int);
void printBST_1(void);
#endif
请注意,标头只包含类型定义和函数声明(如果您决定在接口中使用全局变量,那么您也可以在此处放置变量声明(但应尽可能避免使用全局变量)。)
相应的实施文件tree.c
:
// important: include our own interface definition to make sure it matches our implementation
#include "tree.h"
#include <stdlib.h>
// private functions/variables (those not part of our interface) are marked 'static'
static tree *head;
void createBST(void) {
... // your code goes here
}
void inputBST(int) {
... // your code goes here
}
void printBST_1(void) {
... // your code goes here
}
同样,对于队列,您将拥有bq.h
:
#ifndef BQ_H_
#define BQ_H_
#include "tree.h"
typedef struct queue
{
//int info;
tree *info; //tree node in queue....
struct queue *next;
}
queue;
void createemptystack(void);
void enqueue(tree *);
tree *dequeue(void);
tree *peek(void);
int is_empty(void);
#endif
以及相应的bq.c
:
#include "bq.h"
static queue *front;
static queue *rear;
void createemptystack(void) {
... // your code goes here
}
... // other function definitions go here
最后,您有main.c
:
#include "tree.h"
#include "bq.h"
#include <stdio.h>
int main(void) {
... // your code goes here
return 0;
}
简而言之:只包含头文件,并且永远不会在头文件中放置函数或变量定义(头文件只应包含声明)。