Удаление по ключам (хеширование)

346
10 июня 2017, 15:35

Стоит задача: Создать хеш-таблицу со случайными ключами и удалить из нее записи с ключами из диапазона 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;
}
Answer 1

Функция удаления при определенных условиях делает delete(p), но при этом на следующей итерации все равно пытается делать compEQ(p->data, data) и p = p->next. Это, разумеется, никак не может работать, ибо после delete(p) осуществлять доступ через указатель p запрещается и значения p->data и p->next не определены.

READ ALSO
Узнать статус I/O операции С++

Узнать статус I/O операции С++

Есть ли возможность контроллировать статус выполнения операций вывода в С++ без try - catch блоков?

268
LATEX не хочет отображать брать даннные из буфера

LATEX не хочет отображать брать даннные из буфера

Работаю с такой программой latex2rtf-23

232
Метод половинного деления

Метод половинного деления

Помогите мне! У меня не вычисляет корень вообще

296
Preparing to Olympiads [требует правки]

Preparing to Olympiads [требует правки]

С чего следует начать подготовку у ACM? И какие ресурсы вы рекомендуете?

207