Форум программистов, компьютерный форум CyberForum.ru

Хеш таблица с функцией (метод цепочек) - C++

Восстановить пароль Регистрация
 
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
27.10.2013, 19:46     Хеш таблица с функцией (метод цепочек) #1
Вопрос таков : как вывести на экран элементы списка при коллизии.
Т.Е. вот у нас коллизия ( а она будет, т.к. хеш функция калл редкостный), при коллизии (одинаковых адресах) Новый
ключ засовывается в новую структуру и создает собсна список. Ф-ция SHowTable. Если запустить сейчас программу, то она определит что есть коллизия и сбоку выведет |. но как мне показать элементы в этом элементе массива справа от |. Сижу часа 2. Перепробовал все подряд. Было только так что Выводило в первом элементе с коллизией сразу все элементы. ( не понял как)
P.S. Извините за неоформленные мыслы. голова кипит. первый проект со списками и с классами.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
#include "main.h"
 
void HashTable::CreateHashTable(){
    for (int i = 0; i < 50; i++){   
        string temp_key = CreateKey();
        int temp_adress = HashFunc(temp_key);
 
        if (Array[temp_adress].empty == true){
            Array[temp_adress].empty = false;
            Array[temp_adress].key = temp_key;
            Array[temp_adress].adress = temp_adress;
        }
        else{
            Array[temp_adress].synonym = true;
            segment* NewSynonym = new segment;
            NewSynonym->adress = temp_adress;
            NewSynonym->empty = false;
            NewSynonym->key = temp_key;
            NewSynonym->synonym = false;
            NewSynonym->new_segment = head;
            head = NewSynonym;
        }        
    }
}
 
void HashTable::AddElement(string NewElement){      
    int temp_adress = HashFunc(NewElement);
    if (Array[temp_adress].empty == true){
        Array[temp_adress].empty = false;
        Array[temp_adress].key = NewElement;
        Array[temp_adress].adress = temp_adress;
    }
    else{
        Array[temp_adress].synonym = true;
        segment* NewSynonym = new segment;
        NewSynonym->adress = temp_adress;
        NewSynonym->empty = false;
        NewSynonym->key = NewElement;
        NewSynonym->synonym = false;
        NewSynonym->new_segment = head;
        head = NewSynonym;
    }
}
 
void HashTable::ShowTable(){
    
    for (int i = 0; i < 400; i++){ ///////400 change to 1500
            if (Array[i].empty == true) cout << i + 1 << ". Empty cell !!" << endl;
            else if (Array[i].empty == false && Array[i].synonym == false){
                cout << i + 1 << ". key -> " << Array[i].key << endl;
            }
 
            else if (Array[i].empty == false && Array[i].synonym == true){
                cout << i + 1 << ". key -> " << Array[i].key<<" | " ;       
                
                /*Как вывести на экран элементы списка*/
 
 
 
                cout << endl;
            }
    }
}
 
#endif // FUNCTIONS_H
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#ifndef MAIN_H
#define MAIN_H
 
#include <iostream>
#include <string>
#include <time.h>
#define SegNum 1500
 
 
 
using namespace std;
 
struct segment{
    string key = "asdfgh"; //Ключ
    int adress = 0; //Адрес или сумма Аски символов
    bool empty = true;//Проверка на пустоту
    bool synonym = false; //Есть ли элемент списка (Синоним)
    segment *new_segment,*head;
};
 
class HashTable:public segment{
public:
    HashTable(){  } 
    ~HashTable(){}
    segment Array[SegNum];
public
/* that all functions with hash table*/:
    void CreateHashTable();
    void AddElement(string NewElement);
    void ShowTable();
    void FindElement();
    void DeleteElement();   
private:
    
 
    int HashFunc(string key){
        int    Adress = (key[0] + key[1] + key[2] + key[3] + key[4] + key[5]);
        return Adress;
    }
    string CreateKey(){
       string key = "_temp_";
        for (int i = 0; i < 6; i++){
            if (i == 0 || i == 4 || i == 5)
                key[i] = rand() % 26 + 65;
            else
                key[i] = rand() % 10 + 48;
        }
        return key;
    }
};
 
 
 
 
 
#endif // MAIN_H
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "main.h"
#include "functions.h"
#include <time.h>
 
int repeat(string y);
 
int main(){
    system("cls");
    srand(time(NULL));
    HashTable MyHashTable;
    segment MySegment;
    string reapeat_program;
    string NewElement;  //For Creating New Element
    string y="y"; //For Cycle of program
    int PersKey;
    while (y == "y"){
        system("cls");
    cout<<"What do you want to do? "<<endl;
    cout<<"1-Create new Hash Table "<<endl;
    cout<<"2-Add new element"<<endl;
    cout<<"3-Show my hash table"<<endl;
    cout<<"4-Find element"<<endl;
    cout<<"5-Delete Element"<<endl;
    cout<<"-> ";cin>>PersKey;   
        switch (PersKey) {
        case 1:
            MyHashTable.CreateHashTable();
            cout << "Hash Table was Created!!!" << endl;
            cout << "Do you want choose other function? y/n ->";
            cin >> y;
            break;
        case 2:
            cout << "Enter name of element (AcccAA type) ->";
            cin >> NewElement;
            MyHashTable.AddElement(NewElement);
            cout << "Element " << NewElement << " was succesfully added!!" << endl;
            cout << "Do you want choose other function? y/n ->";
            cin >> y;
            break;
        case 3:
            MyHashTable.ShowTable();            
            cout << "Do you want choose other function? y/n ->";
            cin >> y;
            break;
        case 4:
 
            cout << "Do you want choose other function? y/n ->";
            cin >> y;
            break;
        case 5:
 
            cout << "Do you want choose other function? y/n ->";
            cin >> y;
            break;
 
        default:
            system("cls");
            cout << "You placed incorrect number!!!,retry" << endl;
            system("pause");
            y = "y";
            break;
        }
    
   }
    return 0;
}
Добавлено через 1 час 27 минут
Закрыто.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2013, 19:46     Хеш таблица с функцией (метод цепочек)
Посмотрите здесь:

C++ Хеш Таблица
C++ Хеш таблица
хеш-таблица C++
C++ Хэш-таблица. Метод цепочек. C++
Хеш таблица C++
C++ Хеш таблица с функцией (метод цепочек)
Хэш - таблица методом цепочек C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 15:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru