LINUX.ORG.RU

Использовать готовый код

 


1

2

Доброго времени суток.
Есть готова реализация Хеш-таблицы с поиком, добавлением и удалением элементов.
Вопрос в том, как воспользоваться функцией поиска и отразить результат поиска ?
Я пробовал делать что-то вроде

int Key = 50;
Node *dataItem;
dataItem = findNode(Key);
    if (dataItem != NULL)
     cout<< "Found";
     else
       cout<< "No found";
но оно не находит значение (

Поиск выполняется по значению - есть в таблице, выводим.
Сам код:

#include <iostream.h>
#include <fstream>
#define compEQ(a,b) (a == b)

 typedef int T;
 typedef int hashTableIndex;
 typedef struct Node_
{
 T data;
 struct Node_ *next;
} Node;

 Node **hashTable;
 int hashTableSize;
 hashTableIndex myhash(T data);
 Node *insertNode(T data);
 void deleteNode(T data);
 Node *findNode (T data);


 hashTableIndex myhash(T data)
 {
   return (data % hashTableSize);
  }


 Node *insertNode(T data)
{

Node *p, *p0; hashTableIndex bucket;
bucket = myhash(data);

if ((p = new Node) == 0)
  {
 cout<<"no mem"<<endl;
 exit(1);
  }

 p0 = hashTable[bucket];
 hashTable[bucket] = p;

 p->next = p0;
 p->data = data;

 return p;
}



void deleteNode(T data)
 {
 Node *p0, *p;
 hashTableIndex 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);

}


Node *findNode (T data)

{
Node *p;
p = hashTable[myhash(data)];
while (p && !compEQ(p->data, data))
p = p->next;
return p;
}


int main()
 {
int i, *a, maxnum;

cout <<" maxnum : ";

cin >> maxnum;

cout <<"HashTableSize: ";

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] = rand() % 100;


for (i = 0; i < maxnum; i++)
insertNode(a[i]);


for (i = maxnum-1; i >= 0; i--)
 findNode(a[i]);


ofstream out("List.txt");

for (i = 0; i < maxnum; i++)

{

  cout << endl <<a[i] << endl;
  out << a[i];

 if ( i < maxnum - 1 )
  {
 out << "\t";
 cout << "\t";
 }

 }

out.close(); 



out.open("HashTable.txt"); 

for (i = 0; i < hashTableSize; i++) 

{ 

out << i << " : ";

Node *Temp = hashTable[i];

while ( Temp ) 
 { 

out << Temp->data << " -> ";
cout << Temp->data << " -> ";
Temp = Temp->next;
} 

out << endl; 
}

out.close();

 for (i = maxnum-1; i >= 0; i--)
 deleteNode(a[i]);
 return 0;
}
В самомо куске

for (i = maxnum-1; i >= 0; i--)
findNode(a[i]);

Как мне отобразить, если я нашёл что-то ?
Сравнивать буду например с числом, вводимым с клавиатуры.
Заранее спасибо за дельные мысли.



Последнее исправление: jeston (всего исправлений: 3)

Ответ на: комментарий от jeston

Здесь нет только c++ вещей вроде классов и т.д. Здесь просто используется потоковый ввод ввод/вывод и всё.

jeston
() автор топика

c++, pure c, си

Ты зачем людей обманываешь? Зачем теги [pure c] и [си] воткнул? Судя по шапке, у тебя С++, а судя по портянке и начальному тексту, читать дальше смысла нет!

Anon
()
Ответ на: комментарий от Waterlaz

С чего ты взял ?
Я пробовал делать что-то вроде

int Key = 50;
Node *dataItem;
dataItem = findNode(Key);
    if (dataItem != NULL)
     cout<< "Found";
     else
       cout<< "No found";
но оно не находит значение (

jeston
() автор топика
Ответ на: комментарий от jeston

fixed

ты бы еще по-человечески сделал форматирование кода! Жуткая портянка же!

А функция findNode на первый взгляд должна возвращать NULL, если ничего не найдено, либо элемент. Всю портянку читать сил нет!

Anon
()
Ответ на: комментарий от Anon

ищу 30
в исходном массиве 30 есть. сделал

if (findNode(30) != NULL)
     ShowMessage("Found");
     else
      ShowMessage( "No found");
но оно не находит (

jeston
() автор топика

Пришёл по pure c и си. Ушёл.

d ★★★★
()

Затроллили человека, рукалицо. Зачем здесь тег с++? :) Это какая-то жуткая смесь кусочков стандартной библиотеки C++ с хардкорным Си. Автор, «готовая реализация хэш-таблицы» в C++ - std::unordered_map тчк.

asaw ★★★★★
()

<iostream.h>
new Node /* ... */ free(p)
free() [при отсутствующем #include <cstdlib>]
typedef struct Node_
typedef int T;
Node **hashTable;
#define compEQ(a,b) (a == b)
cout [без using namespace std]

Лучше бы в вашей шараге продолжили использовать Турбо Паскаль, ей-богу...

ilammy ★★★
()
Ответ на: комментарий от jeston

в исходном массиве 30 есть
a = rand() % 100;

Проверял? Точно есть? И дампилка хеша показывает, что есть?

А то как бы...

ilammy ★★★
()
Ответ на: комментарий от asaw

хардкорным бездарным Си

Починил. Хардкордным он был бы, если бы это была обобщённая хеш-таблица, генерируемая макросами.

ilammy ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.