Добавление в массиве, используя список 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;
}```