在C中使用字符串插入二叉树

时间:2014-07-16 03:55:57

标签: c string compiler-errors malloc binary-tree

我的插入功能遇到了二进制字符串树。我递归地这样做。有两个编译错误,我似乎无法摆脱它,它与人们的名字有关。我将发布我的代码和我的错误以及示例输出和我应该阅读的文件。我的教授给我们显示功能,使它看起来像一个特定的方式。感谢您的帮助。

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>

#define MAX_NAME_LEN 25
#define START_DEPTH 0

typedef struct TreeNode_ {
    char name[MAX_NAME_LEN];
    struct TreeNode_ *left;
    struct TreeNode_ *right;
}TreeNode;

TreeNode* read_from_file(const char* file);
TreeNode* insert(TreeNode* node, const char *name);
TreeNode* create_node(const char *name);

int main (int argc, char *argv[]) {
    /*
     * Check command line parameters
     * */
    if (argc < 2) {
            printf("%s is missing parameters to run properly\n", argv[0]);
            return 1;
    }
    TreeNode* root = NULL;
    root = read_from_file(argv[1]);

    display_tree(root,START_DEPTH);
}

TreeNode* read_from_file(const char* file) {
    /* HINT
     *      TreeNode *t = NULL;
     *  t = insert(t,buffer);
     * loop check the return type on fscanf
     *  insert(t,buffer);
     */

    TreeNode *root = NULL;
    FILE *input = fopen(file, "r");
    char name[MAX_NAME_LEN];
    while(fscanf(input, "%s", &name) != EOF){
            //printf("\n%s", name);
            root = insert(root, name);
    }
    return root;
}

TreeNode* insert(TreeNode* node, const char *name) {

    if(node == NULL)
            node = create_node(name);

    else if( node != NULL){

            if(strcmp(name,node->name)<0)
                    node->left = insert(node->left, name);
            else if (strcmp(name,node->name) > 0)
                    node->right = insert(node->right,name);
    }
    return node;
}

TreeNode* create_node(const char *name) {

    TreeNode *node;
    node = (TreeNode*)malloc(sizeof(TreeNode));
    node->name = malloc(sizeof(TreeNode));;
    node->name = name;
    node->left = NULL;
    node->right = NULL;
    return node;
}


void padding (char ch, int n){

    int i;
    for (i = 0; i < n; i++)
            printf("%c%c%c%c", ch, ch ,ch, ch);

}

/*
 * A Beautiful way to display various sorts of trees, passing
 * this from one generation of students to the next.
 * */
void display_tree (TreeNode *root, int depth) {
    TreeNode *current = root;
    if (root == NULL) {
            padding (' ', depth);
            printf("-\n");
    }
else {
            display_tree(current->left, depth+1);
    padding(' ', depth);
    printf ( "%s\n", root->name);
    display_tree(current->right, depth+1);
}
}

我得到的错误是这样的,但请记住,我删除了大量代码,因此这些行号错误,当我将名称分配给node-&gt;名称时,错误在create_node函数中:

hw.c:167: error: incompatible types when assigning to type ‘char[25]’ from type ‘void *’
hw.c:168: error: incompatible types when assigning to type ‘char[25]’ from type ‘const char *’

我在(names.txt)中读到的名字

matt
sue
erik
nick
james
sachin
bob

所需的输出如下:

  -
        bob
            -
    erik
            -
        james
            -
matt
            -
        nick
                -
            sachin
            -
    sue
        -

2 个答案:

答案 0 :(得分:5)

您无法使用以下内容指定字符串:

node->name = name;

您需要使用strcpystrncpystrcatstrncat等功能:

strcpy(node->name, name); // Unsafe. name could be too long.

strncpy(node->name, name, MAX_NAME_LEN);
node->name[MAX_NAME_LEN] = '\0';

node->name[0] = '\0`;
strcat(node->name, name);  // Unsafe. name could be too long.

node->name[0] = '\0`;
strncat(node->name, name, MAX_NAME_LEN);
node->name[MAX_NAME_LEN] = '\0';

答案 1 :(得分:0)

在第

while(fscanf(input, "%s", &name)

它应该是name而不是&name。 (但在现代系统上,您的版本可能会起作用)。但是您应该指定fscanf的最大长度 - 否则此行与gets一样糟糕。

在此代码中存在一个问题:

node->name = malloc(sizeof(TreeNode));;
node->name = name;

您认为=在做什么?通过比较这两条线应该清楚它们都不是正确的。

=的实际效果是左侧表示的对象的值被右侧的值替换。

在第一行,您设置node->name以保存一些新分配的内存的地址。但是在第二行,您将其设置为保持name当前持有的相同地址。所以它不再保留新分配的内存的地址。

相反,您要做的是将name指向的字符串的内容复制到新分配的内存中。有一个复制字符串的功能:

strcpy(node->name, name);