我想用鏈式碰撞處理來實現一個簡單的哈希表。 main.c中:如何將新數據動態添加到2D數組?
int main()
{
const int size = 20;
const int key = 30;
const int data = 40;
htable ht;
htable_init(&ht, size);
htable_insert(&ht, key, data);
htable_insert(&ht, key+1, 22);
htable_insert(&ht, key+2, 23);
htable_insert(&ht, key+2, 23);
assert(htable_get(&ht, key) == data); // Expected: 40
int d = htable_get(&ht, 415);
assert(htable_delete(&ht, key) == data); // Expected: 40
assert(htable_delete(&ht, key) == 0); // Expected: 0
htable_destroy(&ht);
// It is recommended to do further tests on your own
return 0;
}
htable.h:
struct _ht_entry_ {
int key;
int data;
struct _ht_entry_* next;
struct _ht_entry_* prev;
};
typedef struct _ht_entry_ ht_entry;
struct _htable_ {
ht_entry** entries;
int size;
};
htable.c:
void htable_init(htable* ht, int initial_size)
{
ht->entries = (ht_entry**) calloc(initial_size, sizeof(ht_entry*));
if(ht->entries)
{
ht->size = initial_size;
}
}
void htable_insert(htable* ht, int key, int data)
{
ht_entry* newEntry = malloc(sizeof(ht_entry));
if(!newEntry)
return;
newEntry->data = data;
newEntry->key = key;
newEntry->next = NULL;
newEntry->prev = NULL;
ht_entry** entries = ht->entries;
*entries = newEntry;
newEntry->data = 1;
*(entries + 1) = newEntry;
newEntry->data = 2;
*(entries + 2) = newEntry;
newEntry->data = 3;
*(entries + 3) = newEntry;
newEntry->data = 4;
int i = 0;
for (i = 0; i < 3; i++) {
ht_entry* entry = *(entries + i);
printf("*(entries + %d) : %p\n", i, *(entries + i));
}
}
在上面的例子我嘗試了幾種方法來存儲在HashTable
的新條目,但沒有任何t下襬工作。 我也不明白爲什麼地址是相同的。
輸出:
*(entries + 0) : data: 2 0x60003a410
*(entries + 1) : data: 2 0x60003a410
*(entries + 2) : data: 2 0x60003a410
我也試過entries[0][0] = newEntry;
,因爲我認爲ht_entry** entries;
是2D Array
但也不能工作。
所以,我怎麼能填補我HashTable
?
您可以加入主呢? –
我現在加入main.c – TheDoctor
細節:「ht_entry **條目;是一個二維數組」 - >「條目」不是二維數組,而是指向「ht_entry」指針的指針。它使用類似'ht_entry [x] [y]'的語法,如2D數組。 'ht_entry entries [4] [5]'將是2D數組的一個例子。 – chux