C中的哈希表总是产生Seg故障

时间:2015-06-20 08:54:05

标签: c hash cs50

我正在尝试在C编程语言中开发一个哈希表,它总是因为seg错误而失败。我正在尝试单独链接,所以我创建了一个结构,它有两个属性:word和next。单词是char *,接下来是指向下一个节点的指针,最终创建一个包含链表列表的哈希表。

typedef struct node 
{
    char* word;
    struct node* next;

}node;

node* table[26]; 

在此之后,我通过使用哈希函数索引到表中,该函数只是索引到表中。

你有修复吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <cs50.h>

typedef struct node 
{
    char* word;
    struct node* next;

}node;

node* table[26]; 


int hash(char* key);
void index();

int main(int argc, char* argv[])
{
    index();

    return 0; 
}

int hash(char* key)
{
    int hash = toupper(key[0]) - 'A';
    int res = hash % 26;

    return res;
}

void index()
{   
    printf("Insert a word: ");
    char* k = GetString();    


    node* predptr = malloc(sizeof(node));
    node* newptr = malloc(sizeof(node));

    for(int i = 0; i < 26; i++)
    {
        if(hash(k) == i)
        {
            predptr = table[0];

            predptr->next = newptr;

            newptr = predptr;

            break;
        }

        else
        {

        }
    }


}

3 个答案:

答案 0 :(得分:5)

typedef struct node 
{
    char* word;
    struct node* next;

}node;

node* table[26]; 

table是一个包含26个指针的数组,全部初始化为NULL

具体来说,table[0]是一个NULL指针,您尝试取消引用它

            predptr = table[0];

            predptr->next = newptr; // dereference NULL pointer
            // NULL->next

答案 1 :(得分:0)

您创建了一个包含指向mysqli_set_charset($connect, 'utf8');结构的26个指针的表,但没有为它们分配内存。此外,还不清楚你的GetString()方法做了什么以及如何管理它返回的字符串的内存。您必须使用您的(不完整)索引方法(前提是您在那里正确分配必要的对象)而不是仅调用node哪些段错误,因为tabel [ha]不指向任何位置。

答案 2 :(得分:0)

  1. 如果您正在对单词进行散列,则将散列函数更改为

    int hash(char *k){ int i=0; for (;i<strlen(k) ;++i ){ //apply hashing technique } }

  2. 当您使用

    时,您的表有26个NULL指针

    predptr = table[0]; predptr->next = newptr;

  3. 这里predptr变为NULL然后你正在寻找它的下一个指针导致分段错误。

    1. 要提高索引性能,您不必搜索散列索引,只需转到索引&lt; (没有maxm条目)并且如果它是null则跟随它的指针然后在这里添加这个单词它自己跟随它的下一个指针。