重新定义typedef'树'和(函数名称)的先前声明在这里

时间:2017-05-13 19:14:13

标签: c

这是一个普通的二进制搜索遍历程序...文件名是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

请解释为什么会出现此错误以及如何解决。

1 个答案:

答案 0 :(得分:1)

你的代码结构有点疯狂。通常,您不应该包含.c文件,尤其不应包含在标头中。你正在做的事情更令人困惑:你在bq.hBinaryFile.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;
}

简而言之:只包含头文件,并且永远不会在头文件中放置函数或变量定义(头文件只应包含声明)。