C++ hashtable实现

来源:互联网 发布:君将哀而生之乎 编辑:程序博客网 时间:2024/05/20 22:38
//A simple example of hashtable#include <iostream>#include <cstdlib>#include <cstring>#include <iomanip>#define SIZE_KEY       16#define SIZE_VALUE1    64#define SIZE_VALUE2    16#define DEFAULT_TABLESIZE    101using 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; i<table_size; i++)   {      table[i] = NULL;   }} Hashtable::~Hashtable(){   removeAll();   delete[] table;} void disp(NODE *N1){ cout << "\nKey:      " << N1->Key << "\nFullName: "      << N1->FullName <<"\nTele.:    " << N1->Tele_No << "\nSalary:   "      << setprecision(12) << N1->Salary<< "\nTax:      " << 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; i<table_size; i++)   {      NODE* temp = table[i];      while(temp != NULL)      {         NODE* next = temp->next;         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; i<n; i++)   {      //To get almost fair distributions of nodes over the array      h = (h << 3) ^ Key[i];   }    return abs(h % table_size );}//end hashString void Hashtable::initIterator(){//start initIterator   current_entry = NULL;   current_index = table_size;   for(int i=0; i<table_size; i++)   {      if(table[i] == NULL)      {          continue;      }      else      {         current_entry = table[i];         current_index = i;         break;      }   }}//end initIterator bool Hashtable::hasNext(){   if(current_entry == NULL)   {      return false;   }   else   {      return true;   }}void Hashtable::getNextKey(char* Key){   if(current_entry == NULL)   {      Key[0] = '\0';      return;   }   strcpy(Key, current_entry->Key);   if(current_entry->next != NULL)   {      current_entry = current_entry->next;   }   else   {     for(int i=current_index+1; i<table_size; i++)     {        if(table[i] == NULL)        {           continue;        }        current_entry = table[i];        current_index = i;        return;     }     current_entry = NULL;     current_index = table_size;   }} void dispAll(Hashtable* hashtable); int main(){   char temp1[SIZE_KEY];   Hashtable* hashtable = new Hashtable();    NODE N1("389","Mariam","8216734",22123.267);    if(!hashtable->contains(N1.Key))   {      cout << "\nAdding 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 << "\nAdding 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 << "\nAdding 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 << "\nAdding 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 << "\nAdding node:  ";      disp(&N1);      hashtable->put(&N1);   }    dispAll(hashtable);     strcpy(temp1,"314");   hashtable->remove(temp1);   cout << "\n\nAfter removing 314:" << endl;   dispAll(hashtable);   cout << "\n\nDestroying hashtable:" << endl;   delete hashtable;   return 0;} void dispAll(Hashtable *hashtable){        NODE N1;   cout << "\n\nCurrent nodes in hashtable:" << endl;   hashtable->initIterator();   while(hashtable->hasNext())   {      hashtable->getNextKey(N1.Key);      hashtable->get(&N1);      disp(&N1);   }} /*Program's output******************Adding node:Key:      389FullName: MariamTele.:    8216734Salary:   22123.267Tax:      110.616335 Adding node:Key:      314FullName: ZekiTele.:    8765623Salary:   98124.567Tax:      110.616335 Adding node:Key:      320FullName: MuradTele.:    7231144Salary:   19834.575Tax:      110.616335 Adding node:Key:      768FullName: HassanTele.:    7689876Salary:   45124.755Tax:      110.616335 Adding node:Key:      756FullName: AliTele.:    9874545Salary:   43554.125Tax:      110.616335  Current nodes in hashtable: Key:      768FullName: HassanTele.:    7689876Salary:   45124.755Tax:      225.623775 Key:      314FullName: ZekiTele.:    8765623Salary:   98124.567Tax:      490.622835 Key:      756FullName: AliTele.:    9874545Salary:   43554.125Tax:      217.770625 Key:      389FullName: MariamTele.:    8216734Salary:   22123.267Tax:      110.616335 Key:      320FullName: MuradTele.:    7231144Salary:   19834.575Tax:      99.172875  After removing 314:  Current nodes in hashtable: Key:      768FullName: HassanTele.:    7689876Salary:   45124.755Tax:      225.623775 Key:      756FullName: AliTele.:    9874545Salary:   43554.125Tax:      217.770625 Key:      389FullName: MariamTele.:    8216734Salary:   22123.267Tax:      110.616335 Key:      320FullName: MuradTele.:    7231144Salary:   19834.575Tax:      99.172875  Destroying hashtable: Key:      768FullName: HassanTele.:    7689876Salary:   45124.755Tax:      225.623775 Key:      756FullName: AliTele.:    9874545Salary:   43554.125Tax:      217.770625 Key:      389FullName: MariamTele.:    8216734Salary:   22123.267Tax:      110.616335 Key:      320FullName: MuradTele.:    7231144Salary:   19834.575Tax:      99.172875 Process returned 0 (0x0)   execution time : 0.162 sPress any key to continue.*///该代码片段来自于: http://www.sharejs.com/codes/cpp/3985

0 0
原创粉丝点击