2015-10-21 40 views
2

对于这个问题,我必须通读一个并区分一个单词是什么。一个词不需要有意义,即。一个词可以是asdas,sdgsgd,dog,sweet等等。要访问我必须通过映射文件来完成。通过一个字典文件找到“单词”并添加到trie

File *map, *dictfile, *datafile; 
char *dictname, *dataname; 
map = fopen(argv[1],"r"); 
while (fgets(buffer,sizeof(buffer),map) != NULL) 
{ 
dictname = strtok(buffer," "); 
dataname = strtok(NULL, " "); 
strtok(dictname,"\n"); 
strtok(dataname,"\n"); 

该代码进入映射文件,然后区分什么是和文件名。 从我打开文件

if((datafile = fopen(dictname,"r")) == NULL) //error checking 
{ 
    in here I have to call a readDict(dictfile) 
} 

我的问题是在readDict,我有性格在这个字典文件去字符来区分究竟是怎样一个词,什么心不是。一个词可以由任何字母字符组成。 可以说包含:字典$ @#$ LoL!@#FFDAfg(()) 这里的单词是:dictionary,LoL,FFDAfg。 我需要阅读这些字符,如果它是一个字母,我需要直接将其添加到trie中(我还没有想出如何通过一次只添加一个字符来管理一个trie),或者我必须跟踪每个字符并将其放入一个字符串,一旦我到达非字母字符,我需要然后将该“单词”添加到字典中。

我的线索结构是:

struct trieNode 
{ 
bool isWord; 
struct trieNode *children[26]; //26 given there are 26 letters in the alphabet 
}; 

我有方法

struct trieNode *createNode() 
{ 
int i; 
struct trieNode *tmp = (struct trieNode*)malloc(sizeof(struct trieNode)); 
for (i = 0; i<26;i++) 
tmp -> children[i] = NULL; 

tmp -> isWord = false; 
return tmp; 

我当前的插入方法是:

void insert(char *key) 
{ 
int level = 0; 
int index = getIndex(key[level]); //previously defined just gets the index of where the key should go 
int len = strlen(key); 

if(root == NULL) 
root = createNode(); //root is defined under my struct def as: struct trieNode *root = NULL; 
struct trieNode *tmp = root; 
for (level = 0; level < len; level++) 
{ 
if (tmp -> children [index] == NULL) 
tmp ->children[index] = createNode(); 

tmp = tmp->children[index]; 
} 
} 

我相信,如果我最终这种方法会工作将字符串插入到trie中,但是我的问题是我不确定如何从我早期的readDict文件中获取字符串。此外,我不知道如何修改此(如果可能)一次插入一个字符,所以我可以通过char读取我的字符,并在我检查它是否是一个字母,并转换为小写添加到trie,如果它不是那里。

+0

所以,澄清:你想从你的readDict文件的字符串列表? – rohit89

+0

好吧,我需要阅读字典文件,并解释什么应该被视为一个“单词”和什么不应该,但一旦我找出什么是一个字,我必须弄清楚如何我可以将它插入到trie @ rohit89 – bkennedy

回答

1

所以一个粗略的做法就是这样。您可能需要添加一些条件来处理一些边缘情况。

void *readDict(char *fileName) 
{ 
    FILE *file = fopen(fileName, "r"); 
    char *word = malloc(100); 
    int index = 0; 
    int c; 
    while ((c = fgetc(file)) != EOF) 
    { 
     char ch = (char)c; 
     if (isalpha(ch)) // check if ch is a letter 
      word[index++] = ch; 
     else 
     { 
      word[index] = '\0'; 
      index = 0; 
      insert(word); 
     } 
    } 
    fclose(file); 
} 
+1

我相信你的意思是让它说void void readDict正确吗?因为你没有在这里返回任何东西 – bkennedy

+0

是的。固定。谢谢 – rohit89