2

我想用鏈式碰撞處理來實現一個簡單的哈希表。 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

+0

您可以加入主呢? –

+0

我現在加入main.c – TheDoctor

+2

細節:「ht_entry **條目;是一個二維數組」 - >「條目」不是二維數組,而是指向「ht_entry」指針的指針。它使用類似'ht_entry [x] [y]'的語法,如2D數組。 'ht_entry entries [4] [5]'將是2D數組的一個例子。 – chux

回答

1

讓我們來看看htable_insert。首先在堆上創建一個新條目並保留一個指針(名稱爲newEntry)。然後你設置你的key和你的data

到目前爲止這麼好。

現在取消引用entries並設置它的價值newEntry。由於entries是指針的指針數組(2D僅僅是一個奇特的名字爲這個),取消引用它給你一個指針ht_entry。這也就意味着,你不newEntry點複製到結構到數組,但你保存它的指針。然後你繼續做3次,每次在下一個更大的指數。最後,條目中充滿了4個指向同一個結構體的指針。因此,當您打印它的地址時,您始終使用相同的地址。

+0

非常感謝你解釋一切。 – TheDoctor