//The Last attempt//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct WordNode {
char word;
int line;
struct WordNode* left;
struct WordNode* right;
};
struct WordNode createNode(char word, int line) {
struct WordNode* node=NULL;
node =malloc(sizeof(struct WordNode));
node->word = word;
node->line = line;
node->left = NULL;
node->right = NULL;
return node;
}
struct WordNode insert(struct WordNode* root, char word, int line) {
if (root==NULL) {
return createNode(word, line);
}
int cmp = strcmp(word, root->word);
if (cmp == 0) {
// word already exists in tree, so do nothing
return root;
} else if (cmp < 0) {
root->left = insert(root->left, word, line);
} else {
root->right = insert(root->right, word, line);
}
return root;
}
int main(int argc, char argv[]) {
if (argc != 2) {
printf("Usage: %s <filename>\n", argv[0]);
return 1;
}
char filename = argv[1];
FILE *file = fopen("D:\TXTFolder\Text1.txt", "r");
if (file == NULL) {
perror("Error opening file");
return 1;
}
struct WordNode *root = NULL;
char line[256];
int lineNumber = 1;
while (fgets(line, sizeof(line), file)) {
char word = strtok(line, " \n\t");
while (word != NULL) {
root = insert(root, word, lineNumber);
word = strtok(NULL, " \n\t");
}
lineNumber++;
}
fclose(file);
return 0;
}
这是一个程序,它读取一个文本文件,并将该文本文件中的唯一字按字母顺序存储在二叉搜索树中,该程序还将C语言中提到的那些存储的唯一字所在的行的索引存储在同一个二叉搜索树中。
在createNode()
和insert()
这两个函数中似乎有错误,因为它们都应该返回一个结构体,但似乎我不能。
2条答案
按热度按时间k7fdbhmy1#
malloc(sizeof(struct WordNode))
分配足够的内存来存储struct WordNode
,并返回指向该内存的指针;内存的地址,你把它赋给一个struct WordNode*
(一个指向struct WordNode
的指针),如果你想返回它,你需要返回一个指向struct WordNode
的指针。......以及在其他任何地方返回指向WordNode的指针。
您可以返回
struct Node
的副本......但现在您无法检查
node == NULL
之类的内容。习惯使用指针。
还有一个问题是,你的“word”是一个单一的字符,一个
char
,但是你把它当作一个字符串来处理,字符串在C中是一个指向字符数组的指针,一个char *
。...并且您使用
word
的其他任何地方都必须是char *word
。您还需要将argv[]声明为字符指针(字符串)数组。
strtok
不复制单词,它只是指向原始字符串中的单词。当您存储从strtok
返回的word
时,它指向line
中的内存。每次读取一行时,line
都会被覆盖,因此存储的单词也会被覆盖。您需要将单词复制到新内存。请使用
strdup
。双引号字符串中的反斜杠表示后面的字符有特殊的含义,如
\n
表示换行符,\t
表示制表符。如果您指的是文字反斜杠,请使用\\
。erhoui1w2#
从一个结构函数返回一个结构
只需返回
struct
,就像代码返回int
一样。不过这并不是一个好主意,最好分配内存并返回一个指向
struct WordNode
的指针。char
中可以保存的 words 非常少,像'A'
,'I'
,'O'
这样的单词,到目前为止,函数更可能接受指向字符(char *
)的指针,并且createNode()
将分配引用的 string 的副本。有关
my_strdup()
的信息,请参见this。