这个版主确实不错!
在什么地方都能看见她的回贴!我也支持!!!
1。谢谢你支持。 2。我是男的。 3。我是纯粹无聊才在论坛狂灌水。 4。只有我不够啊,我技术有限,帮不了太多人。
#include<iostream> #include<string> #include<fstream> using namespace std;
const int HashMaxSize = 350; //hash表大小 const int ItemsAmount = 425; //数据数量
void Input(string data[]) { ifstream hashdata("e:\\data.txt"); //打开data.txt for(int i=0; i<ItemsAmount; i++) { hashdata>>data[i]; } }
int Hash(string data,int m) //hashing函数 { int P=5; //取prime=5 int c=6; //取任意c=6 unsigned int temp; unsigned int h=0; //类加变量 for(int i=0; i<data.length(); i++) { temp=(int)data[i]*P+c; //data[i]是字符串里的each字符 h+=temp; //把data[i]算式的int值累加到h上 } return h%m; //取模 }
struct LNode{ //单结点结构 string data; LNode* next; };
class HashList { private: LNode* HT[HashMaxSize]; //指针数组
public: void InitHashList(); //初始化hash表 int Insert(HashList &hl,string data[]); //插入数据 string* Search(HashList hl,int m,string item); //查找元素 };
void HashList::InitHashList() { for(int i=0; i<HashMaxSize; i++) HT[i]=NULL; //把每个指针数组的头结点都赋初值 }
int count[HashMaxSize]; //链结点记数变量
int HashList::Insert(HashList &hl,string data[]) { int key[ItemsAmount]; //键值
for(int i=0; i<ItemsAmount; i++) { key[i] = Hash(data[i],HashMaxSize); //计算键值
//新建临时结点p储存hash数据 LNode* p=new LNode; if(p==NULL) //当内存用完返回0 return 0; p->data=data[i]; p->next=hl.HT[key[i]]; hl.HT[key[i]]=p;
count[key[i]]++; //加结点后记数变量+1 } return 1; }
string* HashList::Search(HashList hl,int m,string item) { int d=Hash(item,m); LNode* p=hl.HT[d]; while(p!=NULL) { if(p->data==item) //string比较 return &(p->data); else p=p->next; } return NULL; }
void main() { HashList hl; hl.InitHashList();
string data[ItemsAmount]; Input(data); if(hl.Insert(hl,data)==0) exit(1);
//analyze the efficiency unsigned int efficiency[HashMaxSize]; for(int i=0; i<HashMaxSize; i++) efficiency[count[i]]++;
//improve hashing scheme if collisions is excessive. for(int j=0; j<HashMaxSize; j++) cout<<efficiency[i]<<" ";
cout<<endl; //to improve youself please
char judge; string seek; cout<<"do you want to search for words?(Y/N)"; cin>>judge; while(1) { if(judge=='y') { cout<<"input the words you want:"; cin>>seek; string* temp=hl.Search(hl,HashMaxSize,seek); if(temp!=NULL) cout<<temp<<"\nthe word exist"<<endl; }
else break; } }
楼上的是完成的,就是包括了题目要求的功能(如果我没理解错题意的话),但是我没有调试过,就是说我不知道会不会出错,但是大概就是这样做了,还可以做得好一点,不过,楼主同志,我们广州现在的时间是凌晨1点40分,我好累了,唉,以后都不多事了,如果不是答应帮你,我都不想写下去了,现在已经没心机调试。
告诉你我帮你的原因吧,我开始的时候以为你是“林迪”,他是广州某电台的一个DJ,我也喜欢听他节目,所以,不过没关系,我也想看一下散列表的操作。
散列表,又称哈希表,hash,有两种方法解决冲突问题,一种是线性探查法,一种是链接法,题目要求用后者——“dynamic linked list version”,也幸好用后者,因为我看不懂前者,呵呵,反正我就很累很累,不帮你调试了,本来想讲解一下散列表的,不过我快挂了。
最后申明,下不为例!!!