哈希表类

C++ code

  1 #include "stdafx.h"
  2 #pragma once
  3 #define IDType int
  4 
  5 //哈希函数:除留余数法。冲突处理:链地址法
  6 template <class T>
  7 class CDict
  8 {
  9 public:
 10     CDict(int storeL)
 11     {
 12         if(storeL>0)
 13             storeLen=storeL;
 14         else
 15             storeLen=100;
 16         initProc();
 17     }
 18     CDict()
 19     {
 20         storeLen=100;
 21         initProc();
 22     }
 23     //增加
 24     bool Add(IDType ID,T data)
 25     {
 26         if(Find(ID))//保持主键唯一
 27             return 0;
 28         else{
 29         //新建节点
 30         HNode * tmp=new HNode;
 31         tmp->next=NULL;
 32         tmp->ID=ID;
 33         tmp->data=data;
 34         //获得链地址
 35         int pos=ID % storeLen;
 36         //检测冲突
 37         if(!ChainHash[pos]) 
 38             ChainHash[pos]=tmp;
 39         else{
 40             HNode * rear=ChainHash[pos];
 41             while(rear->next) rear=rear->next;
 42             rear->next=tmp;
 43         }
 44         return 1;
 45         }
 46     }
 47     //删除
 48     bool Delete(IDType ID)
 49     {
 50         //获得链地址
 51         int pos=ID % storeLen;
 52         //检测冲突
 53         if(ChainHash[pos]) 
 54         {
 55             HNode * rear=ChainHash[pos];
 56             if(rear->ID==ID)//在首地址就找到了数据
 57             {
 58                 ChainHash[pos]=rear->next;
 59                 delete rear;
 60             }
 61             else{
 62                 while(rear->next)
 63                 {
 64                     if(rear->next->ID==ID)
 65                     {
 66                         //勾连
 67                         HNode * tmp=rear->next;
 68                         rear->next=tmp->next;
 69                         delete tmp;
 70                         return 1;
 71                     }
 72                     rear=rear->next;
 73                 }
 74             }
 75         }
 76         return 0;
 77     }
 78     bool SetAt(IDType ID,T data)
 79     {
 80         int pos=ID % storeLen;
 81         //检测冲突
 82         if(ChainHash[pos]) 
 83         {
 84             HNode * rear=ChainHash[pos];
 85             while(rear)
 86             {
 87                 if(rear->ID==ID) 
 88                 {
 89                     rear->data=data;
 90                     return 1;
 91                 }
 92                 rear=rear->next;
 93             }
 94         }
 95         return 0;
 96     }
 97     T Find(int ID)
 98     {
 99         int pos=ID % storeLen;
100         //检测冲突
101         if(ChainHash[pos]) 
102         {
103             HNode * rear=ChainHash[pos];
104             while(rear)
105             {
106                 if(rear->ID==ID) return rear->data;
107                 rear=rear->next;
108             }
109         }
110         return NULL;
111     }
112     void showStruct()
113     {
114         int i=0;
115         for(i=0;i<storeLen;i++)
116         {
117             if(ChainHash[i]) 
118             {
119                 HNode * rear=ChainHash[i];
120                 while(rear)
121                 {
122                     printf(" → (%d,%d)",rear->ID,rear->data);
123                     rear=rear->next;
124                 }
125                 printf(" → ∧");
126             }
127             else printf("");
128             printf("\n");
129         }
130     }
131 protected:
132 private:
133     int storeLen;
134     //构造数据结构:存放冲突数据的链表
135     typedef struct HNode{
136         T data;//数据域
137         struct HNode* next;//指针域
138         IDType ID;//主键域
139     }HNode;
140     //构造链哈希表用于存放HNode的地址
141     HNode** ChainHash;
142     void initProc()
143     {
144         //构造链哈希表
145         ChainHash=new HNode*[storeLen];//ChainHash[ num ]的数据类型是HNode*,用来指向存储节点。
146         int i;
147         for(i=0;i<storeLen;i++) ChainHash[i]=NULL;//初始化
148     }
149 };

 

posted @ 2017-09-28 15:07  TQCAI  阅读(265)  评论(0编辑  收藏  举报