我正在尝试创建一个小程序,该程序从大小未知的文本文件中读取单词,并将这些单词存储到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 );
}
}
再次感谢!
答案 0 :(得分:0)
两个一般建议:
gdb
)。当然,您可以使用debug-output,但是它可能会花费更多的时间,并且在此之后必须进行清理。我的编译器说:
a.c:37:22: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
(*Root).data = ( My_string* )malloc( sizeof( My_string ));
您在这里尝试取消引用Root
并将值分配给data
字段。由于Root
是NULL
,因此程序在此处崩溃。看来您打算在此处为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
。我不了解您需要初始化现有树的情况,所以这似乎很自然。