【发布时间】:2015-09-06 06:20:03
【问题描述】:
我正在尝试使用 C 编程语言开发一个哈希表,该哈希表总是因段错误而失败。我正在尝试进行单独的链接,因此我创建了一个具有两个属性的结构:word 和 next。这个词是一个 char* 和 next 一个指向下一个节点的指针,最终创建一个包含链表数组的哈希表。
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
{
}
}
}
【问题讨论】:
-
您的第一句话听起来好像段错误是故意的。您的意思可能是“但它总是失败”。
-
predptr = table[0];- 你只是 (a) 泄露了内存,并且 (b) 将NULL放在了predptr中。随后的predptr->next = ...取消引用NULL并使您的进程崩溃。 -
编译时包含所有警告和调试信息 (
gcc -Wall -Wextra -g)。然后学习如何使用调试器,例如gdb(你需要有这个技能)。