如何将新数据动态添加到二维数组?

Posted

技术标签:

【中文标题】如何将新数据动态添加到二维数组?【英文标题】:How to dynamically add new data to a 2D Array? 【发布时间】:2017-08-04 01:36:14 【问题描述】:

我想使用链式冲突处理实现一个简单的哈希表。 ma​​in.c:

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 中的方法,但都没有奏效。 我也不明白为什么地址是一样的。

输出:

*(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 吗? 我现在添加了 main.c Detail: "ht_entry** entries; is a 2D Array" --> entries 不是 2D 数组,而是指向 ht_entry 的指针的指针。它使用像ht_entry[x][y] 这样的语法,就像一个二维数组。 ht_entry entries[4][5] 是二维数组的示例。 代码和输出似乎不匹配。 是的,我忘了调整它 【参考方案1】:

我们来看看htable_insert。首先,您在堆上创建一个新条目并保留一个指向它的指针(命名为newEntry)。然后你设置你的key 和你的data

到目前为止一切顺利。

现在您取消引用 entries 并将其值设置为 newEntry。因为entries 是一个指向指针的数组(2D 只是一个花哨的名字),取消引用它会给你一个指向ht_entry 的指针。这意味着您不会将 struct newEntry 指向的指针复制到数组中,而只是保存它的指针。然后您继续执行此操作 3 次,每次都在下一个更大的索引处。最后,条目被 4 个指向同一个结构的指针填充。因此,当您打印它的地址时,您总是得到相同的地址。

【讨论】:

非常感谢您解释了一切。

以上是关于如何将新数据动态添加到二维数组?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中Vector怎样存放一个动态的二维数组

如何从 Firebase 推送/获取数据并使用 Java 添加到二维数组?

如何在python中将二维数组添加到数据库中

利用c++中的vector创建动态二维数组

js如何定义二维数组,一维的key为动态值。就是要处理二级菜单显示。

将二维数组复制到函数外部动态分配的二维数组