我正在尝试在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
{
}
}
}
答案 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)
如果您正在对单词进行散列,则将散列函数更改为
int hash(char *k){
int i=0;
for (;i<strlen(k) ;++i ){
//apply hashing technique
}
}
当您使用
时,您的表有26个NULL指针 predptr = table[0];
predptr->next = newptr;
这里predptr变为NULL然后你正在寻找它的下一个指针导致分段错误。