4

我目前正在用c模拟adt,我应该制作一个包含字符串的二叉搜索树,我目前正在开始编码,但我收到了这个错误,它没有说明错误来自哪里,这里是代码,有人可以帮助我。

树.h

#ifndef tree_h
#define tree_h
#include <stdbool.h>
#include <stdlib.h>

typedef struct tree_node* node_ptr;

struct tree_node {
    char* word;
    node_ptr leftNode, rightNode;
};

node_ptr start = NULL;

void addItem(char*, int);
void display();

#endif

树.c

#include "tree.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>


void addItem(char arr[], int mode) {
    node_ptr temp, temp2;
     
    temp = (node_ptr)malloc(sizeof(struct tree_node));
    temp->leftNode=NULL;
    temp->rightNode=NULL;
    
    if(mode == 1){
        temp->word = arr;
        start = temp;
        }
    }  



void display() {
    node_ptr temp;
    temp = start;
    printf("%s", start->word);       
}

主程序

#include "tree.h"
#include <stdio.h>
#include <conio.h>

int main() {
    char word[31];
    
    printf("Enter Root Word: ");
    gets(word);
    addItem(word, 1);
}
4

4 回答 4

18

问题在于tree.h.

node_ptr start = NULL;

而且您同时tree.h包含main.ctree.cstart这为全局范围内的变量提供了多重定义错误。你真正需要的是,

// tree.h

extern node_ptr start;  

并将定义放在单个源文件中,例如 -

// tree.c

#include "tree.h"
........
node_ptr start = null;
于 2012-07-24T00:03:12.383 回答
7

您正在谈论的错误是:

... multiple definition of `start'

既然你有node_ptr start = NULL;tree.h每个包含的编译单元tree.h都会有自己的变量定义start。在链接时,链接器将看到变量的多个定义start并抛出错误。

为避免这种情况,请在 中定义starttree.c

node_ptr start;

然后声明startextern,以便其他编译单元知道它,但不会尝试自己定义它,在你的头文件中tree.h

extern node_ptr start;
于 2012-07-24T00:06:01.643 回答
3

您的错误是您定义:

node_ptr start = NULL;

因此,在您的头文件中,当您导入它时(不管宏保护如何),您将获得 start 的两个重新定义。

于 2012-07-24T00:03:26.003 回答
1
if(mode == 1)
{
temp->word = arr;/*here is another error*/
    start = temp;
    }

arr 对 main 来说是本地的,我认为对于更多节点,您必须重用 arr 数组来获取输入。当时它反映在所有节点中,因为每个节点的单词都指向相同的内存位置。所以它不是直接的选项分配。

您还必须为字符串动态分配内存。然后使用 strcpy() 函数将数据复制到动态内存位置。

好的,在那个地方使用这个代码:-

if(mode==1)
 {
  w_len=sizeof(char)*(strlen(arr)+1);//one extra character for null character
  temp->word=malloc(w_len);
  strcpy(temp->word,arr);
  start=temp;
 }
于 2012-07-26T20:30:35.973 回答