Open Hsue66 opened 4 years ago
typedef enum { NAME, NUMBER, BIRTHDAY, EMAIL, MEMO } FIELD;
typedef struct { int count; char str[20]; } RESULT;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
using namespace std;
void ztrcpy(char dst, char src) { while (dst++ = src++); }
int ztrcmp(char dst, char src) { int i = 0, j = 0; while (dst[i]) { if (dst[i++] != src[j++]) break; } return dst[i] - src[j]; }
struct Record { int active; char fields[5][MAX_LEN]; int hashkey[5]; };
Record DB[MAX_RECORD]; int DBidx; int HashTB[5][MAX_TABLE];
unsigned long getHash(char str) { unsigned long hash = 5381; int c; while (c = str++) hash = (((hash << 5) + hash) + c) % MAX_TABLE; return hash % MAX_TABLE; }
int addToHashTB(char *str, int data, int fields) { // HashTBㅇㅔ 넣기 int hash = getHash(str); for ( register int i = 0; i < MAX_TABLE; i++) { if (HashTB[fields][hash] == -1 || HashTB[fields][hash] == MAX_RECORD) { HashTB[fields][hash] = data; return hash; } hash = (hash + 1) % MAX_TABLE; } return -1; }
void InitDB() { DBidx = 0; for (register int i = 0; i < 5; i++) { for (register int j = 0; j < MAX_TABLE; j++) HashTB[i][j] = -1; } }
void Add(char name, char number, char birthday, char email, char* memo) { DB[DBidx].active = 1; ztrcpy(DB[DBidx].fields[0], name); ztrcpy(DB[DBidx].fields[1], number); ztrcpy(DB[DBidx].fields[2], birthday); ztrcpy(DB[DBidx].fields[3], email); ztrcpy(DB[DBidx].fields[4], memo);
for (register int i = 0; i < 5; i++) DB[DBidx].hashkey[i] = addToHashTB(DB[DBidx].fields[i], DBidx, i); DBidx++;
}
int Delete(FIELD field, char* str) { int count = 0; int hash = getHash(str); for (register int i = 0; i < MAX_TABLE; i++) { int idx = HashTB[field][hash]; if (idx == -1) break; if (idx != MAX_RECORD && DB[idx].active == 1 && !ztrcmp(str, DB[idx].fields[field])) { DB[idx].active = 0; for (register int t = 0; t < 5; t++) HashTB[t][DB[idx].hashkey[t]] = MAX_RECORD; count++; } hash = (hash + 1) % MAX_TABLE; } return count; }
int Change(FIELD field, char str, FIELD changefield, char changestr) { int count = 0; int hash = getHash(str); for (register int i = 0; i < MAX_TABLE; i++) { int idx = HashTB[field][hash]; if (idx == -1) break; if (idx != MAX_RECORD && DB[idx].active == 1 && !ztrcmp(str, DB[idx].fields[field])) { ztrcpy(DB[idx].fields[changefield], changestr); HashTB[changefield][DB[idx].hashkey[changefield]] = MAX_RECORD; DB[idx].hashkey[changefield] = addToHashTB(DB[idx].fields[changefield], idx, changefield); count++; } hash = (hash + 1) % MAX_TABLE; } return count; }
RESULT Search(FIELD field, char* str, FIELD ret_field) { RESULT result; result.count = 0;
int hash = getHash(str); for (register int i = 0; i < MAX_TABLE; i++) { int idx = HashTB[field][hash]; if (idx == -1) break; if (idx != MAX_RECORD && DB[idx].active == 1 && !ztrcmp(str, DB[idx].fields[field])) { ztrcpy(result.str, DB[idx].fields[ret_field]); result.count++; } hash = (hash + 1) % MAX_TABLE; } return result;
char A[5][5][20] = { {"A","111","0101","a.com","aaa"}, {"B","222","0202","b.com","bbb"}, {"C","333","0303","c.com","ccc"}, {"D","444","0505","d.com","ddd"}, {"E","555","0505","e.com","eee"}};
void showDB() { for (int i = 0; i < 7; i++) { for (int j = 0; j < 5; j++) cout << DB[i].fields[j] << " "; cout << endl; } } void Test() { cout << "hello" << endl; InitDB(); for (int i = 0; i < 5; i++) Add(A[i][0], A[i][1], A[i][2], A[i][3], A[i][4]);
cout <<"D "<< HashTB[2][98161] << endl; RESULT res = Search(NAME, A[0][0], EMAIL); cout << res.count << " " << res.str << endl; cout << "D " << HashTB[2][98161] << endl; cout << Change(NAME, A[0][0], EMAIL, A[3][3]) << endl; cout << "D " << HashTB[2][98161] << endl; res = Search(NAME, A[0][0], EMAIL); cout << res.count << " " << res.str << endl; cout << "D " << HashTB[2][98161] << endl; char nu[5] = "777"; cout << Delete(NUMBER, nu) << endl; cout << "D " << HashTB[2][98161] << endl; res = Search(BIRTHDAY, A[4][2], MEMO); cout << res.count << " " << res.str << endl; cout << "D " << HashTB[2][98161] << endl; cout << Delete(EMAIL, A[3][3]) << endl; cout << "D " << HashTB[2][98161] << endl; res = Search(NAME, A[0][0], EMAIL); cout << res.count << " " << res.str << endl; char nu2[5] = "zzz"; showDB(); cout << "D " << HashTB[2][98161] << endl; cout<<Change(BIRTHDAY, A[4][2], MEMO,nu2)<<endl; showDB(); cout << "D " << HashTB[2][98161] << endl; res = Search(NAME, A[4][0],MEMO); cout << res.count << " " << res.str << endl;
typedef enum { NAME, NUMBER, BIRTHDAY, EMAIL, MEMO } FIELD;
typedef struct { int count; char str[20]; } RESULT;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
include
using namespace std;
define MAX_LEN 20
define MAX_RECORD 50000
define MAX_TABLE (50000*2+7)
void ztrcpy(char dst, char src) { while (dst++ = src++); }
int ztrcmp(char dst, char src) { int i = 0, j = 0; while (dst[i]) { if (dst[i++] != src[j++]) break; } return dst[i] - src[j]; }
struct Record { int active; char fields[5][MAX_LEN]; int hashkey[5]; };
Record DB[MAX_RECORD]; int DBidx; int HashTB[5][MAX_TABLE];
unsigned long getHash(char str) { unsigned long hash = 5381; int c; while (c = str++) hash = (((hash << 5) + hash) + c) % MAX_TABLE; return hash % MAX_TABLE; }
int addToHashTB(char *str, int data, int fields) { // HashTBㅇㅔ 넣기 int hash = getHash(str); for ( register int i = 0; i < MAX_TABLE; i++) { if (HashTB[fields][hash] == -1 || HashTB[fields][hash] == MAX_RECORD) { HashTB[fields][hash] = data; return hash; } hash = (hash + 1) % MAX_TABLE; } return -1; }
void InitDB() { DBidx = 0; for (register int i = 0; i < 5; i++) { for (register int j = 0; j < MAX_TABLE; j++) HashTB[i][j] = -1; } }
void Add(char name, char number, char birthday, char email, char* memo) { DB[DBidx].active = 1; ztrcpy(DB[DBidx].fields[0], name); ztrcpy(DB[DBidx].fields[1], number); ztrcpy(DB[DBidx].fields[2], birthday); ztrcpy(DB[DBidx].fields[3], email); ztrcpy(DB[DBidx].fields[4], memo);
}
int Delete(FIELD field, char* str) { int count = 0; int hash = getHash(str); for (register int i = 0; i < MAX_TABLE; i++) { int idx = HashTB[field][hash]; if (idx == -1) break; if (idx != MAX_RECORD && DB[idx].active == 1 && !ztrcmp(str, DB[idx].fields[field])) { DB[idx].active = 0; for (register int t = 0; t < 5; t++) HashTB[t][DB[idx].hashkey[t]] = MAX_RECORD; count++; } hash = (hash + 1) % MAX_TABLE; } return count; }
int Change(FIELD field, char str, FIELD changefield, char changestr) { int count = 0; int hash = getHash(str); for (register int i = 0; i < MAX_TABLE; i++) { int idx = HashTB[field][hash]; if (idx == -1) break; if (idx != MAX_RECORD && DB[idx].active == 1 && !ztrcmp(str, DB[idx].fields[field])) { ztrcpy(DB[idx].fields[changefield], changestr); HashTB[changefield][DB[idx].hashkey[changefield]] = MAX_RECORD; DB[idx].hashkey[changefield] = addToHashTB(DB[idx].fields[changefield], idx, changefield); count++; } hash = (hash + 1) % MAX_TABLE; } return count; }
RESULT Search(FIELD field, char* str, FIELD ret_field) { RESULT result; result.count = 0;
}
char A[5][5][20] = { {"A","111","0101","a.com","aaa"}, {"B","222","0202","b.com","bbb"}, {"C","333","0303","c.com","ccc"}, {"D","444","0505","d.com","ddd"}, {"E","555","0505","e.com","eee"}};
void showDB() { for (int i = 0; i < 7; i++) { for (int j = 0; j < 5; j++) cout << DB[i].fields[j] << " "; cout << endl; } } void Test() { cout << "hello" << endl; InitDB(); for (int i = 0; i < 5; i++) Add(A[i][0], A[i][1], A[i][2], A[i][3], A[i][4]);
}