我正在尝试使用Separate链接冲突解决方案实现哈希表,我遇到了问题。 这是我的代码(很少修改以简化,但错误仍然相同):
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
using namespace std;
int ascii(char character)
{
return character;
}
int hashFunction(string word, int num)
{
char* str = new char[word.length() + 1];
strcpy(str, word.c_str());
return ((3 * ascii(str[0]) + 5 * ascii(str[1]))) % num;
}
typedef struct tab
{
string data;
struct tab* next;
}Node;
typedef struct link
{
Node* head;
Node* tail;
}List;
List* createList()
{
List* list = new List();
if (list)
{
list->head = NULL;
list->tail = NULL;
}
return list;
}
void insert(List* list, string data)
{
//if list is empty
if (list->head == NULL) //!!!!!!!!!!!!!!!!ERROR OCCURE HERE !!!!!!!!!!!!!!!
{
list->head = new Node();
list->head->data = data;
list->head->next = NULL;
list->tail = list->head;
}
//if list already contains some data
else
{
list->tail->next = new Node();
list->tail->next->data = data;
list->tail = list->tail->next;
list->tail->next = NULL;
}
}
int main(int argc, char* argv[])
{
int size = 8; //Size of hash table (number of indexes)
List* table[12];
string A[8] = { "hello","world","car","notebook","science","starwars","lollypop","anything" };
//Insert elements from array A into a hash table
int index;
for (int i = 0; i < size; i++)
{
index = hashFunction(A[i], size);
if (table[index] == NULL)
table[index] = createList();
insert(table[index], A[i]);
}
return 0;
}
当我运行.exe文件(或从cmd开始)时,程序最终会显示app.exe已停止工作的消息。我试过调试程序并得到了这个: http://imgur.com/a/yOhRV
任何人都可以帮我解决这个问题吗?我已经发现问题必须在insert()函数中,可能在条件中,但我不知道出了什么问题。
答案 0 :(得分:3)
你不知道它就不知道指针:if (list->head == NULL)
......
你在这里做的是,如果它指出的值为list
,则会NULL
并检查,但是由于你没有检查if (list)
,所以{{1}可能并且在解除引用时会导致段错误
答案 1 :(得分:1)
您声明List* table[12]
但它从未初始化。所以它确实包含垃圾。
您必须执行以下操作才能对其进行初始化:List* table[12] = {NULL}
;
答案 2 :(得分:0)
作为一般规则,您的代码中绝不应该包含未初始化的变量(除非出于优化目的,当您确切知道自己在做什么时)。
将默认构造函数添加到结构中并使用初始化列表。同时将变量保持为局部变量(在循环内移动索引)。
您不需要ascii()因为char是整数类型。 char + char和char * int被提升为int。