Hsue66 / Algo

0 stars 0 forks source link

DB #3

Open Hsue66 opened 4 years ago

Hsue66 commented 4 years ago

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);

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;

}