The task is to create a hash table with random keys and remove from it entries with keys from the range min<key<max .

Function delete by keys. It turns out he goes through the index. And let's say in the index there are keys that fit the conditions, it should delete them.

  //функция ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ 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; } 

Mistake

  "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. Π’Ρ‹Π·Π²Π°Π½ΠΎ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ доступа для чтСния. 

The rest of the code

 #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; } 
  • I did not read it entirely, but if you allocate memory with new , you must delete it with delete , not free . Don't mix memory allocation in C style and in C++ style - retorta
  • Also C++ not any python . It’s not like this: min < p->data < max - retorta
  • it changed everything, yes it is true - Vitaly Robinovsky

1 answer 1

The delete function, under certain conditions, makes delete(p) , but at the next iteration it still tries to do compEQ(p->data, data) and p = p->next . This, of course, cannot work at all, because after delete(p) is forbidden to access through the pointer p and the values ​​of p->data and p->next not defined.

  • You are right, I will try to remake - Vitaly Robinovsky