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
- C语言实现 HashTable
- c语言实现hashtable
- C语言实现HashTable
- HashTable的c语言实现
- C 语言模仿实现HashTable
- C语言的HashTable简单实现
- HashTable的简单实现(C语言)
- C语言的HashTable简单实现
- C语言的HashTable简单实现
- c语言实现分析hashtable算法
- C语言的HashTable简单实现
- C#HashTable
- HashTable实现
- HashTable实现
- HashTable实现
- 实现HashTable
- hashtable实现 -- 参考leveldb hashtable
- [C++]数据结构:散列表HashTable的实现与简单应用
- 浅谈VB.NET中的接口
- Squid代理服务3.1版本的配置和使用简介
- 如何获取listview的内容高度
- windows系统下SVN服务器的搭建_2014年1月2日
- iOS中如何创建一个滑出式导航面板(1)
- C++ hashtable实现
- Android之ScaleGestureDetector(缩放手势检测)
- iOS中如何创建一个滑出式导航面板(2)
- Activity生命周期总结
- 如何改善 MySQL 数据装载操作效率的方法
- new String("abc")创建了几个对象
- js之分割取字符串
- vim常用命令
- C++箴言:声明为非成员函数的时机(转)