![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 29.11.2010
Сообщений: 1
|
![]()
Задание: реализовать динамическую хеш-таблицу с открытой адресацией для хранения строк (операции вставки и поиска). Таблица должна увеличивать свой размер вдвое при достижении 50% заполнения.
Проблема заключается в том, что возникает отрицательная длина строки, не могу понять как исправить код, чтобы программа заработала. Помогите, пожалуйста, очень важно. #include "stdafx.h" #include "string.h" #include "iostream" #include "conio.h" #include "locale.h" using namespace std; int m=6; const int a=127; int c1=5, c2=3, g=0; char** H; char k[]; int h1(char s[],int n) { if (n>0) return ((a*h1(s, n-1))+s[n-1])%m; else return 0; }; int h(char k[], int i, int n) { if(i<(m-1)) return ((h1(k, n)+c1*i+c2*i*i)%m); else return 0; }; int Hash_Insert(char** H, char k[]) //вставка элемента { int i=0; //номер иследования do { int n = strlen(k); int j=h(k, i, n); { if(H[j]!=NULL) { H[j]=k; cout << j << endl; g++; cout << " количество элементов в таблице" << endl; printf(" %d\n", g); if(g==m/2 && H[j]!=0) { char** u = new char* [2*m]; cout << "увелечение хэш таблицы в двое:\n" << endl; g=0; for(int y=0; y<m; y++) { if(H[y]!=NULL) { Hash_Insert(u, H[y]); cout << k << endl; g++; printf(" %d\n", g); } m *=2; } delete [] u ; } return j; } else i++; } } while(i!=m); return NULL; }; int Hash_Search(char** H, char k[])// поиск элемента { int i=0; int j=0; do { int n = strlen(k); j=h(k, i, n); if(H[j]!=0 && strcmp(H[j],k) == 0) { cout<<" "<< endl; cout << j << endl; return j; } else i++; } while(H[j]!=NULL && i!=m); return -1; }; int _tmain() { setlocale (LC_ALL, "Russian"); char** H = new char* [m]; int n; for ( int i=0; i<m; i++) { H[i]=new char [m]; } char a[]="asy"; int r=h1(a, 3); cout << "Вывод h1:" << endl; printf("%d\n",r); // вывод h1 int e=h("asy", 0, 3); cout << "Вывод h:" << endl; printf("%d\n", e); cout << "Вывод вставки asy:" << endl; Hash_Insert(H, "asy"); cout << "Вывод вставки asyp:" << endl; Hash_Insert(H, "asyp"); cout << "Вывод вставки asyt:" << endl; Hash_Insert(H, "asyt"); cout << "Вывод вставки asyp:" << endl; Hash_Insert(H, "asyp"); cout << "\nВывод поиска asyt:" << endl; Hash_Search(H, "asyt"); _getch(); return 0; } |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проблема с многоуровневой адресацией | grook | Общие вопросы C/C++ | 3 | 18.12.2010 17:15 |
хэш-функция N-хэш | Temka | Общие вопросы Delphi | 1 | 29.11.2010 21:11 |
запуталась с адресацией диапазонов на листе | samoa | Microsoft Office Excel | 14 | 09.11.2010 23:27 |
Снова торможу с адресацией... | tae1980 | Microsoft Office Excel | 18 | 28.03.2010 21:05 |
Помогите с адресацией листа в формуле | ABCOz | Microsoft Office Excel | 2 | 09.09.2009 13:38 |