gpt4 book ai didi

C:链表哈希表填充问题

转载 作者:太空宇宙 更新时间:2023-11-04 02:35:11 24 4
gpt4 key购买 nike

我是 C 的新手,目前正在编写拼写检查程序。为此,我首先将单词字典加载到哈希表中以便于引用。这是我的代码:

bool load(const char* dictionary)
{
typedef struct node
{
char word[LENGTH + 1];
struct node* next;
}
node;

node* table[500];

FILE *fp;
fp = fopen("dictionaries/small", "r");

if(fp == NULL)
{
return 0;
}

node* new_node = malloc(sizeof(node));
fscanf(fp, "%s", new_node->word);
int hashed_word = hash_function(new_node->word);

if(table[hashed_word] == NULL) //if the table has no value at the index
{
table[hashed_word]->word = new_node->word; //Issue here
}
return 0;
}

此代码非常简单地读取文件的第一行(单词),然后对其进行哈希处理(第一个单词“cat”的哈希值为 2)。然后我检查表在哈希函数给出的索引处没有一个词。

然后我想开始一个链接列表,第一个链接是第一个单词('cat'),我将从那里构建它。然而,当我运行这段代码时,我在这里遇到了一个问题:

table[hashed_word]->word = new_node->word; //Issue here

并得到这个错误:

dictionary.c:66:34: error: array type 'char [46]' is not assignable
table[hashed_word]->word = new_node->word;
~~~~~~~~~~~~~~~~~~~~~~~~ ^
1 error generated.

我认为这一行会将表的“单词”部分指定为“cat”(new_node 的单词部分),但事实并非如此

有人能告诉我我做错了什么吗?我想这是非常基本的,因为指针令人困惑!我已经坚持了好几天,开始有点沮丧,所以我很乐意提供任何帮助。

最佳答案

您正在创建一个包含 500 个指针的表,但您没有将其初始化为任何内容。然后您去检查元素以查看它们是否为空,它们可能是也可能不是(它们只是垃圾)。

当您尝试添加一个单词时,您尝试将其写入表中已有的节点,而不是仅仅将新分配的节点链接到表中。

您的表也是一个局部变量,因此在 load 函数返回后将无法访问。

解决上述所有问题的最简单方法是将表和 struct node 定义设为全局:

typedef struct node
{
char word[LENGTH + 1];
struct node* next;
} node;

node *table[500] = { 0 };

然后使用循环填充表格;

bool load(const char* dictionary)
{
char word[256];
FILE *fp = fopen("dictionaries/small", "r");
if(fp == NULL)
return false;

while (fscanf(fp, "%255s", word) == 1) {
if (strlen(word) > LENGTH)
continue; // ignore words that are too long
int hashed_word = hash_function(word);
node* new_node = malloc(sizeof(node));
strcpy(new_node->word, word);
new_node->next = table[hashed_word];
table[hashed_word] = new_node;
}
fclose(fp);
return true;
}

关于C:链表哈希表填充问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38621490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com