我尝试创建一个函数,输入哈希表并返回键的链接列表。 这是列表节点的结构:
struct hash_table_key_list_node_s {
char *key;
struct hash_table_key_list_node_s* next;
};
typedef struct hash_table_key_list_node_s hash_table_key_list_node_t;
typedef hash_table_key_list_node_t* hash_table_key_list_t;
我不明白为什么列表只包含一个元素,而哈希表包含 330 个元素。 这是函数的代码:
hash_table_key_list_t hash_table_keys(hash_table_t hash_table) {
hash_table_key_list_t list, tail, p;
list = tail = NULL;
if ( hash_table != NULL && hash_table->slots != NULL ) {
size_t index = 0;
while ( index < hash_table->capacity ) {
hash_table_list_node_t *node = hash_table->slots[index].head;
while ( node != NULL ) {
p = malloc(sizeof(hash_table_key_list_node_t));
p->key = strdup(node->key);
if ( node != NULL ) {
list = tail = p;
}
else {
tail->next = p;
tail = p;
}
node = node->next;
}
index++;
}
}
return list;
}
最佳答案
列表插入逻辑中存在错误:
if (node != NULL) {
应该是:
if (list == NULL) {
由于 node
在这一点上始终不是 NULL
因为它是您循环的条件并且您实际上想要检查这是否是要插入的第一个条目新链接列表(检查 list
是否为 NULL
将实现此目的)。请注意,在将其添加到列表之前,您还应该检查您的 malloc
和 strdup
是否成功,清理链接列表(释放列表的分配部分)并返回某种类型如果没有足够的内存来从表中创建列表,则错误指示。
关于C - 哈希表键的链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55973317/