0

我无法在 C 中实现一个简单的列表,问题是通过指针连接项目。
以下代码是哈希表的片段,它应该将具有相同索引的项目存储在列表中以避免冲突。

typedef struct dictEntry {
    void *key;
    void *value;
    struct dictEntry *next;
} dictEntry;

typedef struct dict {
    dictEntry **table;
    unsigned long size;
    unsigned long used;
} dict;

void dictAdd(dict *d, void *key, void *value) {
    int index = hash(key) & d->size;
    dictEntry *entry;

    entry = malloc(sizeof(entry));

    entry->key   = key;
    entry->value = value;
    entry->next  = 0;

    if (d->table[index]) {
        /* this is does not work */
        dictEntry *next;
        next = d->table[index];

        while (next) {
            next = next->next;
        }

        next = entry;
    } else {
        d->table[index] = entry;
        d->used++;
    }
}

我的想法是遍历列表中的每个元素 ( next->next) 并将指针分配给entry最后一个元素 ( next = entry;)。
经过几天的重写和移动部分代码,我似乎仍然找不到解决方案。

4

3 回答 3

5

您应该首先尝试实现链表。

这是我将如何实现添加到末尾的方法(我已经修改了您的代码,您只需覆盖临时的“下一个”变量而不修改列表本身):

if (d->table[index]) {
    /* this should work*/
    dictEntry *next;
    dictEntry *prev = NULL;
    next = d->table[index];

    while (next) {
        prev = next;
        next = next->next;
    }

    // yes, add new entry as the "next" pointer to the "last" item
    prev->next = entry;
} else {

……

于 2012-05-20T21:51:04.547 回答
1
entry = malloc(sizeof(entry));

应该:

entry = malloc(sizeof *entry);

dictAdd 也过于复杂。在这种情况下,使用指针对指针会有所帮助:

void dictAdd(dict *d, void *key, void *value) {
    unsigned index;
    dictEntry **pp;

    index = hash(key) % d->size;
    if (!d->table[index]) d->used++;

    for (pp = &d->table[index]; *pp; pp = &(*pp)->next) {;}

    *pp = malloc(sizeof **pp);
     /* Omitted : handle ((*pp) == NULL) malloc failure here */
    (*pp)->key   = key;
    (*pp)->value = value;
    (*pp)->next  = NULL;
}  
于 2012-05-20T22:16:55.080 回答
0

看看你的while循环。你会一直next走到零,但你真的想要下一个指针为零的最后一个条目。修复它,它应该更接近。

于 2012-05-20T21:51:18.640 回答