У меня есть следующий код для создания хэш-таблицы со связанными списками. Мой вопрос со следующей строкой:
static const int tableSize = 10;
Я хотел бы иметь возможность изменить его, чтобы я мог установить размер во время выполнения или пользовательского ввода. Я попытался изменить код, чтобы использовать векторы вместо массивов, но это оказалось сложным.
Помогает ли, пожалуйста?
#include <string>
#include <stdio.h>
#include <iostream>
using namespace std;
class hashO{
private:
static const int tableSize = 10;
hasht* HashTable[tableSize]; //hash table contains pointers
// vector<hasht*> HashTable;
public:
hashO()
{
for(int i=0 ; i< tableSize ; i++)
{
HashTable[i] = hasht;
HashTable[i]-> name = NULL;
HashTable[i]-> age = NULL;
HashTable[i]->next = NULL;
}
}
int Hash(int key){
int hash = 0;
int index;
//for(int i =0; i< key.length(); i++){
//hash = hash + key[i];
hash = hash + key;
//}
index = hash % tableSize;
return index;
}
void AddItem(string name, int age){
int index = Hash(age);
if(HashTable[index]->name == NULL){ //slot is empty
HashTable[index]->name = name;
HashTable[index]->age = age;
}
else //slot is taken
{
hasht* ptr = HashTable[index];
hasht* n = new hasht;
n->name = name;
n->age= age;
n->next = NULL;
while(ptr->next !=NULL )
{
ptr = ptr->next;
}
ptr->next = n;
}
}
int NumberOfItemsInIndex(int index){
int count = 0;
if(HashTable[index]->name == NULL){
return count;
}
else
{
count++;
hasht* ptr = HashTable[index];
while(ptr->next != NULL){
count++;
ptr = ptr->next;
}
}
return count;
}
void PrintTable(){
int number;
for( int i = 0; i< tableSize; i++){
number = NumberOfItemsInIndex(i);
cout << "----------------------" << endl;
cout << "index = " << i << endl;
cout << "name: "<< HashTable[i]->name << endl;
cout << "age: " << HashTable[i]->age << endl;
cout << "# of items = " << number << endl;
cout << "----------------------" << endl;
// if (number > 1){
// PrintItemsInIndex(i);
// }
}
}
void PrintItemsInIndex(int index){
hasht* ptr = HashTable[index];
if(ptr->name == NULL){
cout << "index = " << index << " is empty" << endl;
}
else
{
cout << "index " << index << " contains the following items" << endl;
while(ptr != NULL){
cout << "--------------------" << endl;
cout << ptr->name << endl;
cout << ptr->age << endl;
cout << "--------------------" << endl;
ptr = ptr->next;
}
}
}
};
int main(){
hashO Hashy;
Hashy.AddItem(9981922, 1 , 1950);
Hashy.AddItem(10049525, 2, 1950);
Hashy.AddItem(10120403, 3, 1950);
Hashy.AddItem(123213, 3, 1951);
Hashy.PrintTable();
Hashy.PrintItemsInIndex(3);
return 0;
}
.
struct hasht{
string name;
int age;
struct hasht *next; /
};