C ++哈希链接函数

时间:2012-05-13 16:37:44

标签: c++ function hashtable chaining

我正在尝试构建一个Hash表,并使用我在线教程学到的知识,我已经提出了以下代码

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;
const int SIZE = 100;

int hash(string);

class Node
{
   public:
      Node();
      Node(string);
      int hash(int value);
   private:
      string data;
      Node* next;

   friend class HashTable;
};

Node::Node() {
  data = "";
  next = NULL;
}

Node::Node(string) {
  data = "";
  next = NULL;
}

int Node::hash(int value) {
   int y;
   y = value % SIZE;
}

class HashTable {
public:
    HashTable();
      HashTable(int);
      ~HashTable();
      void insertItem(string);
      bool retrieveItem(string);

private:
      Node* ht;
};

HashTable::HashTable() {
  ht = new Node[SIZE];
}

HashTable::HashTable(int max) {
  ht = new Node[max];
}

HashTable::~HashTable() {
   delete[] ht;
}

void HashTable::insertItem(string name) {
    int val = hash(name);
    for (int i = 0; i < name.length(); i++)
        val += name[i];
}

bool HashTable::retrieveItem(string name) {
    int val = hash(name);
    if (val == 0 ) {
        cout << val << " Not Found " << endl;
    }
    else {
        cout << val << "\t" << ht->data << endl;
    }
}

void print () {
    //Print Hash Table with all Values
}

int main() {

   HashTable ht;
   ht.insertItem("Allen");
   ht.insertItem("Tom");

   ht.retrieveItem("Allen");

   //data.hash(int val);
   //cout << ht;

   system("pause");
   return 0;
}


int hash(string val) {
    int key;
    key = val % SIZE;
}

我正在尝试插入字符串值并使用retrieveItem函数验证名称是否存在。 另外,如何使用值打印HashTable。

任何帮助都将受到高度赞赏。

Vish

2 个答案:

答案 0 :(得分:1)

这里有点不对劲。只是看了一下代码中间的一个随机位置,我发现:

Node::Node(string) {
  data = "";
  next = NULL;
}

这不会保存传入的字符串的值。我猜你真的想要更像的东西:

Node::Node(string value) : data(value), next(NULL) {}

接下来我看到的是:

int Node::hash(int value) {
   int y;
   y = value % SIZE;
}

这会计算一个值并将其放入y(局部变量)但不返回任何内容,因此您计算的值会立即丢失。如果你试图使用它的返回值,你会得到未定义的行为(实际上,我不记得肯定 - 在C中你似乎只有在尝试使用返回值时才能得到UB,但在C ++中它是UB要做的这一点 - 无论技术细节如何,显然不是你想要的,需要修复的。)

就像我说的那样,我只是瞥了一眼代码中的一个位置然后发现 - 我怀疑它们是唯一的问题。最重要的是你可能需要备份一下,弄清楚每个函数应该做什么,并逐个完成它们并确保每个函数都按照它应该做的。

另外一点建议:我没有处理动态分配数组,而是使用了std::vector

答案 1 :(得分:0)

只需使用stl hashmap 要么 对于线程安全的hashmap使用intel线程构建块库