【发布时间】:2014-02-11 01:07:48
【问题描述】:
我正在尝试编写一个接收 .txt 文件的程序,读取所有行,然后将每个单词存储到 BST 中。然后我执行一个中序遍历以按字母顺序打印单词。如果文本文件仅包含 1 行,则程序可以完美运行,但如果文本文件超过 1 行,则会出现意外结果。
示例:文本文件:
first line
second line
仅输出:
line
second
完全丢失文本文件的第一行。
我的主要方法是:
#define MAX_STR_LEN 1024
int main(int argc, char** argv)
{
FILE *fptr;
fptr = fopen(argv[1], "r");
if(fptr == NULL)
{
printf("Error. Could not open file.\n");
exit(1);
}
char line[MAX_STR_LEN];
char* tok;
struct BSTnode* theRoot;
int isRoot = 1;
while(fgets(line, MAX_STR_LEN, fptr) != NULL)
{
tok = strtok(line, " \n");
while(tok != NULL)
{
if(isRoot == 1)
{
theRoot = createNode(tok); //creates the root for the BST
isRoot = 0;
}
else
{
processStr(&theRoot, tok); //places a new word into the BST
}
tok = strtok(NULL, " \n");
}
}
inorder(theRoot); //prints words alphabetically
fclose(fptr);
return 0;
}
我单步执行 GDB,当在 while 循环中第二次调用 fgets 时,BST 的根被更改并覆盖。任何建议将不胜感激。
编辑:
struct BSTnode* createNode(char* word)
{
struct BSTnode* temp = malloc(sizeof(struct BSTnode));
temp->word = word;
temp->left = NULL;
temp->right = NULL;
return temp;
}
void processStr(struct BSTnode** root, char* word)
{
struct BSTnode** node = search(root, word);
if (*node == NULL) {
*node = createNode(word);
}
}
struct BSTnode** search(struct BSTnode** root, char* word) {
struct BSTnode** node = root;
while (*node != NULL) {
int compare = strcasecmp(word, (*node)->word);
if (compare < 0)
node = &(*node)->left;
else if (compare > 0)
node = &(*node)->right;
else
break;
}
return node;
}
【问题讨论】:
-
在
createNode()和processStr()中,您是复制了单词还是只存储了指向它的指针? -
这两个函数都接受一个 char* 作为参数。 struct BSTnode 包含一个 char* 字。在 createNode(char* word) 中分配了一个新节点,然后将 node->word 设置为 word(参数)。
-
请更新您的问题并将您的
createNode()和processStr()包含在其中。
标签: c file binary-search-tree fgets