본문 바로가기

프로그래밍/C++

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
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
#include <iostream>
 
#define MAX_TABLE 10
 
using namespace std;
 
typedef struct node_hash {
    char id, pw;
    node_hash *node_next = NULL;
} NT;
 
NT *hashtable[MAX_TABLE];
 
int create_key(char id) {
    int key = id * 13 / 5;
    return key % MAX_TABLE;
}
 
void add_data(char id, NT *node) {
    int hash_key = create_key(id);
 
    NT *temp;
    if (temp = hashtable[hash_key]) {
        return;
    }
 
    while (temp->node_next != NULL) {
        temp = temp->node_next;
    }
    temp->node_next = node;
}
 
void del_data(char id) {
    int hash_key = create_key(id);
 
    NT *temp;
    if (temp = hashtable[hash_key]) {
        return;
    }
 
    NT *node_del;
    if (temp->id == id) {
        node_del = temp;
        hashtable[hash_key] = temp->node_next;
    }
    else {
        while (temp->node_next->id != id) {
            if (temp = temp->node_next) {
                return;
            }
        }
 
        node_del = temp->node_next;
        temp->node_next = temp->node_next->node_next;
    }
 
    delete node_del;
}
 
NT *find_data(char id) {
    int hash_key = create_key(id);
 
    NT *temp;
    if (temp = hashtable[hash_key]) {
        return NULL;
    }
 
    while (temp->id != id) {
        if (temp = temp->node_next) {
            return NULL;
        }
    }
 
    return temp;
}
 
int main()
{
    int i;
    char id[MAX_TABLE + 5], pw[MAX_TABLE + 5];
 
    for (i = 0; i < MAX_TABLE + 5; i++) {
        id[i] = 'A' + i;
        pw[i] = 'B' + i;
    }
 
    for (i = 0; i < MAX_TABLE + 5; i++) {
        NT *node = new NT;
        node->id = id[i];
        node->pw = pw[i];
        add_data(node->id, node);
    }
 
    NT *temp;
    char a, b;
    cout << "아이디 입력 : ";
    cin >> a;
    cout << "비밀번호 입력 : ";
    cin >> b;
    if (temp = find_data(a)) {
        if (temp->pw == b) {
            cout << "\n\n로그인 성공" << endl;
            cout << "ID : " << temp->id << endl;
            cout << "Password : " << temp->pw << endl;
        }
        else {
            cout << "아이디나 비밀번호가 맞지 않습니다." << endl;
        }
    }
 
    for (i = 0; i < MAX_TABLE + 5; i++) {
        del_data(id[i]);
    }
    return 0;
}
cs


'프로그래밍 > C++' 카테고리의 다른 글

C++ 문법 - 업캐스팅  (0) 2018.02.19
C++ 문법 - 문자열 string  (0) 2018.02.12
C++ 실습 - 링크드리스트  (0) 2018.02.12
C++ 실습 - 암호화  (0) 2018.02.12
C++ 문법 - 오버라이딩  (0) 2018.02.10