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