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 将实现此目的)。请注意,在将 mallocstrdup 添加到列表之前,您还应该检查它是否成功,清理 link 列表(释放列表的分配部分)并返回某种错误指示是否没有足够的内存来从 table.

创建列表