#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define KEY_SIZE 10 // 탐색키의 최대길이 
#define TABLE_SIZE 13 // 해싱 테이블의 크기=소수
#define equal(e1,e2) (!strcmp(e1.key,e2.key))

typedef struct    
{  
 char key[KEY_SIZE]; 
    // 다른 필요한 필드들
} element;

typedef struct listNode
{  
 element item;
    struct listNode *link;
} ListNode;
ListNode *hash_table[TABLE_SIZE];


// 문자로 된 탐색키를 숫자로 변환
int transform(char *key)
{
 int number=0;
 // 간단한 덧셈 방식 사용 자연수 생성
 while(*key)
  number += *key++;
 return number;
}

// 제산 함수를 사용한 해싱 함수
int hash_function(char *key)
{
 // 키를 자연수로 변환한 다음 테이블의 크기로 나누어 나머지를 반환
 return transform(key) % TABLE_SIZE;
}

 

// 체인법을 이용하여 테이블에 키를 삽입
void hash_chain_add(element item, ListNode *ht[])
{
 int hash_value = hash_function(item.key);
 ListNode *ptr;
 ListNode *node_before = NULL;
 ListNode *node = ht[hash_value];
 for(; node; node_before = node, node = node->link){
  if(equal(node->item, item)){
   fprintf(stderr, "이미 탐색 키가 저장되어 있음\n");
   return;
  }
 }
 ptr= (ListNode *)malloc(sizeof(ListNode));
 ptr->item = item;
 ptr->link = NULL;
 if(node_before)
  node_before->link = ptr;
 else
  ht[hash_value] = ptr;

 
}

// 체인법을 이용하여 테이블에 저장된 키를 탐색
void hash_chain_find(element item, ListNode *ht[])
{
 ListNode *node;

 int hash_value = hash_function(item.key);
 for(node=ht[hash_value]; node; node = node->link){
  if(equal(node->item, item)){
   printf("%c 키를 찾았음\n",node->item);
   return;
  }
 }
 printf("키를 찾지 못했음\n");
}

// 해싱 테이블의 내용을 출력
void hash_chain_print(ListNode *ht[])
{
   ListNode *node;
   int i;
   for(i=0;i<TABLE_SIZE;i++){
      printf("[%d]->",i);
      for(node=ht[i]; node; node=node->link){ 
      printf("%s->", node->item.key);
      }
      printf("\n");
   }
}

// 해싱 테이블을 사용한 예제
int main()
{
 element tmp;
 int op;
 while(1){
  printf("원하는 연산을 입력하시오(0=입력, 1=탐색, 2=종료)=");
  scanf("%d",&op);
  if( op == 2 ) break;
  printf("키를 입력하시오=");
  scanf("%s",tmp.key);
  if( op == 0 ){
   hash_chain_add(tmp, hash_table);
  }
  else if( op == 1 ){
   hash_chain_find(tmp, hash_table);
  }
  hash_chain_print(hash_table);
 }
 
 return 0;
}

'이전것 > 개발' 카테고리의 다른 글

Wireshark_Intro_6.0  (0) 2015.03.24
AvlNode  (0) 2014.12.04
선형조사법  (0) 2014.11.18
Dijkstra's algorithm  (0) 2014.11.11
kruskal Greedy Method  (0) 2014.11.06
블로그 이미지

잉비니

,