我尝试创建一个输入哈希表并返回键的链表的函数。 这是列表节点的结构:
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;
}
答案 0 :(得分:2)
列表插入逻辑中存在一个错误:
if (node != NULL) {
应该是:
if (list == NULL) {
由于此时node
始终不是NULL
,因为这是循环的条件,因此您实际上要检查这是否是要插入到新链接列表中的第一个条目(检查是否list
是NULL
将实现此目标)。请注意,您还应该先检查malloc
和strdup
是否成功,然后再将其添加到列表,清理链接列表(释放列表中分配的部分)并返回某种错误指示(如果没有)没有足够的内存来从表创建列表。
答案 1 :(得分:0)
您在这里的情况是错误的:
// should be list == NULL instead
if ( node != NULL ) {
list = tail = p;
}