【发布时间】:2021-12-25 09:30:01
【问题描述】:
我在 C 中为带有链表(为了避免冲突)的哈希表分配内存时遇到了问题。
我认为问题在于项目的分配。 我做了两个 scruct,一个用于单个项目,一个用于表。 第一个有两个指向下一个和上一个项目的指针。 请帮我。 我一直使用此代码直到 3 天。 代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CAPACITY 50000
unsigned long hash(char *str) {
unsigned long int stringsum = 0;
for(; *str != '\0'; str++) {
stringsum += *str;
}
return stringsum % CAPACITY;
}
typedef struct item {
char *value;
char *key;
struct item *next;
struct item *prev;
} ht_item;
typedef struct hashtable {
ht_item **items;
int dim;
int count;
} HashTable;
HashTable* create_table(int size); HashTable* create_item(HashTable *table, char *value, char *key);
void print_table(HashTable* table, int dim);
int main(void) {
HashTable *table = create_table(CAPACITY);
table = create_item(table, "Giuseppe", "Nome");
print_table(table, CAPACITY);
return 0;
}
HashTable* create_item(HashTable *table, char *value, char *key) {
unsigned long index = hash(key);
printf("%u", index);
ht_item *_iterator; ht_item *prev;
for(_iterator = table->items[index], prev = NULL; _iterator != NULL; prev = _iterator, _iterator = _iterator->next);
_iterator = (ht_item*)malloc(sizeof(ht_item));
_iterator->key = (char*)malloc(200);
_iterator->value = (char*)malloc(200);
strcpy(_iterator->key, key);
strcpy(_iterator->value, value);
_iterator->next = NULL;
_iterator->prev = prev;
return table;
}
HashTable* create_table(int size)
{
HashTable *table = (HashTable*)malloc(sizeof(HashTable));
table->dim = size;
table->items = (ht_item**)calloc(size, sizeof(ht_item*));
for(int i = 0; i < size; i++){
table->items[i] = NULL;
}
return table;
}
void print_table(HashTable* table, int dim) {
for(int i = 0; i < CAPACITY; i++)
{
if(table->items[i] != NULL)
{ ht_item *_iterator = (ht_item*)malloc(sizeof(ht_item));
for(_iterator = table->items[i]; _iterator != NULL;
_iterator = _iterator->next)
{
printf("Key: %s\tValue: %s\n", _iterator->key, _iterator->value);
} free(_iterator);
}
}
}
【问题讨论】:
-
嗯.. 看看你的
create_item函数并考虑这一点:你使用该 for 循环来查找冲突链中的最后一个条目,存储指向 said-same_iterator的指针。现在,在那个循环之后你要做的第一件事是什么?你认为_iterator = (ht_item*)malloc(sizeof(ht_item));会对你刚刚努力(而且完全不必要,顺便说一句)找到的_iterator变量值做什么?在调试器中运行您的代码并逐步执行该函数,观察完成后表格的外观。实际表未修改,您的所有努力都被浪费了(并且内存泄漏)。 -
@WhozCraig OP 还在
prev中保留了_iterator的副本。 -
没有分配
->next。 @OP 在处理哈希表之前首先处理链表的正确实现。例如,如果它是一个双向链表,则没有理由遍历链表中的所有节点来找到最后一个节点。它也不必是双向链表,您也可以在头端插入新节点。 -
我使用迭代器来查找最后一个元素。然后我为迭代器指向的块(我要插入的元素)分配内存。
-
我使用 prev 将元素保留在 _iterator 之前,使其指向 ht_item 对象的 prev 指针
标签: c memory linked-list hashtable