c++哈希表的制作

最近参加工作了,以前整天从博客园抄一些东西,现在我也发一点自己的东西吧,就算给后来者一个参考,也给自己一个纪念。不好勿喷。

/***************************************************************************
* xcl 2012.2.18 *
* HashTable *
* 说明:本哈希表采用线性散列处理冲突,哈希函数为素数取模运算 *
**************************************************************************
*/


#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream>
#include <cstdlib>
#include <time.h>



using namespace std;

#define add_scope 11 //地址范围
int hash(int key) //处理键值
{
return (key*3)%11;
}

typedef int KeyType,ValType,StatusType; //定义类型
//实际数据结构-----------------------------
typedef struct{

KeyType key;

ValType val;

StatusType stat;

}Element;

//实现类------------------------------------
class MyList
{
public:
MyList(int n);
~MyList();

public:
void SetKey(int key,int val);
void DeleteKey(int key);
int SearchKey(int key);
int GetMapSize();
void ShowList();

private:
Element *elem;
int hash_size;
int dataNum;
};

//-----------------------------------------
MyList::MyList(int n)
{
hash_size = n;
elem = new Element();
dataNum = 0;
for(int i=0;i < n;i++)
{
elem[i].key = 0;
elem[i].val = 0;
elem[i].stat = 0;
}
}

//------------------------------------------
MyList::~MyList()
{
delete[] elem;
}

//------------------------------------------
void MyList::SetKey(int key,int val)
{
int pos;
if(hash_size==dataNum)
{
cout << "OverFlow~~~~" <<endl;
}
pos=hash(key);
for(int i=0;i<hash_size;i++)
{
if(elem[pos].stat == 0)
{
elem[pos].key=key;
elem[pos].val=val;
elem[pos].stat=1;
dataNum++;
cout << "KeySet Success! "<<elem[pos].key<<"\t"<<elem[pos].val<<"\t"<<pos <<endl;
return;
}
else
{
pos=(pos+1)%hash_size;
}
}
cout << "Insert Key Failed~~" <<endl;

}

//--------------------------------------------
int MyList::SearchKey(int key)
{
int pos = hash(key);
int stat = elem[pos].stat;
int num=1;
while(stat!=0 && num<dataNum)
{
if(elem[pos].key == key)
{
return pos;
}
else
{
pos=(pos+1)%hash_size;
stat=elem[pos].stat;
num++;
}
}
return hash_size; //防止冲突
}

//---------------------------------------------
void MyList::DeleteKey(int key)
{
int pos=SearchKey(key);
if(pos==hash_size)
{
cout << "Cannot found the key! Please check out your insert!" << endl;
}
else
{
elem[pos].key=0;
elem[pos].val=0;
elem[pos].stat=0;
dataNum--;
cout << "Delete Success~~" <<endl;
}
}

//-------------------------------------------------
int MyList::GetMapSize()
{
return dataNum%hash_size;
}

//------------------------------------------------
void MyList::ShowList()
{
if(dataNum == 0)
{
cout<<"The Table is NULL"<<endl;
return;
}
cout << "There are "<< dataNum <<" nums in the HashTable!" << endl;
cout<<"************HashTable****************"<<endl;
cout<<"key value position"<<endl;
for(int i = 0; i<hash_size;i++)
{
if(elem[i].stat == 0)
continue;
else
cout<<elem[i].key<<"\t\t"<<elem[i].val<<"\t\t"<<i <<endl;
}
cout<<"***************************************"<<endl;
}

//获取随即的key与val---------------------------------
void GetRdmKey(int *key)
{
srand((unsigned)time(NULL));
for(int i=0;i<6;i++)
{
key[i]=rand()%90+10;
}
}

void GetRdmVal(int *val)
{
srand((unsigned)time(NULL));
for(int i=0;i<6;i++)
{
val[i]=rand()%900+100;
}
}



//---------------------------------------
int main(int argc, char *argv[])
{
char flag;
int inKey,inVal,delKey;
//初始化部分随机数据
int *key,*val;
key=(int*)malloc(6*sizeof(int));
val=(int*)malloc(6*sizeof(int));
GetRdmKey(key);
GetRdmVal(val);
//写入哈西表
MyList *list=new MyList(add_scope);
cout << "Inatiating the HashTable Randomly......" <<endl;
sleep(1);
cout << "Result\t\t Key\tValue\tPosition\t"<<endl;
for(int i=0;i<6;i++)
{
list->SetKey(key[i],val[i]);
}

do
{
//选择操作项
cout << "\n/*chose the operate*/"<<endl;
cout <<"Q:exit. I:insert. D:delete. S:show."<<endl;
cin >>flag;
if(flag=='Q'||flag=='q')
exit(1);
else if(flag=='D'||flag=='d')
{
cout <<"please insert the key you want del:";
cin >> delKey;
list->DeleteKey(delKey);
}
else if(flag=='I'||flag=='i')
{
cout <<"please insert the new Key and new Value:";
cin >> inKey >> inVal;
list->SetKey(inKey,inVal);
}
else if(flag=='S'||flag=='s')
{
system("clear");
list->ShowList();
}
}while(1);
}

以上代码在linux平台下,kdevelop环境中编写,测试通过。

还有,希望看到这篇文章的朋友,能帮我点一下这个链接,帮朋友个忙。http://www.2345.com/?kdevelop点开以后最好还能再点一下别的,谢谢大家。

posted on 2012-03-06 19:58  Magi  阅读(1749)  评论(2编辑  收藏  举报