没有整动态内存,静态hash凑乎看吧
#include <bits/stdc++.h> using namespace std; typedef char* Elemtype; typedef int Status; typedef Elemtype KeyType; struct HashTable { char elem[100][100]; int count; int sizeindex; }; #define SUCCESS 1 #define UNSUCCESS 0 #define DUPLICATE -1 int hashsize[500]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,51}; const char NULLKEY = '\0'; int getHash(char *s,HashTable &H) { return (s[0]-'a')*2%hashsize[H.sizeindex]; } Status EQ(Elemtype K,Elemtype to) { return !strcmp(K,to); } void collision(int &p , int cnt,HashTable H) { p = (p+cnt)%hashsize[H.sizeindex]; } Status SearchHash(HashTable H,KeyType K,int &p,int &c) { p = getHash(K,H); while(H.elem[p][0]!=NULLKEY && !EQ(K,H.elem[p])) { collision(p,++c,H); } if(EQ(K,H.elem[p]))return SUCCESS; return UNSUCCESS; } Status InsertHash(HashTable &H,Elemtype e) { cout<<e<<':'<<' '; int c = 0 , p; if(SearchHash(H,e,p,c)) {cout<<111<<endl;return DUPLICATE;} else if(c<hashsize[H.sizeindex]/2){ cout<<p<<' '; for(int i = 0 ; i <= strlen(e) ; i++) H.elem[p][i]=e[i]; ++H.count; cout<<"Success"<<endl; return 1; } cout<<000<<endl; return 0; } int main() { char s[1000]; HashTable H; H.sizeindex = 11; H.count = 0; memset(H.elem,0,sizeof(H.elem)); srand((int)time(NULL)); for(int i = 0 ; i <20;i++) { int length = rand()%30; for(int j = 0 ; j < length;j++) { s[j] = rand()%26+'a'; } s[length] = '\0'; cout<<s<<endl; InsertHash(H,s); } cout<<"+++++++++++++++++++"<<endl; for(int i = 0 ; i < hashsize[H.sizeindex] ;i ++) { if (H.elem[i][0]) { int p;int c = 0; SearchHash(H,H.elem[i],p,c); cout << i<<' '<<H.elem[i] << ' '<<p<<endl; } } return 0; }