【问题标题】:Insert method with concatenation in a HashTable in C在 C 中的 HashTable 中插入具有串联的方法
【发布时间】:2018-07-21 16:02:48
【问题描述】:

我在用 C 语言实现哈希表的插入方法时遇到问题。以下代码行简要概述了我的程序的结构:

struct someStruct{
    struct someStruct *next;
};

typedef struct someStruct Ele;

typedef struct someStruct *EleP;

typedef EleP HTEntry;

struct symbolTable {
    HTEntry hashTable[CON];
};

在我的程序中,hashTable 包含在其他两个我认为对于此描述并不重要的数据结构中,唯一重要的是要访问 hashTable 我需要执行以下操作:

Var->anotherVar->hashTable

鉴于上述定义,我的问题是,当我尝试将元素插入 hashTable 时,似乎我没有使用指针,并且修改在内存中没有任何形式的反映。如果我执行以下操作,它会起作用:

EleP toAdd = [...]
Var->anotherVar->hashTable[key] = toAdd;

这很好,但是,如果我想将任何新元素与旧元素连接起来,我无法反映内存中的变化,看来我是在复制值而不是引用。代码如下:

HTEntry w = Var->anotherVar->hashTable[key];
while(w != NULL){
    w = w->next;
}
w = toAdd;

如果我尝试在执行插入的函数中打印 w 的值,我会得到正确的元素,但是当函数返回时,该值不在表中。我试图找出丢失的指针在哪里,但我真的不知道。

编辑: Eyal 提出的解决方案实际上允许向 hastTable 添加元素,但是,元素被添加到 key+5 而不是 key。有什么建议吗?

【问题讨论】:

    标签: c pointers hashtable


    【解决方案1】:

    你的逻辑不正确。您正在将 w(现在为 NULL)设置为 toAdd。您应该设置前一个元素的 w->next = toAdd

    试试

    HTEntry w = Var->anotherVar->hashTable[key];
    while(w != NULL && w->next != NULL){
        w = w->next;
    }
    if (w != NULL) w->next = toAdd;
    

    【讨论】:

    • 它有效,但似乎是在之后添加元素 5 单元格:我的意思是,如果键是 2,则元素被添加到 key=7
    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 2018-10-29
    • 2021-02-25
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多