C语言:实现一个包含文本文件中字符串(单词)的BST的数组

时间:2018-12-02 05:19:52

标签: c arrays string tree crash

我正在尝试创建一个小程序,该程序从大小未知的文本文件中读取单词,并将这些单词存储到Binary Search Trees(BST)数组中。数组中的每个索引代表该BST树中单词的长度。

例如,索引0不包含单词,但索引1包含具有一个字母长的单词的BST树,而索引5包含具有5个字母长的单词的BST树,等等。通过比较两个字符串来平衡所有BST树确定新字符串是大于还是小于根字符串,然后进行相应分配。

我的原始代码包含不透明的对象(void指针)。但是,我提供了一个我试图理解的程序的较小版本。我加入了printf语句来展示我的调试方法,因为该程序一直崩溃。我每天都在为此工作了几个小时,无法让它在我的一生中运行。由于某种原因,我无法确定我是否正确使用了指针,因此在对该代码进行了约5次不同的重写之后,我决定只使用基础知识,但我似乎也无法使其正常工作。

请帮助,这让我很烦。感谢您的慷慨和考虑,以便提前帮助我。

我的输出如下:

A CHECKPOINT
B CHECKPOINT
C CHECKPOINT
1 CHECKPOINT
2 CHECKPOINT

代码如下:

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

typedef struct my_string{
char* data;
struct my_string *left, *right;
} My_string;

void init( My_string* Root, char* data );

int main(int argc, char* argv[]){
    My_string* myStringArray[ 30 ] = {NULL};
    /*My_string* Root = NULL;*/
    FILE *fp = NULL;
    char new_string[ 30 ];
    fp = fopen( "dictionary.txt", "r");
    int string_length = 0;
    printf( "A CHECKPOINT\n");
    while( fscanf( fp, "%1024s" , new_string ) == 1 ){
        printf( "B CHECKPOINT\n");
        string_length = strlen( new_string );
        printf( "C CHECKPOINT\n");
        init( myStringArray[ string_length ], new_string );
        printf( "D CHECKPOINT\n");
    }
    printf( "" );
    fclose(fp);
    return 0;
}

void init( My_string* Root, char* data ){
    printf( "1 CHECKPOINT\n");
    int compare = 0;
    if( Root == NULL ){
        printf( "2 CHECKPOINT\n");
        (*Root).data = ( My_string* )malloc( sizeof( My_string ));
         printf( "3 CHECKPOINT\n");
        if( !Root ) exit(1);
        Root->data = data;
        Root->left = Root->right = NULL;
    }
    else{
        if( compare = strncmp( data, Root->data, 36 ) == 0 )return;
        else if( compare == -1 ) init( Root->left, data );
        else init( Root->right, data );
    }
}

再次感谢!

1 个答案:

答案 0 :(得分:0)

两个一般建议:

  1. 您可以使用调试器来查找错误的确切位置,而不是使用调试输出(例如,学习如何使用gdb)。当然,您可以使用debug-output,但是它可能会花费更多的时间,并且在此之后必须进行清理。
  2. 不要忽略编译器警告。

我的编译器说:

a.c:37:22: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
(*Root).data = ( My_string* )malloc( sizeof( My_string ));

您在这里尝试取消引用Root并将值分配给data字段。由于RootNULL,因此程序在此处崩溃。看来您打算在此处为Root赋值,但它是一种类型。 所以应该是这样的:

Root = ( My_string* )malloc( sizeof( My_string ));

顺便说一句,代码中还有另一个问题:当您将Root作为函数参数传递时,退出函数后将不会更改它:

My_string* Root = NULL;
init(Root, data);
// Root is NULL here

解决此问题的一种方法是将指针传递到Root

init(&Root, data);
void init( My_string** Root_ptr, char* data ){
    ...
}

并相应地修改代码。

另一种方法是更改​​init签名并使其返回新创建的Root。我不了解您需要初始化现有树的情况,所以这似乎很自然。