散列表的实现

散列表的实现

最初想法来自于《编程珠玑》,下午实现了一下
不多说了,直接看代码吧

  1  //
  2  //     HashTable
  3  //
  4  //     goonyangxiaofang(AT)163(DOT)com
  5  //     QQ: 五九一二四七八七六
  6  //
  7 
  8  #include  < iostream >
  9  #include  < string >
 10 
 11  #define  MYTRACE(t, f) std::cout << #t": " << t << std::endl; if(f == 1) std::cin.get()
 12  #define  PRINTNAME(name) std::cout << #name": " << std::endl
 13 
 14  template  < typename Key, typename Data, unsigned  int  prime  =   11 >
 15  class  HashTable
 16  {
 17       struct  Node
 18      {
 19          Key   key;
 20          Data  data;
 21          Node *  next;
 22          Node() : next( 0 ) {}
 23          Node( const  Key &  k) : key(k), next( 0 ) {}
 24          Node( const  Key &  k,  const  Data &  d) : key(k), data(d), next( 0 ) {}
 25          Node( const  Key &  k,  const  Data &  d,  const  Node *  p) : key(k), data(d), next(p) {}
 26          Node( const  Node &  n) : key(n.key), data(n.data), next(n.next) {}
 27           ~ Node() {}
 28      };
 29      Node **  table;
 30  private :
 31      unsigned  int  getKey( const  Key &  k)
 32      {
 33          unsigned  int  ret  =   0 ;
 34           char *  h  =  reinterpret_cast < char *> (const_cast < Key *> ( & k));
 35           for  (unsigned  int  i  =   0 ; i  <   sizeof  (Key);  ++ i)
 36          {
 37              ret  +=  static_cast < unsigned  int > (h[i])  *   10 ;
 38          }
 39           return  ret  %  prime;
 40      }
 41  public :
 42      HashTable()
 43      {
 44          table  =   new  Node * [prime];
 45           for  (unsigned  int  i  =   0 ; i  <  prime;  ++ i)
 46          {
 47              table[i]  =   0 ;
 48          }
 49      }
 50      HashTable( const  HashTable &  ht)
 51      {
 52          table  =   new  Node * [prime];
 53           for  (unsigned  int  i  =   0 ; i  <  prime;  ++ i)
 54          {
 55              table[i]  =   0 ;
 56              Node **  p  =   & (table[i]);
 57              Node *   q  =  ht.table[i];
 58               while  (q)
 59              {
 60                  Node *  r  =   new  Node(q -> key, q -> data);
 61                   * =  r;
 62                  p  =   & (r -> next);
 63                  q  =  q -> next;
 64              }
 65          }
 66      }
 67      HashTable &   operator = ( const  HashTable &  ht)
 68      {
 69           if  ( this   !=   & ht)
 70          {
 71              clear();
 72              table  =   new  Node * [prime];
 73               for  (unsigned  int  i  =   0 ; i  <  prime;  ++ i)
 74              {
 75                  table[i]  =   0 ;
 76                  Node **  p  =   & table[i];
 77                  Node *   q  =  ht.table[i];
 78                   while  (q)
 79                  {
 80                      Node *  r  =   new  Node(q -> key, q -> data);
 81                       * =  r;
 82                      p  =   & (r -> next);
 83                      q  =  q -> next;
 84                  }
 85              }
 86          }
 87           return   *   this ;
 88      }
 89       bool  find( const  Key &  k)
 90      {
 91          Node *  p  =  table[getKey(k)];
 92           while  (p)
 93          {
 94               if  (k  ==  p -> key)
 95              {
 96                   return   true ;
 97              }
 98              p  =  p -> next;
 99          }
100           return   false ;
101      }
102       bool  insert( const  Key &  k,  const  Data &  d)
103      {
104           if  (find(k))
105          {
106               return   true ;
107          }
108          unsigned  int  key  =  getKey(k);
109          Node *&  p  =  table[key];
110          Node *  q  =   new  Node(k, d);
111           if  (q  ==   0 )
112          {
113               return   false ;
114          }
115          q -> next  =  p;
116          p  =  q;
117           return   true ;
118      }
119       bool  insert( const  Key &  k)
120      {
121           if  (find(k))
122          {
123               return   true ;
124          }
125          unsigned  int  key  =  getKey(k);
126          Node *&  p  =  table[key];
127          Node *  q  =   new  Node(k);
128           if  (q  ==   0 )
129          {
130               return   false ;
131          }
132          q -> next  =  p;
133          p  =  q;
134           return   true ;
135      }
136      Data &   get ( const  Key &  k)
137      {
138          Node *  p  =  table[getKey(k)];
139           while  (p)
140          {
141               if  (k  ==  p -> key)
142              {
143                   return  p -> data;
144              }
145              p  =  p -> next;
146          }
147          insert(k);
148          Data d;
149           return  d;
150      }
151       const  Data &   operator []( const  Key &  k)  const
152      {
153          Node *  p  =  table[getKey(k)];
154           while  (p)
155          {
156               if  (k  ==  p -> key)
157              {
158                   return  p -> data;
159              }
160              p  =  p -> next;
161          }
162          insert(k);
163          Data d;
164           return  d;
165      }
166      Data &   operator []( const  Key &  k)
167      {
168          Node *  p  =  table[getKey(k)];
169           while  (p)
170          {
171               if  (k  ==  p -> key)
172              {
173                   return  p -> data;
174              }
175              p  =  p -> next;
176          }
177          insert(k);
178          Data d;
179           return  d;
180      }
181       bool  empty()
182      {
183           for  (unsigned  int  i  =   0 ; i  <  prime;  ++ i)
184          {
185               if  (table[i]  !=   0 )
186              {
187                   return   false ;
188              }
189          }
190           return   true ;
191      }
192       void  print()
193      {
194          std::cout  <<  std::endl;
195           for  (unsigned  int  i  =   0 ; i  <  prime;  ++ i)
196          {
197              Node *  p  =  table[i];
198              std::cout  <<  i  <<   " " ;
199               while  (p)
200              {
201                  std::cout  <<   " "   <<  p -> key  <<   " "   <<  p -> data  <<   "  )  " ;
202                  p  =  p -> next;
203              }
204              std::cout  <<  std::endl;
205          }
206          std::cout  <<  std::endl;
207      }
208       void  clear()
209      {
210           for  (unsigned  int  i  =   0 ; i  <  prime;  ++ i)
211          {
212              Node *  p  =  table[i];
213              Node *  q  =  p;
214               while  (p)
215              {
216                  p  =  p -> next;
217                  delete q;
218                  q  =  p;
219              }
220          }
221          delete [] table;
222      }
223       ~ HashTable()
224      {
225          clear();
226      }
227  };
228 
229  int  main()
230  {
231      HashTable < long , std:: string >  ht1;
232       for  ( long  i  =   0 ; i  <   26 ++ i)
233      {
234          std:: string  s;
235          s  +=   ' A '   +  i;
236          ht1.insert(i, s);
237      }
238      PRINTNAME(ht1);
239      ht1.print();
240 
241       for  ( long  i  =   0 ; i  <   26 ++ i)
242      {
243          std:: string  s;
244          s  +=   ' A '   +  i;
245          ht1.insert(i, s);
246      }
247      PRINTNAME(ht1);
248      ht1.print();
249 
250      HashTable < long , std:: string >  ht2(ht1);
251      PRINTNAME(ht2);
252      ht2.print();
253 
254      ht1[ 25 =   " xxxxxxxx " ;
255      ht1.print();
256      ht2.print();
257 
258      HashTable < long , std:: string >  ht3;
259      ht3  =  ht1;
260      PRINTNAME(ht3);
261      ht3.print();
262       return   0 ;
263  }

你可能感兴趣的:(散列表的实现)