我正在编写一个HashTable程序,其中HashTable充满了LinkedLists,它计算文件的单词频率。在程序的最终实现中,允许用户通过命令行参数选择链表的链大小,其中任何其他命令行参数假定为需要处理的文件。
现在我从我的搜索功能得到一个堆栈溢出问题,以确定该单词是否已经在表中,我不知道如何解决它。我对程序说它可能过流
在我向哈希表添加另一个节点之前,我调用一个方法,如果找到该单词则返回1,如果找不到则返回0。这是电话:
inFile = searchFile(table, data);
表是HashTable,数据是单词
searchFile,它调用的是我的List类的一部分
int searchFile(HashTablePtr table, char *data) {
ListPtr tempList;
HashObjectPtr obj;
int i;
for (i = 0; i < table->size; i++) {
tempList = table->table[i];
if (tempList->size > 0) {
obj = search(table->table[i], data);
if (obj != NULL) {
obj->frequency++;
return 1;
}
}
}
return 0;
}
列出搜索功能
HashObjectPtr search(ListPtr list, char *data) {
int num = list->size;
int i;
NodePtr tempNode;
HashObjectPtr tempObj;
tempNode = list->head;
for (i = 0; i < num; i++) {
tempObj = tempNode->HashObject;
while (tempNode != NULL) {
if (strcmp((char *) tempObj->obj, data) == 0) {
return tempObj;
} else {
tempNode = tempNode->next;
}
}
}
return NULL;
}
我之前在此程序的实现中使用了HashObjectPtr搜索功能,没有任何问题,我不确定为什么它会立即创建溢出。
HashObject
struct hashobject {
int frequency;
void *obj;
char (*toString)(void *obj);
};
HashTable
struct hashtable {
int size;
ListPtr *table;
};
Lise
struct list {
int size;
NodePtr head;
NodePtr tail;
};
我不完全确定它是堆栈溢出,因为所有valgrind真正显示的是几个单词已经进入然后我得到了分段错误错误。我已经通过调试器运行了它,但在经过大约12次迭代的for循环后,它在我的搜索功能中失败了。
答案 0 :(得分:2)
一个细节,我不知道它是否能解决你的问题。在原始循环中:
tempObj = tempNode->HashObject;
while (tempNode != NULL) {
if (strcmp((char *) tempObj->obj, data) == 0) {
return tempObj;
} else {
tempNode = tempNode->next;
}
}
您将tempObj
分配给第一个 tempNode。然后,您将遍历所有节点。除了没有找到除第一个节点之外的任何内容之外,当列表为空时它将不起作用。
相反,将它放在循环旁边:
while (tempNode != NULL) {
tempObj = tempNode->HashObject;
if (strcmp((char *) tempObj->obj, data) == 0) {
return tempObj;
} else {
tempNode = tempNode->next;
}
}