Добавление в массиве, используя список list(Точнее метод цепочек в хэш-таблице)

У меня хеш-таблица, вроде бы все работало хорошо. Но разрешение коллизий у меня должно быть методом цепочек. Поэтому решил использовать связные списки, подключив STL list. Но вот загвоздка, я не могу реализовать как бы это сказать, массив списков. У меня скорее получается список массивов, и когда использую добавление на i-тый элемент массива программа должна добавлять новые данные на этот же индекс, только добавив новый список. У меня сейчас получается список массивов размерностью 5, который каждый раз изменяется с добавлением новых элементов, а не сохраняет предыдущие. Вот собственно код (прошу посмотреть класс HashTable, addKey и InisHashTable):

#include<conio.h>
#include<math.h>
#include<string>
#include<string.h>
#include <Windows.h>
#include <fstream> 
#include <time.h>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cstring>
#include <list>
#include <iterator>
using namespace std;
#pragma warning(disable : 4996)

int const AllCount = 10;

class Hash
{
public: 
    //list <Hash> chain;
    int number;
    string name;
    int condition;

    Hash()
    {
        this->number = -1;
        this->name = " ";
        this->condition = 0;
    }
    Hash(int number, string name, int condition)
    {
        this->number = number;
        this->name = name;
        this->condition = condition;
    }

    ~Hash() {};
};

int nod(int a, int b) {
    if (a % b == 0)
        return b;
    if (b % a == 0)
        return a;
    if (a > b)
        return nod(a % b, b);
    return nod(a, b % a);
}


int HashFunctionNum(int somebody, int size)
{
    int x, z, rez, pr = somebody;
    string str, pstr, sb;
    sb = to_string(somebody);
    pstr = to_string(pr);
    rez = 0;
    while (sb.length() != 0)
    {
        pstr = sb;
        for (int j = 0; j < pstr.length(); j++)
        {
            pr = stoi(pstr);
            z = pr % 100;
            str = to_string(z);
            pstr = to_string(pr);
            if (pstr.length() > 2)
            {
                pstr.erase(pstr.length() - 2);
            }
            pr = stoi(pstr);
        }
        rez = rez + pr;
        /*if (sb.length() == 2)
        {*/
        sb.erase(0, 2);
        //}
    }
    //cout << sb << endl;
    //cout << pstr;
    int mod = size;
    //cout << rez << endl;
    x = rez % mod;
    return x;
}

struct Mass
{
    Hash g[100];
};

class HashTable
{
public:
    Mass m;
    list <Mass> chain1;
    //Hash HashArr[100];
    int size;

    void GetSize(int t) {
        if (t > 0)
            this->size = t;
        else cout << endl << "Неправильные данные!";
    }

    void InisHashTable(list <Mass> chain) {
        if (size > 0)
        {
            for (int i = 0; i < size; i++) {
                m.g[i].number = -1;
                m.g[i].name = " - ";
                m.g[i].condition = 0;
            }
            chain.push_back(m);
        }
    }

    void addKey(int num, string name, list<Mass>& chain, Mass m) {
        int kolvo = 0;
        for (int i = 0; i < size; i++) {
            if (m.g[i].condition == 1) {
                kolvo++;
            }
        }
        if (kolvo == size) { cout << endl << "Места нет!"; }
        else
        {
            int t = HashFunctionNum(num, size);
            bool q = false;

            for (int j = 0; j <= size; j++)
            {
                if ((m.g[t].number == num) && (m.g[t].condition == 1)) {
                    Kollision(num, name, chain, t);
                    q = true;

                }

            }

            if (q == true) {
                cout << endl << "Ключ не уникален";
            }
            else {
                for (int j = 0; j <= size; j++) {
                    bool q = false;
                    //t = KollisionNum(num, size, j);
                    if ((m.g[t].condition == 0) || (m.g[t].condition == 2)) {
                        m.g[t].condition = 1;
                        m.g[t].name = name;
                        m.g[t].number = num;
                        chain.push_back(m);
                        j = size;
                    }
                }
            }
        }
    }
    void PrintHashTable() {
        for (int i = 0; i < size; i++) {
            cout << endl;
            cout << m.g[i].number << " " << m.g[i].name << " " << m.g[i].condition;
        }
        cout << endl << endl;
    }

    void Kollision(int somebody, string name, list<Mass> &chain, int t)
    {
        m.g[t].number = somebody;
        m.g[t].name = name;
        m.g[t].condition = 1;
        chain.push_back(m);
    }
};

int main()
{
    setlocale(LC_ALL, "Russian");
    list<Mass> chain;
    Mass m1;
    int razmer = 5;
    int k = 0;
    HashTable first;
    first.GetSize(razmer);
    first.InisHashTable(chain);
    first.addKey(203818, "Бычков Максим Георгиевич", chain, m1);
    first.addKey(15408072, "Терехов Иван Владимирович", chain, m1);
    first.addKey(120424, "Захарова Алёна Тимуровна", chain, m1);
    first.PrintHashTable();
    //first.addKey(120424, "Федерер", chain, m1);
    std::list<Mass>::iterator it = chain.begin();
        for (; it != chain.end(); ++it)
        {
            for (int i = 0; i < razmer; i++) 
            {
                std::cout << (*it).g[i].number << ' ' << (*it).g[i].name << ' ' << (*it).g[i].condition << endl;
            }

            std::cout << endl;
        }
    system("pause");
    return 0;


}```

Ответы (0 шт):