C++hashtable実装

8780 ワード

//A simple example of hashtable
#include 
#include 
#include 
#include 
#define SIZE_KEY       16
#define SIZE_VALUE1    64
#define SIZE_VALUE2    16
#define DEFAULT_TABLESIZE    101
using namespace std;
 
struct NODE
{
   Node(const char* Key1 = "\0", const char* fName = "\0",
         const char *tele ="\0", const double sal = 0.0 )
   {
      strcpy(Key, Key1);
      strcpy(FullName, fName);
      strcpy(Tele_No, tele);
      Salary = sal;
      Tax = 0.005 * Salary;
      next = NULL;
   }
   char Key[SIZE_KEY];
   char FullName[SIZE_VALUE1];
   char Tele_No[SIZE_VALUE2];
   double Salary;
   double Tax;
   Node *next;
};
 
class Hashtable
{
   private:
      int table_size;
      NODE** table;
      int size;
      long hashString(char* Key);
      NODE* find(char* Key);
      NODE* current_entry;
      int current_index;
   public:
      Hashtable(int T = DEFAULT_TABLESIZE);//constructor
      virtual ~Hashtable();//destructor
      bool put(NODE *);
      bool get(NODE *);
      bool contains(char* Key);
      bool remove(char* Key);
      void removeAll();
      int getSize();
      void initIterator();
      bool hasNext();
      void getNextKey(char* Key);
      friend void disp(NODE *);
};
 
Hashtable::Hashtable(int T)
{
   size = 0;
   table_size = T;
   table = new NODE*[table_size];
   for(int i=0; iKey << "
FullName: " << N1->FullName <Tele_No << "
Salary: " << setprecision(12) << N1->Salary<< "
Tax: " << N1->Tax << endl; } bool Hashtable::put(NODE *N) {//start put if(find(N->Key) != NULL) { return false; } NODE* entry = new NODE(N->Key, N->FullName,N->Tele_No, N->Salary); int bucket = hashString(N->Key); entry->next = table[bucket]; table[bucket] = entry; size++; return true; }//end put bool Hashtable::get(NODE* N) {//start get NODE* temp = find(N->Key); if(temp == NULL) { N->FullName[0] = '\0'; return false; } else { strcpy(N->FullName, temp->FullName); strcpy(N->Tele_No, temp->Tele_No); N->Salary = temp->Salary; N->Tax = temp->Tax; return true; } }//end get bool Hashtable::contains(char* Key) {//start contains if(find(Key) == NULL) { return false; } else { return true; } }//end contains bool Hashtable::remove(char* Key) {//start remove int bucket = hashString(Key); NODE* temp = table[bucket]; if(temp == NULL) { return false; } else if(strcmp(Key, temp->Key) == 0) { table[bucket] = temp->next; delete temp; size--; return true; } else { NODE* temp_next = temp->next; while(temp_next != NULL) { if(strcmp(Key, temp_next->Key) == 0) { temp->next = temp_next->next; delete temp_next; size--; return true; } temp = temp->next; temp_next = temp_next->next; } } return false; }//end remove void Hashtable::removeAll() {//start removeAll for(int i=0; inext; disp(temp); delete temp; temp = next; } } size = 0; }//end removeAll int Hashtable::getSize() { return size; } NODE* Hashtable::find(char* Key) { //start find int bucket = hashString(Key); NODE* temp = table[bucket]; while(temp != NULL) { if(strcmp(Key, temp->Key) == 0) { return temp; } temp = temp->next; } return NULL; }//end find long Hashtable::hashString(char* Key) {//start hashString int n = strlen(Key); long h = 0; for(int i=0; iKey); if(current_entry->next != NULL) { current_entry = current_entry->next; } else { for(int i=current_index+1; icontains(N1.Key)) { cout << "
Adding node: "; disp(&N1); hashtable->put(&N1); } strcpy(N1.Key, "314"); strcpy(N1.FullName, "Zeki"); strcpy(N1.Tele_No, "8765623"); N1.Salary = 98124.567; if(!hashtable->contains(N1.Key)) { cout << "
Adding node: "; disp(&N1); hashtable->put(&N1); } strcpy(N1.Key, "320"); strcpy(N1.FullName, "Murad"); strcpy(N1.Tele_No, "7231144"); N1.Salary = 19834.575; if(!hashtable->contains(N1.Key)) { cout << "
Adding node: "; disp(&N1); hashtable->put(&N1); } strcpy(N1.Key, "768"); strcpy(N1.FullName, "Hassan"); strcpy(N1.Tele_No, "7689876"); N1.Salary = 45124.755; if(!hashtable->contains(N1.Key)) { cout << "
Adding node: "; disp(&N1); hashtable->put(&N1); } strcpy(N1.Key, "756"); strcpy(N1.FullName, "Ali"); strcpy(N1.Tele_No, "9874545"); N1.Salary = 43554.125; if(!hashtable->contains(N1.Key)) { cout << "
Adding node: "; disp(&N1); hashtable->put(&N1); } dispAll(hashtable); strcpy(temp1,"314"); hashtable->remove(temp1); cout << "

After removing 314:" << endl; dispAll(hashtable); cout << "

Destroying hashtable:" << endl; delete hashtable; return 0; } void dispAll(Hashtable *hashtable) { NODE N1; cout << "

Current nodes in hashtable:" << endl; hashtable->initIterator(); while(hashtable->hasNext()) { hashtable->getNextKey(N1.Key); hashtable->get(&N1); disp(&N1); } } /* Program's output ****************** Adding node: Key: 389 FullName: Mariam Tele.: 8216734 Salary: 22123.267 Tax: 110.616335 Adding node: Key: 314 FullName: Zeki Tele.: 8765623 Salary: 98124.567 Tax: 110.616335 Adding node: Key: 320 FullName: Murad Tele.: 7231144 Salary: 19834.575 Tax: 110.616335 Adding node: Key: 768 FullName: Hassan Tele.: 7689876 Salary: 45124.755 Tax: 110.616335 Adding node: Key: 756 FullName: Ali Tele.: 9874545 Salary: 43554.125 Tax: 110.616335 Current nodes in hashtable: Key: 768 FullName: Hassan Tele.: 7689876 Salary: 45124.755 Tax: 225.623775 Key: 314 FullName: Zeki Tele.: 8765623 Salary: 98124.567 Tax: 490.622835 Key: 756 FullName: Ali Tele.: 9874545 Salary: 43554.125 Tax: 217.770625 Key: 389 FullName: Mariam Tele.: 8216734 Salary: 22123.267 Tax: 110.616335 Key: 320 FullName: Murad Tele.: 7231144 Salary: 19834.575 Tax: 99.172875 After removing 314: Current nodes in hashtable: Key: 768 FullName: Hassan Tele.: 7689876 Salary: 45124.755 Tax: 225.623775 Key: 756 FullName: Ali Tele.: 9874545 Salary: 43554.125 Tax: 217.770625 Key: 389 FullName: Mariam Tele.: 8216734 Salary: 22123.267 Tax: 110.616335 Key: 320 FullName: Murad Tele.: 7231144 Salary: 19834.575 Tax: 99.172875 Destroying hashtable: Key: 768 FullName: Hassan Tele.: 7689876 Salary: 45124.755 Tax: 225.623775 Key: 756 FullName: Ali Tele.: 9874545 Salary: 43554.125 Tax: 217.770625 Key: 389 FullName: Mariam Tele.: 8216734 Salary: 22123.267 Tax: 110.616335 Key: 320 FullName: Murad Tele.: 7231144 Salary: 19834.575 Tax: 99.172875 Process returned 0 (0x0) execution time : 0.162 s Press any key to continue. */ // : http://www.sharejs.com/codes/cpp/3985