我的插入功能遇到了二进制字符串树。我递归地这样做。有两个编译错误,我似乎无法摆脱它,它与人们的名字有关。我将发布我的代码和我的错误以及示例输出和我应该阅读的文件。我的教授给我们显示功能,使它看起来像一个特定的方式。感谢您的帮助。
#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
-
答案 0 :(得分:5)
您无法使用以下内容指定字符串:
node->name = name;
您需要使用strcpy
,strncpy
,strcat
,strncat
等功能:
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);