Построение хеш-таблицы с переменным размером массива - PullRequest
0 голосов
/ 15 октября 2019

У меня есть следующий код для создания хэш-таблицы со связанными списками. Мой вопрос со следующей строкой:

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; /
};
...