Стоит задача:
Создать хеш-таблицу со случайными ключами и удалить из нее
записи с ключами из диапазона min<key<max
.
Функция удаление по ключам. Получается он перебирает по индексу. И допустим в индексе есть ключи которые подходят под условия, он должен удалять их.
//функция удаление
Node *delet(int data, int min, int max)
{
Node *p;
p = hashTable[myhash(data)];
while (p && !compEQ(p->data, data)) {
p = p->next;
if ((min < p->data) && (p->data < max))
delete(p);
}
return p;
}
Ошибка
"Hesh.exe" (Win32). Загружено "C:\Users\Ewrei\Documents\Visual Studio 2015\Projects\Hesh\Debug\Hesh.exe". Символы загружены.
"Hesh.exe" (Win32). Загружено "C:\Windows\SysWOW64\ntdll.dll". Невозможно найти или открыть PDB-файл.
"Hesh.exe" (Win32). Загружено "C:\Windows\SysWOW64\kernel32.dll". Невозможно найти или открыть PDB-файл.
"Hesh.exe" (Win32). Выгружено "C:\Windows\SysWOW64\kernel32.dll"
"Hesh.exe" (Win32). Загружено "C:\Windows\SysWOW64\kernel32.dll". Невозможно найти или открыть PDB-файл.
"Hesh.exe" (Win32). Загружено "C:\Windows\SysWOW64\KernelBase.dll". Невозможно найти или открыть PDB-файл.
"Hesh.exe" (Win32). Загружено "C:\Windows\SysWOW64\vcruntime140d.dll". Невозможно найти или открыть PDB-файл.
"Hesh.exe" (Win32). Загружено "C:\Windows\SysWOW64\msvcp140d.dll". Невозможно найти или открыть PDB-файл.
"Hesh.exe" (Win32). Загружено "C:\Windows\SysWOW64\ucrtbased.dll". Невозможно найти или открыть PDB-файл.
Вызвано исключение по адресу 0x00142556 в Hesh.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xDDDDDDE1.
Вызвано необработанное исключение: нарушение доступа для чтения.
Остальной код
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstdio>
using namespace std;
#define compEQ(a,b) (a == b)
struct Node {
int info; //данные, хранящиеся в вершине
int data;// ключ
Node *next; // следующая вершина
};
Node **hashTable;
int hashTableSize;
int myhash(int data);
Node *insertNode(int data, int info); //вставка
void deleteNode(int data); //удаление
Node *findNode(int data); //поиск
Node *delet(int data, int min, int max);
int main()
{
int i, *a, maxnum;
cout << "Enter number of elements: ";
cin >> maxnum;
cout << "Enter HashTable Size : ";
cin >> hashTableSize;
a = new int[maxnum];
hashTable = new Node*[hashTableSize];
for (i = 0; i < hashTableSize; i++)
hashTable[i] = NULL;
// генерация массива
for (i = 0; i < maxnum; i++)
a[i] = 1 + rand() % 100;
// заполнение хеш-таблицы элементами массива
for (i = 0; i < maxnum; i++) {
insertNode(a[i], rand());
}
// поиск элементов массива по хеш-таблице
for (i = maxnum - 1; i >= 0; i--) {
findNode(a[i]);
}
for (i = maxnum - 1; i >= 0; i--) {
// delet(a[i], 5, 20);
}
cout << "RESULT: " << endl;
// поиск элементов массива по хеш-таблице
for (i = maxnum - 1; i >= 0; i--) {
findNode(a[i]);
}
cout << endl;
// очистка хеш-таблицы
for (i = maxnum - 1; i >= 0; i--) {
deleteNode(a[i]);
}
system("pause");
return 0;
}
// хеш-функция размещения вершины
int myhash(int data) {
return (data % hashTableSize);
}
// функция поиска местоположения и вставки вершины в таблицу
Node *insertNode(int data, int info) {
Node*p, *p0;
int bucket;
// вставка вершины в начало списка
bucket = myhash(data);
if ((p = new Node) == 0) {
fprintf(stderr, "Нехватка памяти (insertNode)\n");
exit(1);
}
p0 = hashTable[bucket];
hashTable[bucket] = p;
p->next = p0;
p->data = data;
p->info = info;
return p;
}
//функция удаления вершины из таблицы
void deleteNode(int data) {
Node *p0, *p;
int bucket;
p0 = 0;
bucket = myhash(data);
p = hashTable[bucket];
while (p && !compEQ(p->data, data)) {
p0 = p;
p = p->next;
}
if (!p) return;
if (p0)
p0->next = p->next;
else
hashTable[bucket] = p->next;
free(p);
}
// функция поиска вершины со значением data
Node *findNode(int data) {
Node *p;
p = hashTable[myhash(data)];
while (p && !compEQ(p->data, data)) {
p = p->next;
}
cout <<"Index " << myhash(data) << "\tkey: " << p->data << "\tinfo: " << p->info << endl;
return p;
}
//функция удаление
Node *delet(int data, int min, int max)
{
Node *p;
p = hashTable[myhash(data)];
while (p && !compEQ(p->data, data)) {
p = p->next;
if ((min < p->data) && (p->data < max))
delete(p);
}
return p;
}
Функция удаления при определенных условиях делает delete(p)
, но при этом на следующей итерации все равно пытается делать compEQ(p->data, data)
и p = p->next
. Это, разумеется, никак не может работать, ибо после delete(p)
осуществлять доступ через указатель p
запрещается и значения p->data
и p->next
не определены.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть ли возможность контроллировать статус выполнения операций вывода в С++ без try - catch блоков?
С чего следует начать подготовку у ACM? И какие ресурсы вы рекомендуете?