C - 散列 table 键的链表
C - Linked list of hash table keys
我尝试创建一个函数,输入哈希 table 和 return 键链接列表。
这是列表节点的结构:
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;
我不明白为什么列表只包含一个元素,而散列 table 包含 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
,因为它是您循环的条件,您实际上想检查这是否是要插入到新 [=24 中的第一个条目=] 列表(检查 list
是否为 NULL
将实现此目的)。请注意,在将 malloc
和 strdup
添加到列表之前,您还应该检查它是否成功,清理 link 列表(释放列表的分配部分)并返回某种错误指示是否没有足够的内存来从 table.
创建列表
我尝试创建一个函数,输入哈希 table 和 return 键链接列表。 这是列表节点的结构:
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;
我不明白为什么列表只包含一个元素,而散列 table 包含 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
,因为它是您循环的条件,您实际上想检查这是否是要插入到新 [=24 中的第一个条目=] 列表(检查 list
是否为 NULL
将实现此目的)。请注意,在将 malloc
和 strdup
添加到列表之前,您还应该检查它是否成功,清理 link 列表(释放列表的分配部分)并返回某种错误指示是否没有足够的内存来从 table.