我正在编写一个程序来解析大型文本文件,计算每个单词出现的次数,然后使用该数据执行其他计算和比较。此刻,我遇到一个与我的hashTable insert()方法和我正在使用收集词的令牌之间的交互相关的问题。
我试图缩小发生错误的位置,但由于我似乎无法找到确切的位置,所以我必须忽略了一些东西。
下面是insert方法的代码:
void insert(struct table * t, char *key)
{
int pos = hashCode(t,key);
struct node *list = t->list[pos];
struct node *newNode = (struct node*)malloc(sizeof(struct node));
struct node *temp = list;
while(temp != NULL)
{
if(strcmp(temp->key, key) == 0)
{
temp->count+=1;
printf("Match found, count incremented");
return;
}
temp = temp->next;
}
newNode->key = key;
newNode->count = 1;
newNode->next = list;
t->list[pos] = newNode;
return;
}
该方法应该为传递给该函数的单词创建一个哈希码,然后,如果该哈希码已经存在,则在链接列表中进行迭代,如果找到完全匹配的单词,则增加该单词的数量。否则,它将创建一个新节点并将其添加到哈希表中。 这是我用来解析文件的方法的相关代码,在开发的这个阶段,我只想忽略delim的空白字符:
char delim[] = " \t\r\n\v\f";
while((nread = getline(&line, &len, fp)) != -1) {
char * token = strtok(line, delim);
printf("line grabbed. %s\n", filename);
while(token != NULL) {
printf("Tok: %s\n", token);
insert(t, token);
printf("Inserted: %s Count: %d\n", lookup(t, token)->key, lookup(t, token)->count);
token = strtok(NULL, delim);
}
}
在调用insert方法以获取重复标记(即文件中“ word”的第二个实例)后发生错误。insert语句被调用,并且成功将其识别为重复并递增,但不会继续通过代码到达下一个打印语句(插入的语句)。
输出显示如下:
Table created, attempting to fill.
line grabbed. t2.txt
Tok: word
Inserted: word Count: 1
Tok: word
Match found, count incremented
任何人都可以洞悉我在实施过程中出了哪些问题吗?
编辑:输入文件为
word word word
word