/*------------------------------------------------------- * Name : hash table * Programmed by : Man Geun Jeong * Included fuction: void init_hash(element ht[]); int transform(char *key); int hash_function(char *key); int char_analysis(char* key); int bit_extraction(char *key); void hash_add(element ht[],data item); void hash_search(element ht[],data item); void delete_hash(element ht[],data item); void display_hash(element ht[]); * Date: 12 10 2013 *(c) Copyright by Department of Digital Informatics and * Convergence a Chungbuk National University, * ChungBuk, Republic of Korea --------------------------------------------------------*/ #include #include #include #define KEY_SIZE 10 //´Ü¾îÀÇ ÃÖ´ë Å©±â #define TABLE_SIZE 30 //¹öÄÏ »çÀÌÁî #define SLOT_SIZE 3 //½½·Ô »çÀÌÁî #define INSERT 1 #define SEARCH 2 #define DELETE 3 #define DISPLAY 4 #define EXIT 5 typedef struct data{ //´Ü¾î ±¸Á¶Ã¼ char word[KEY_SIZE]; }data; typedef struct overdata{ //½½·Ô ÃÊ°ú½Ã ´Ü¾î Ãß°¡ ±¸Á¶Ã¼ data item; overdata *link; }overdata; typedef struct element{ //¹öÄÏ ±¸Á¶Ã¼ ¼±¾ð data key[SLOT_SIZE]; overdata *link; }element; void init_hash(element ht[]); int transform(char *key); int hash_function(char *key); int char_analysis(char* key); int bit_extraction(char *key); void hash_add(element ht[],data item); void hash_search(element ht[],data item); void delete_hash(element ht[],data item); void display_hash(element ht[]); int fuction_choise = 1; int main(){ int choise = 0; char *temp = "."; data buffer; element hashtable[TABLE_SIZE]; FILE* stream = fopen("input.txt","rt"); init_hash(hashtable); puts("1.Á¦»êÇÔ¼ö 2.¹®Àںм®ÇÔ¼ö 3.ºñÆ®ÃßÃâÇÔ¼ö"); scanf("%d",&fuction_choise); do{ puts("1.»ðÀÔ 2.°Ë»ö 3.»èÁ¦ 4.Ãâ·Â 5.Á¾·á"); scanf("%d",&choise); switch(choise){ case INSERT: while(1){ if(fgets(buffer.word,KEY_SIZE,stream) == NULL) break; buffer.word[strlen(buffer.word)-1] = NULL; //ÀÔ·ÂµÈ ¿£ÅÍ »©±â hash_add(hashtable,buffer); } break; case SEARCH: printf("ã°í ½ÍÀº ´Ü¾î¸¦ ÀÔ·ÂÇϼ¼¿ä \n"); scanf("%s",buffer.word); hash_search(hashtable,buffer); break; case DELETE: printf("»èÁ¦ÇÏ°í ½ÍÀº ´Ü¾î¸¦ ÀÔ·ÂÇϼ¼¿ä \n"); scanf("%s",buffer.word); delete_hash(hashtable,buffer); break; case DISPLAY:display_hash(hashtable); break; case EXIT: break; } }while(choise != 5); fclose(stream); return 0; } void init_hash(element ht[]){ //Çؽà Å×À̺í ÃʱâÈ­ int i,j; for(i = 0;i < TABLE_SIZE;i++){ for(j = 0;j < SLOT_SIZE;j++){ ht[i].key[j].word[0] = NULL; } ht[i].link = NULL; } } int transform(char *key){ //Å°¸¦ ¼ýÀÚ·Î ¹Ù²ã¼­ ¹Ýȯ int number = 0; while(*key) number += *key++; return number; } int hash_function(char *key){ //Á¦»ê ÇÔ¼ö »ç¿ë switch(fuction_choise){ case 1:return transform(key) % TABLE_SIZE;break; case 2:return char_analysis(key);break; case 3:return bit_extraction(key);break; } return transform(key) % TABLE_SIZE; } int char_analysis(char *key){ //¹®ÀÚ ºÐ¼® ÇÔ¼ö »ç¿ë int n = 0; n += *key++; n += *key; n = n % 30; return n; } int bit_extraction(char *key){ //ºñÆ® ÃßÃâ ÇÔ¼ö int i, share = transform(key); int rest[5]; for(i = 0; i < 5;i++){ rest[i] = share % 2; share = share / 2; } return ((rest[0]*16 + rest[1]*8 + rest[2]*4 + rest[3]*2 + rest[4]) % TABLE_SIZE); } void hash_add(element ht[],data item){ int hash_index; //ÇØ½Ì Å×À̺íÀÇ À妽º °ª ¼±¾ð int i = 0; hash_index = hash_function(item.word);//À妽º °ªÀ» Á¦»êÇÔ¼ö¸¦ ÀÌ¿ëÇؼ­ »ðÀÔ while(ht[hash_index].key[i].word[0] != NULL){ //ÇØ½Ì Å×À̺íÀÇ Ã¹¹ø° ¹öÄÏ¿¡ ¹«¾ð°¡ µé¾î°¡ ÀÖÀ» ¶§ if(strcmp(ht[hash_index].key[i].word, item.word) == 0){ // »ðÀÔÇÏ´Â ´Ü¾î¿Í °°ÀºÁö È®ÀÎ fprintf(stderr,"Å×ÀÌºí¿¡ ÀÌ¹Ì Á¸ÀçÇÏ´Â ´Ü¾îÀÔ´Ï´Ù.\n"); return; } i++; //´ÙÀ½ ½½·ÔÀ¸·Î ³Ñ¾î°£´Ù. if(i >= SLOT_SIZE){ //½½·ÔÀÌ ²ËÂ÷¸é ¸®ÅÏÇÑ´Ù. return; } } if(i >= SLOT_SIZE ){ //¹öÄÏÀÌ ²ËÂ÷¼­ ¿Â °æ¿ì üÀÌ´× ±â¹ýÀ¸·Î Ãß°¡ÇÑ´Ù. overdata *new_hash; //»õ·Î¿î ÇØ½Ì Å×À̺í overdata *before_hash = NULL; //ÀÌÀü ÇØ½Ì ÁÖ¼Ò Æ÷ÀÎÅÍ overdata *present_hash = ht[hash_index].link; // ÇöÀç ÇØ½Ì ÁÖ¼Ò Æ÷ÀÎÅÍ //üÀÌ´×À¸·Î Ãß°¡µÈ Å×À̺í Áß¿¡ item°ú Áߺ¹ÀÎÁö È®ÀΰúÁ¤ for(;present_hash;before_hash = present_hash,present_hash->link){ //ÇöÀç ÁÖ¼Ò°¡ NULL ÀÌ ¾Æ´Ò°æ¿ì ¹Ýº¹ if(strcmp(present_hash->item.word, item.word) == 0){ fprintf(stderr,"Å×ÀÌºí¿¡ ÀÌ¹Ì Á¸ÀçÇÏ´Â ´Ü¾îÀÔ´Ï´Ù.\n"); return; } } //Áߺ¹ÀÌ ¾øÀ»°æ¿ì new_hash = (overdata*)malloc(sizeof(overdata)); //¸Þ¸ð¸® °ø°£ È®º¸ new_hash->item = item; //´Ü¾î »ðÀÔ new_hash->link = NULL; //´ÙÀ½ ÇØ½Ì ÁÖ¼Ò NULL ÁöÁ¤ if(before_hash){ //ÀÌÀü¿¡ üÀÌ´×ÀÌ ÀÖÀ¸¸é ¿¬°á before_hash->link = new_hash; }else{ //ÀÌÀü¿¡ üÀÌ´×ÀÌ ¾øÀ¸¸é ÇؽÌÅ×ÀÌºí¿¡ ¹Ù·Î ¿¬°á ht[hash_index].link = new_hash; } }else{ //¹öÄÏÀÌ ºñ¾îÀÖÀ» °æ¿ì ±× ¹öÄÏ¿¡ ³Ö´Â´Ù. ht[hash_index].key[i] = item; } } void hash_search(element ht[],data item){ int hash_index; //ÇØ½Ì Å×À̺íÀÇ À妽º °ª ¼±¾ð int i = 0; hash_index = hash_function(item.word);//À妽º °ªÀ» Á¦»êÇÔ¼ö¸¦ ÀÌ¿ëÇؼ­ »ðÀÔ while(ht[hash_index].key[i].word[0] != NULL){ //ÇØ½Ì Å×À̺íÀÇ Ã¹¹ø° ¹öÄÏ¿¡ ¹«¾ð°¡ µé¾î°¡ ÀÖÀ» ¶§ if(strcmp(ht[hash_index].key[i].word, item.word) == 0){ // »ðÀÔÇÏ´Â ´Ü¾î¿Í °°ÀºÁö È®ÀÎ fprintf(stdout,"Å×ÀÌºí¿¡ Á¸ÀçÇÏ´Â ´Ü¾îÀÔ´Ï´Ù.\n"); return; } i++; //´ÙÀ½ ½½·ÔÀ¸·Î ³Ñ¾î°£´Ù. if(i >= SLOT_SIZE){ //½½·ÔÀÌ ²ËÂ÷¸é ¸®ÅÏÇÑ´Ù. return; } } if(i >= SLOT_SIZE ){ //¹öÄÏÀÌ ²ËÂ÷¼­ ¿Â °æ¿ì üÀÌ´× ±â¹ýÀ¸·Î Ãß°¡ÇÑ´Ù. overdata *before_hash = NULL; //ÀÌÀü ÇØ½Ì ÁÖ¼Ò Æ÷ÀÎÅÍ overdata *present_hash = ht[hash_index].link; // ÇöÀç ÇØ½Ì ÁÖ¼Ò Æ÷ÀÎÅÍ //üÀÌ´×À¸·Î Ãß°¡µÈ Å×À̺í Áß¿¡ item°ú Áߺ¹ÀÎÁö È®ÀΰúÁ¤ for(;present_hash;before_hash = present_hash,present_hash->link){ //ÇöÀç ÁÖ¼Ò°¡ NULL ÀÌ ¾Æ´Ò°æ¿ì ¹Ýº¹ if(strcmp(present_hash->item.word, item.word) == 0){ fprintf(stdout,"Å×ÀÌºí¿¡ Á¸ÀçÇÏ´Â ´Ü¾îÀÔ´Ï´Ù.\n"); return; } } }else{ //¹öÄÏÀÌ ºñ¾îÀÖÀ» °æ¿ì ±× ¹öÄÏ¿¡ ³Ö´Â´Ù. puts("Å×ÀÌºí¿¡ Á¸Àç ÇÏÁö ¾Ê´Â ´Ü¾îÀÔ´Ï´Ù."); } } void delete_hash(element ht[],data item){ int hash_index; //ÇØ½Ì Å×À̺íÀÇ À妽º °ª ¼±¾ð int i = 0; hash_index = hash_function(item.word);//À妽º °ªÀ» Á¦»êÇÔ¼ö¸¦ ÀÌ¿ëÇؼ­ »ðÀÔ while(ht[hash_index].key[i].word[0] != NULL){ //ÇØ½Ì Å×À̺íÀÇ Ã¹¹ø° ¹öÄÏ¿¡ ¹«¾ð°¡ µé¾î°¡ ÀÖÀ» ¶§ if(strcmp(ht[hash_index].key[i].word, item.word) == 0){ // »ðÀÔÇÏ´Â ´Ü¾î¿Í °°ÀºÁö È®ÀÎ fprintf(stdout,"%s¸¦ »èÁ¦ÇÕ´Ï´Ù.\n",ht[hash_index].key[i].word); ht[hash_index].key[i].word[0]= NULL; return; } i++; //´ÙÀ½ ½½·ÔÀ¸·Î ³Ñ¾î°£´Ù. if(i >= SLOT_SIZE){ //½½·ÔÀÌ ²ËÂ÷¸é ¸®ÅÏÇÑ´Ù. return; } } if(i >= SLOT_SIZE ){ //¹öÄÏÀÌ ²ËÂ÷¼­ ¿Â °æ¿ì üÀÌ´× ±â¹ýÀ¸·Î Ãß°¡ÇÑ´Ù. overdata *before_hash = NULL; //ÀÌÀü ÇØ½Ì ÁÖ¼Ò Æ÷ÀÎÅÍ overdata *present_hash = ht[hash_index].link; // ÇöÀç ÇØ½Ì ÁÖ¼Ò Æ÷ÀÎÅÍ //üÀÌ´×À¸·Î Ãß°¡µÈ Å×À̺í Áß¿¡ item°ú Áߺ¹ÀÎÁö È®ÀΰúÁ¤ for(;present_hash;before_hash = present_hash,present_hash->link){ //ÇöÀç ÁÖ¼Ò°¡ NULL ÀÌ ¾Æ´Ò°æ¿ì ¹Ýº¹ if(strcmp(present_hash->item.word, item.word) == 0){ fprintf(stdout,"%s¸¦ »èÁ¦ÇÕ´Ï´Ù.\n",ht[hash_index].link->item.word); if(present_hash->link){ before_hash->link = present_hash->link; free(present_hash); }else{ before_hash->link = NULL; free(present_hash); } return; } } }else{ //¹öÄÏÀÌ ºñ¾îÀÖÀ» °æ¿ì ±× ¹öÄÏ¿¡ ³Ö´Â´Ù. puts("Å×ÀÌºí¿¡ Á¸Àç ÇÏÁö ¾Ê´Â ´Ü¾îÀÔ´Ï´Ù."); } } void display_hash(element ht[]){ int i,j; overdata *temp; for(i = 0; i < TABLE_SIZE;i++){ temp = ht[i].link; printf("[%d]:",i); for(j = 0; j < SLOT_SIZE; j++){ printf("SLOT[%d]: %s ->", j, ht[i].key[j].word); } for(;temp;temp = temp->link){ printf("Over data: %s ->",temp->item.word); } printf("\n"); } }