一个HashTable操作的程序

  1: /*

 

   2:  * FilePath:    ./home/ijse/MyCodes/Hash/main.h

 

   3:  * Author:  ijse

 

   4:  * Email:   i@ijser.cn

 

   5:  * Date:    2010-07-05

 

   6:  * Site:    http://www.ijser.cn

 

   7:  * All Rights Reserved 2010

 

   8:  */

 

   9:  

 

  10: #ifndef MAIN_H_INCLUDED

 

  11: #define MAIN_H_INCLUDED

 

  12:  

 

  13: #include <stdio.h>

 

  14: #include <malloc.h>

 

  15:  

 

  16: #define SUCCESS 1

 

  17: #define UNSUCCESS 0

 

  18: #define OK 1

 

  19: #define DUPLICATE -1

 

  20:  

 

  21: typedef  int ElemType;

 

  22: typedef int KeyType;

 

  23:  

 

  24: typedef struct {

 

  25:         ElemType *elem;

 

  26:         int count;

 

  27:         int sizeindex;

 

  28: } HashTable;

 

  29:  

 

  30:  

 

  31: extern int Hash(int K);

 

  32: extern int collision(HashTable H,int *p,int *c);

 

  33:  

 

  34: /*

 

  35:  * Print the HashTable's status

 

  36:  */

 

  37: void PrintHashTableStatus(HashTable H) {

 

  38:     int i=0;

 

  39:     printf("/n=======================================/n");

 

  40:     printf("Now the HashTable's status is:/n");

 

  41:     for(i=0;i<H.sizeindex;++i)

 

  42:         printf("/t%d",i);

 

  43:     printf("/n");

 

  44:     for(i=0;i<H.sizeindex;++i)

 

  45:         printf("/t%d",*(H.elem+i));

 

  46:     printf("/n");

 

  47:     printf("The count of HashTable's elements is %d",H.count);

 

  48:     printf("/n=======================================/n");

 

  49:     printf("Press [Enter] to continue...");

 

  50:  

 

  51:     getchar();

 

  52:  

 

  53: }

 

  54:  

 

  55:  

 

  56: /*

 

  57:  * Search and return p

 

  58:  * @param HashTable

 

  59:  * @param KeyType the keyword

 

  60:  * @param int* p to return the HashCode

 

  61:  * @param int* c conflict count

 

  62:  * @return int

 

  63:  */

 

  64: int SearchHash(HashTable H, KeyType K, int *p, int *c) {

 

  65:     *p = Hash(K);

 

  66:     /*printf("%d/n",K!=*(H.elem+*p));

 

  67:     printf("/nCollision Happen:p=%d,K=%d,h.elem=%d/n",*p,K,*(H.elem+*p));

 

  68:     printf("h.elem+*p == 0? %d/n",*(H.elem+*p)==0);

 

  69:     getchar();*/

 

  70:     printf("Got the HashCode %d, and the next step is to see whether there is a confiction, press [Enter] to continue.../n",*p);

 

  71:     getchar();

 

  72:     while(*(H.elem+*p)!=0 && K!=*(H.elem+*p)) { /* handle the confliction */

 

  73:         printf("/nCollision Happen:/n/tp=%d,K=%d,H.elem=%d/n",*p,K,*(H.elem+*p));

 

  74:         printf("Press [Enter] to handle the confliction.../n");

 

  75:         getchar();

 

  76:         collision(H,p,c);

 

  77:     }

 

  78:     printf("The HashCode create successful, it is %d/n",*p);

 

  79:     /*printf("/nSearchHash() return p=%d/n",*p);*/

 

  80:     if(K==*(H.elem+*p)) /* find the element */

 

  81:         return SUCCESS;

 

  82:     else /* didn't find the element */

 

  83:         return UNSUCCESS;

 

  84: }

 

  85:  

 

  86:  

 

  87: /*

 

  88:  * Insert Element into HashTable

 

  89:  * @param HashTable

 

  90:  * @param ElemType e

 

  91:  * @return int

 

  92:  */

 

  93: int InsertHash(HashTable *H, ElemType e) {

 

  94:     int c = 0;

 

  95:     int p = 0;

 

  96:     int i = 0;

 

  97:  

 

  98:     /* See the HashTable's status */

 

  99:     PrintHashTableStatus(*H);

 

 100:  

 

 101:     if(SearchHash(*H,e,&p,&c))

 

 102:         return DUPLICATE;

 

 103:     else {

 

 104:         printf("Now save %d into the HashTable. Press [Enter] to continue.../n",e);

 

 105:         *(H->elem+p) = e;

 

 106:         ++(H->count);

 

 107:         PrintHashTableStatus(*H);

 

 108:         return OK;

 

 109:     } /*

 

 110:     else {

 

 111:         RecreateHashTable(H);

 

 112:         printf("FUNCTION SEARCHHASH() RETURNED UNSUCCESS!!/n");

 

 113:         return UNSUCCESS;

 

 114:     }

 

 115:     */

 

 116: }

 

 117:  

 

 118: /*

 

 119:  * Delete element from HashTable

 

 120:  */

 

 121: int DeleteHashElem(HashTable *H, KeyType K, int *p, int *c) {

 

 122:     printf("Delete %d:/n",K);

 

 123:     PrintHashTableStatus(*H);

 

 124:     if(SearchHash(*H,K,p,c)==SUCCESS) { /* find the element, delete it */

 

 125:         printf("Find %d, press [Enter] to delete it!",K);

 

 126:         getchar();

 

 127:         *(H->elem+*p)=0;

 

 128:         printf("Delete successfully!/n");

 

 129:         return SUCCESS;

 

 130:     } else {

 

 131:         printf("Can't find %d, delete failed~!/n",K);

 

 132:         return UNSUCCESS;

 

 133:     }

 

 134:  

 

 135: }

 

 136:  

 

 137: /*

 

 138:  * Initialize the HashTable

 

 139:  * @param HashTable

 

 140:  * @param int datasize  how many elements

 

 141:  */

 

 142: void InitHashTable(HashTable *H,int datasize) {

 

 143:     /*H = (HashTable*)malloc(sizeof(HashTable*));*/

 

 144:     int i=0;

 

 145:     H->elem=(ElemType*)malloc(datasize*sizeof(ElemType*));

 

 146:  

 

 147:     /*!!!!There is no need in Linux GNU GCC !!!!!*/

 

 148:     for(i=0;i<datasize;++i) {

 

 149:         *(H->elem+i)=0;

 

 150:     }

 

 151:     /*********************************************/

 

 152:  

 

 153:     H->count=0;

 

 154:     H->sizeindex=datasize;

 

 155: }

 

 156:  

 

 157:  

 

 158: #endif /* MAIN_H_INCLUDED*/

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值