#include <iostream>
#include <cstring>
#include <vector>
#include "list.cpp"
#include <cmath>
using namespace std;
struct HashEntry{
int key;
List<string> list;
HashEntry(int k)
{
key=k;
}
};
class Hash{
private:
HashEntry *Table[100];
int a;
public:
Hash(int A);
void insert(string word);
void Lookup(string word);
};
Hash::Hash(int A)
{
a=A;
}
void Hash::insert(string word)
{
int c=0;
for (int i=0;i<word.size();i++)
{
int b=(int)((a^i)*(word[i]));
c+=b;
}
c%=100;
List<string> list;
if (Table[c-1]==NULL) //if the respective bucket doesnot have any string
Table[c-1]=new HashEntry(c-1);
Table[c-1]->list.insertAtTail(word);
}
void Hash::Lookup(string word)
{
int c=0;
for (int i=0;i<word.size();i++)
{
int b=(int)((a^i)*(word[i]));
c+=b;
}
cout<<"one"<<endl;
c%=100;
Table[c-1]->list.searchFor(word);
cout<<"two"<<endl;
}
我正在使用单独的链接制作哈希表。我的哈希函数正在使用常量'a'制作一个多项式方程,其幂随着单词中字母的索引而增加。(a ^ 0xb + a ^ 1xb + a ^ 2xb + ...),其中b是正在被散列的单词中的一个字母然后我接受最终答案的mod(100)。我面临的问题是查找函数。当我测试查找函数时,searchFor()函数属于部分链接列表类的一部分不起作用,虽然它自己工作正常,并且我在cout&lt;&lt;“一个”之后得到了一个分段错误,我曾经调试过。我很抱歉困扰但我无法理解这里的问题。链表类文件如下。我只是粘贴我遇到问题的功能
#ifndef __LIST_H
#define __LIST_H
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
/* This class just holds a single data item. */
template <class T>
struct ListItem
{
vector<string> words;
T value;
ListItem<T> *next;
ListItem<T> *prev;
ListItem(T theVal)
{
this->value = theVal;
this->next = NULL;
this->prev = NULL;
}
};
/* This is the generic List class */
template <class T>
class List
{
ListItem<T> *head;
public:
// Constructor
List();
// Copy Constructor
List(const List<T>& otherList);
// Destructor
~List();
// Insertion Functions
void insertAtHead(T item);
void insertAtTail(T item);
void insertAfter(T toInsert, T afterWhat);
void insertSorted(T item);
void printList();
// Lookup Functions
ListItem<T> *getHead();
ListItem<T> *getTail();
void *searchFor(T item);
// Deletion Functions
void deleteElement(T item);
void deleteHead();
void deleteTail();
// Utility Functions
int length();
};
#endif
template <class T>
void List<T>::searchFor(T item)
{
ListItem<T> *temp=head;
if (temp!=NULL)
{
while (temp->next!=NULL)
{
T sample=temp->value;
if (sample==item)
{
cout<<"String found";
return;
}
temp=temp->next;
}
T s=temp->value;
if (s==item)
{
cout<<"String found";
return;
}
}
}
答案 0 :(得分:0)
除了上面的评论,这导致你找到了一个你有的错误,我会补充一下:
您崩溃的原因是您的Hash
类对哈希表管理不善。首先,您分配一个包含100个HashEntry
指针的数组:
HashEntry *Table[100];
请注意,您从未将这些指针设置为任何内容 - 因此他们指向谁知道什么。也许纯粹的运气,他们会指向NULL,但这种可能性微乎其微 - 你更有可能赢得彩票。所以,你正在访问一些随机内存 - 那就是糟糕。
解决方案是使用构造函数中的循环显式地将每个条目设置为NULL
。您还需要一个析构函数来释放任何已分配的条目,这样您就可以delete
它而不会泄漏内存,因为泄漏是坏的。
但一个有趣的问题是为什么它会这样呢?为什么不简单地声明这样的桶:
HashEntry Table[100];
这样你的所有存储桶都被分配为Hash
对象的一部分,你不必担心动态分配和释放存储桶,检查NULL
等的指针。
这样做的一个问题是您的HashEntry
构造函数需要int
参数。目前还不清楚为什么这个论点是必要的;我不认为你需要它,你可以删除它。
这个一次更改会大大简化您的代码并消除三个错误和崩溃。