-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDirect Chaining Method.cpp
More file actions
158 lines (140 loc) · 2.93 KB
/
Direct Chaining Method.cpp
File metadata and controls
158 lines (140 loc) · 2.93 KB
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include<iostream>
using namespace std;
// Bài toán: Xây dựng chương trình bảng băm(hashtable) với phương pháp xử lý đụng độ: Direct Chaining Method (Nối kết trực tiếp)
// Cấu trúc bảng băm và hàm khởi tạo
// Định nghĩa hàm băm với giả định 10 phần tử
#define M 10
struct Node
{
int key;
Node* next;
};
typedef Node* HashTable[M];
void InitHashTable(HashTable& HT) // Khởi tạo mảng: cấp phát bộ nhớ cho từng Node
{
for (int i = 0; i < M; i++)
{
HT[i] = NULL;
}
}
int Hash(int k) // Hàm băm
{
return k % M;
}
// Cụm hàm thêm nút vào bảng băm
void AddTail(Node*& l, int k) // Thêm Node vào đuôi của danh sách liên kết đơn
{
Node* newNode = new Node{ k, NULL };
if (l == NULL)
l = newNode;
else
{
Node* p = l;
while (p != NULL && p->next != NULL)
p = p->next;
p->next = newNode;
}
}
void InsertNode(HashTable& HT, int k) // Thêm nút vào bảng băm
{
int i = Hash(k);
AddTail(HT[i], k);
}
// Hàm tìm kiếm khóa trong bảm băm
Node* SearchNode(HashTable HT, int k)
{
int i = Hash(k);
Node* p = HT[i];
while (p != NULL && p->key != k)
p = p->next;
if (p == NULL)
return NULL;
return p;
}
void SearchResult(HashTable HT, int k)
{
Node* result = SearchNode(HT, k);
if (result == NULL)
cout << "Not found!";
else
cout << "Found!";
}
// Cụm hàm xóa 1 nút ra khỏi bảng băm
// Cụm hàm xóa node trong danh sách liên kết đơn
void DeleteHead(Node*& l)
{
if (l != NULL)
{
Node* p = l;
l = l->next;
delete p;
}
}
void DeleteAfter(Node*& q)
{
Node* p = q->next;
if (p != NULL)
{
q->next = p->next;
delete p;
}
}
void DeleteNode(HashTable& HT, int k)
{
int i = Hash(k);
Node* p = HT[i];
Node* q = p;
while (p != NULL && p->key != k)
{
q = p; // Lưu lại địa chỉ của phần tử trước đó
p = p->next;
}
if (p == NULL)
cout << k << " not found!" << endl;
else if (p == HT[i])
DeleteHead(HT[i]);
else DeleteAfter(q);
}
// Cụm hàm duyệt qua bảng băm
void Traverse(Node* p) // Duyệt DSLK
{
while (p != NULL)
{
cout << p->key << ' ';
p = p->next;
}
cout << endl;
}
void TraverseHashTable(HashTable HT)
{
for (int i = 0; i < M; i++)
{
cout << "Bucket: " << i << ": ";
Traverse(HT[i]);
}
}
int main()
{
HashTable mHashTable;
InitHashTable(mHashTable);
InsertNode(mHashTable, 0);
InsertNode(mHashTable, 1);
InsertNode(mHashTable, 2);
InsertNode(mHashTable, 3);
InsertNode(mHashTable, 10);
InsertNode(mHashTable, 13);
InsertNode(mHashTable, 9);
InsertNode(mHashTable, 11);
cout << "\n\n\t========== HashTable ==========\n";
TraverseHashTable(mHashTable);
DeleteNode(mHashTable, 3);
DeleteNode(mHashTable, 13);
DeleteNode(mHashTable, 9);
cout << "\n\n\t========== HashTable after Delete ==========\n";
TraverseHashTable(mHashTable);
cout << "\n\tSearch: 10\n\t";
SearchResult(mHashTable, 10);
cout << endl;
system("pause");
return 0;
}