跟进哈希表c ++,this-> next = NULL指针

时间:2017-03-06 02:25:16

标签: c++ pointers this hashtable

这是对我提出的另一个问题的跟进,也是关于问题的 下面的HashNode构造函数中的 this-&gt; next = NULL 指针。 我的问题是,我不明白为什么 htable [hash_val] - &gt; next 不等于NULL而是实际上有一个内存地址,即使 this-&gt; next = NULL < / strong>,如构造函数中所写。

有人可以告诉我为什么 htable [hash_val] - &gt; next 不等于NULL并且有一个与之关联的地址。看了一会后似乎找不到它。我可以看到 htable [hash_val] 会有一个值,但我认为 htable [hash_val] - &gt; next 将为NULL。谢谢 。

#include<iostream>
using namespace std;
const int TABLE_SIZE = 128;

class HashNode
{
    public:
    int key;
    int value;
    HashNode* next;
    HashNode(int key, int value)
    {
        this->key = key;
        this->value = value;
        this->next = NULL; // shouldn't htable[hash_val]->next = NULL 
    }
};


class HashMap
{
    private:
    HashNode** htable;

    public:
    HashMap()
    {
        htable = new HashNode*[TABLE_SIZE];
        for (int i = 0; i < TABLE_SIZE; i++)
            htable[i] = NULL;
    }


    int HashFunc(int key)
    {
        return key % TABLE_SIZE;
    }

    /*
     * Insert Element at a key
     */
    void Insert(int key, int value)
    {
        int hash_val = HashFunc(key);
        HashNode* prev = NULL;
        HashNode* entry = htable[hash_val];

        while (entry != NULL)
        {
            prev = entry;
            entry = entry->next;
         }
        if (entry == NULL)
        {
            entry = new HashNode(key, value);

            if (prev == NULL)
        {
                htable[hash_val] = entry;
            }
        else
        {
                prev->next = entry;

            }
        }

    }
    void testnull(int key){
        int hash_val = HashFunc(key);
        cout<<htable[hash_val]->next;  // outputs an address , not NULL
    }
   int Search(int key)
       {
        bool flag = false;
        int hash_val = HashFunc(key);
        HashNode* entry = htable[hash_val];
        while (entry != NULL)
        {
            if (entry->key == key)
        {
                cout<<entry->value<<" ";
                flag = true;
            }
            entry = entry->next;
        }
        if (!flag)
            return -1;
        }
  };


int main() {

HashMap hash; 

hash.Insert(3,7);
hash.Insert(3,8);
hash.testnull(3);


// your code goes here
return 0;
}

2 个答案:

答案 0 :(得分:0)

当然htable[hash_val]->next不是NULL。您正在使用链接列表冲突解决。

1)最初:

[0] -> NULL
 |
...
 |
[3] -> NULL
 |
...

2)在密钥3处插入7。

[0] -> NULL
 |
...
 |
[3] -> 7 -> NULL
 |
...

3)您在键3处插入8(与相同的键为7)。

[0] -> NULL
 |
...
 |
[3] -> 7 -> 8 -> NULL
 |
...

7下一个是8是很正常的,因为它们的密钥都是3.因此,你的代码正在做它应该做的事情。

PS :如果您在开始做家庭作业之前理解,或者至少已经在您旁边上课,那么它会节省您(和我们)的时间({ {1}}让你离开)。在Stack Overflow上,只有在您发现自己真正试图找到问题答案后,才应该问一个问题。毕竟SO是为了帮助专业人士,学生和其他人解决日常生活中的问题,不要让别人为你做好功课! :)

答案 1 :(得分:0)

您已插入两个具有相同键的元素。 你的班级没有等于&#39;比较所以每次添加新元素时,它都被放入相同的口袋(相同的哈希码)但作为下一个记录(考虑键不相等)。这就是你有两条记录的原因。并且第一个的下一个记录不为空。如果你添加具有相同键的新记录,我最会重新使用哈希地图实现。它应该替换之前的记录。

我改变了这样的代码:

        while (entry != NULL)
        {
            if(entry->key == key)
            {
                entry->value = value;
                return; 
            }
            prev = entry;
            entry = entry->next;
         }