C ++程序没有理由结束? (哈希表)

时间:2017-05-15 10:18:11

标签: c++ hashtable

我正在尝试使用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()函数中,可能在条件中,但我不知道出了什么问题。

3 个答案:

答案 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。