gpt4 book ai didi

c - 当向hashmap中的链表添加第一个节点时,为什么必须将新节点直接分配给索引指针?

转载 作者:行者123 更新时间:2023-11-30 14:36:15 25 4
gpt4 key购买 nike

这是我在 c 中实现的 hashmap 及其初始化和插入代码。在 hashmap_t 结构中,我使用指向包含键/值对的节点的指针数组(表)。在 hashmap_init 中,我分配所需数量的节点并循环遍历数组,将每个指针设置为 NULL。

我感到困惑的是 hashmap_put 函数。我找到了应该插入键的列表的索引,并且第一个指针由 hm->table[i] 引用。为了清楚起见,我想确保 hm->table[i] 明显是列表的开头,因此我将其分配给 hashnode_t *head。

因此,在插入第一个节点(head == NULL)时,我最初使用 head = new_node,但我的插入都不起作用。它仅在我使用 hm->table[i] = new_node 时有效。

我不明白为什么会这样。 head 指向同一件事,那么为什么设置 head 等于 new_node 不起作用呢?当 last->next = new_node 起作用时,我也很困惑。 Last 是一个指针,就像 head 一样,但它在那里工作。

感谢您的澄清。

typedef struct hashnode {
char key[128];
char val[128];
struct hashnode *next;
} hashnode_t;

typedef struct {
int item_count;
int table_size;
hashnode_t **table;
} hashmap_t;

void hashmap_init(hashmap_t *hm, int table_size) {
hm->table_size = table_size;
hm->item_count = 0;
hm->table = malloc(table_size * sizeof(hashnode_t));
for (int i = 0; i < table_size; i++) { // loop through array of pointers to nodes
hm->table[i] = NULL;
}
}

int hashmap_put(hashmap_t *hm, char key[], char val[]) {
hashnode_t *new_node = malloc(sizeof(hashnode_t)); // allocate new node
strcpy(new_node->key, key);
strcpy(new_node->val, val);
new_node->next = NULL;

int i = hashcode(key) % hm->table_size; // index of list hashed to
hashnode_t *head = hm->table[i];
hashnode_t *cur = head;
hashnode_t *last;

if (!head) { // list is empty
new_node->next = head;
hm->table[i] = new_node;
//why does head = new_node not work?
hm->item_count += 1;
return 1;
}

while (cur) { // loop through nodes
if (strcmp(cur->key, key) == 0) {
strcpy(cur->val, val);
free(new_node);
return 0;
}
last = cur; // save pointer to node that points to NULL
cur = cur->next;
}
last->next = new_node;
//why does it work here?
hm->item_count += 1;
return 1;
}

最佳答案

'head' 指向 hashnode_t,'hm->table[i]' 也是如此。因此,它们都指向同一个对象。改变“头”只会使“头”指向别处。您实际上尚未将 hashmap_t 中的指针分配给“new_node”。

“last”起作用的原因是您正在将成员变量更改为新值。并且,由于“last”指向 hashmap_t 中已有的对象,因此赋值会更新 hastmap_t 中指向的对象。因此,对“last->next = new_node”的更新与“hm->table[x]->next = new_node”相同(“x”是某个任意索引)。

关于c - 当向hashmap中的链表添加第一个节点时,为什么必须将新节点直接分配给索引指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58190701/

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