我正在尝试通过在链接节点上使用数组来创建哈希表(创建链接列表)。 但是我在将值插入Hash表时遇到了困难。当我运行它时,我明白了:
http://gyazo.com/3a28a70e66b3ea34e08223e5948f49c0.png
这是我的代码:
#include <iostream>
using namespace std;
class Node {
public:
int num;
Node * next;
};
class intHashTable {
private:
int size;
Node ** table;
public:
intHashTable(int size); // construct a new hash table with size elements
~intHashTable(); // delete the memory for all internal components
void insert(int num); // insert num into the hash table, no effect
// if num is already in table
void remove(int num); // remove num from the hash table, no effect if not in table
int lookup(int num); // return 1 if num is already in table, 0 otherwise
void print(void); // print the elements of the hash table to the screen
};
// construct a new hash table with nelements elements
intHashTable::intHashTable(int nelements)
{
size = nelements;
table = new Node*[size];
for ( int i = 0; i < size; i++ ) {
table[i] = NULL;
}
}
intHashTable::~intHashTable()
{
for(int i=0; i<size; i++)
{
Node* temp = table[i];
while(temp != NULL)
{
Node* next = temp->next;
delete temp;
temp = next;
}
}
size = 0;
delete[] table;
}
void intHashTable::insert(int num){
int location = ((unsigned)num) % size;
Node *runner = table[location];
if(runner == NULL ){
runner->num = num;
}else{
while(runner != NULL ){
runner = runner->next;
}
runner->num = num;
}
}
int main(){
intHashTable a (10);
a.insert(2);
return 0;
}
答案 0 :(得分:3)
构建intHashTable
后,table
的所有元素仍然是NULL
。但是,在函数insert
中,一个元素被解除引用:
Node *runner = table[location];
runner = runner->next;
这会导致程序崩溃,因为it is illegal to dereference a null pointer。
答案 1 :(得分:2)
这里的逻辑是错误的
int location = ((unsigned)num) % size;
Node *runner = table[location];
if(runner == NULL ) // if null u dereference it!
{
runner->num = num;
}
else
{
while(runner != NULL ) { // u loop until null
runner = runner->next;
}
runner->num = num; // once u reach null u dereference it!
}
我建议改为:
首先为您的节点ctor
class Node {
public:
int num;
Node * next;
Node( int _n ) : num(_n), next(NULL) { }
};
然后
if ( runner != NULL )
{
while ( runner->next != NULL )
{
runner = runner->next;
}
runner->next = new Node( num );
}
else
{
table[location] = new Node( num );
}
答案 2 :(得分:1)
此代码肯定不起作用:
if(runner == NULL ){
runner->num = num;
如果runner是NULL,那么你永远不应该取消引用它(使用*或 - &gt;)。
答案 3 :(得分:1)
Node *runner = table[location];
runner = runner->next;
if(runner == NULL )
您从未验证table[location]
是否为空。但是在构造哈希表时,节点表中没有节点(你自己将每个条目都设置为null)。
代码的问题在于您从不考虑分配节点。你应该做的
Node* toInsert = new Node;
toInsert->next= NULL;
toInsert->num = num;
if(table[location]==NULL){
table[location] = toInsert;
}
else{
Node *runner = table[location];
while(runner->next != NULL){
runner = runner->next;
}
runner->next = toInsert;
}