· 4 years ago · May 05, 2021, 08:46 PM
1#include <iostream>
2#include <stdio.h>
3
4using namespace std;
5
6struct Flight_Info
7{
8 char dest[20];
9 int number;
10 char time[10];
11} *flights;
12int n = 0;
13
14FILE* fl;
15
16struct Hash_Table_Double
17{
18 Flight_Info* table = nullptr;
19 int size = 0;
20
21 void create(int new_size)
22 {
23 table = new Flight_Info[new_size];
24 for (int i = 0; i < new_size; i++) table[i].number = -1;
25 size = new_size;
26 }
27
28 void add(Flight_Info flight)
29 {
30 int i = flight.number % size;
31
32 if (table[i].number != -1)
33 {
34 int c = (size-2) - (flight.number % (size-2));
35 i -= c;
36 if (i < 0) i += (size);
37
38 while (table[i].number != -1)
39 {
40 i -= c;
41 if (i < 0) i += (size);
42 }
43 }
44 table[i] = flight;
45 }
46
47 int search(int number)
48 {
49 int i = number % size;
50 if (table[i].number == number) return i;
51
52 if (table[i].number != number)
53 {
54 int c = (size-2) - (number % (size-2));
55 i -= c;
56 if (i < 0) i += (size);
57 if (table[i].number == number) return i;
58
59 while (table[i].number != -1)
60 {
61 i -= c;
62 if (i < 0) i += size;
63 if (table[i].number == number) return i;
64 }
65 }
66 return -1;
67 }
68
69 void show()
70 {
71 cout << "Hash table:" << endl;
72 for (int i = 0; i < size; i++) cout << "[" << i << "] " << table[i].number << endl;
73 }
74
75 void clear()
76 {
77 if (table)
78 {
79 delete[] table;
80 table = nullptr;
81 }
82 }
83} H;
84
85void create_data();
86void read_data_from_file();
87void print_data();
88void create_hash_table();
89void print_hash_table();
90void search_data();
91
92int main()
93{
94 while (true)
95 {
96 cout << "+--------------------------+" << endl;
97 cout << "| 1 - Add data |" << endl;
98 cout << "| 2 - Read data from file |" << endl;
99 cout << "| 3 - Print data |" << endl;
100 cout << "| 4 - Create hash table |" << endl;
101 cout << "| 5 - Print hash table |" << endl;
102 cout << "| 6 - Search data |" << endl;
103 cout << "| 7 - Exit |" << endl;
104 cout << "+--------------------------+" << endl;
105
106 int menu; cin >> menu;
107 cout << endl;
108
109 switch (menu)
110 {
111 case 1: create_data(); break;
112 case 2: read_data_from_file(); break;
113 case 3: print_data(); break;
114 case 4: create_hash_table(); break;
115 case 5: print_hash_table(); break;
116 case 6: search_data(); break;
117 default: H.clear(); return 0;
118 }
119
120 cout << endl;
121 system("pause");
122 system("cls");
123 }
124}
125
126void create_data()
127{
128 if (n < 1)
129 {
130 cout << "Enter size of data: "; cin >> n;
131 if (n < 1)
132 {
133 cout << "Error" << endl;
134 return;
135 }
136 flights = new Flight_Info[n];
137 }
138 else
139 {
140 cout << "Data already exists" << endl;
141 return;
142 }
143
144 cout << "Enter flight data:" << endl;
145 for (int i = 0; i < n; i++)
146 {
147 cout << "Destenation: "; cin >> flights[i].dest;
148 cout << "Flight number: "; cin >> flights[i].number;
149 cout << "Time: "; cin >> flights[i].time;
150 }
151
152 cout << "Data added." << endl;
153}
154
155void read_data_from_file()
156{
157 if (n > 0)
158 {
159 cout << "Data already exists" << endl;
160 return;
161 }
162
163 fopen_s(&fl, "input.txt", "r");
164 if (fl)
165 {
166 fscanf_s(fl, "%d", &n);
167 flights = new Flight_Info[n];
168
169 for (int i = 0; i < n; i++)
170 {
171 fscanf_s(fl, "%s", flights[i].dest, 20);
172 fscanf_s(fl, "%d", &flights[i].number);
173 fscanf_s(fl, "%s", flights[i].time, 10);
174 }
175
176 cout << "Data readed." << endl;
177 }
178 else cout << "File open error." << endl;
179}
180
181void print_data()
182{
183 if (n > 0)
184 {
185 for (int i = 0; i < n; i++)
186 {
187 cout << "Number: " << flights[i].number << ", Dest: " << flights[i].dest << ", Time: " << flights[i].time << endl;
188 }
189 }
190 else cout << "Empty" << endl;
191}
192
193void create_hash_table()
194{
195 if (H.size > 0)
196 {
197 cout << "Hash table already exists" << endl;
198 return;
199 }
200 int hn;
201 cout << "Enter table size: "; cin >> hn;
202
203 if (hn > 0 && hn >= n)
204 {
205 H.create(hn);
206 for (int i = 0; i < n; i++) H.add(flights[i]);
207 cout << "Hash table created." << endl;
208 }
209 else cout << "Create eror." << endl;
210}
211
212void print_hash_table()
213{
214 if (H.size == 0) cout << "Table is empty" << endl;
215 else
216 {
217 H.show();
218 }
219}
220
221
222void search_data()
223{
224 int number;
225 cout << "Enter flight number: "; cin >> number;
226 int k = H.search(number);
227 if (k != -1) cout << "Number: " << H.table[k].number << ", Dest: " << H.table[k].dest << ", Time: " << H.table[k].time << endl;
228 else cout << "Flight not found." << endl;
229}
230
231/*8
232
233Los-Angeles
23412
23512:00
236
237New-York
23843
23909:45
240
241Horky
24299
24320:47
244
245Tokyo
24617
24723:15
248
249Minsk
25077
25121:09
252
253Moscow
254109
25517:00
256
257Kiev
25841
25902:00
260
261Paris
2623
26306:30
264
265*/