//Hash.h
#include <string>
using namespace std;
/*
设 Hash 函数为:
Hash (key) = [ 字符串所有字母的ASCII码的和 ] MOD 51
*/
class HashElem {
public:
HashElem():Empty(0){}
string Str;
int Empty;
HashElem *pNext;
};
class Hash {
public:
Hash():_Length(0){};
bool SearchHash(const string);
int LetterSum(const string);
void Insert(const string);
bool Remove(const string);
private:
HashElem _Elem[50];
int _Length;
};
//Hash.cpp
#include "Hash.h"
int Hash::LetterSum(const string str)
{
int Sum = 0;
for (int i=0; i < str.size(); i++)
Sum += str[i];
return Sum;
}
void Hash::Insert(const string s)
{
int num= LetterSum(s) % 51;
if ( _Elem[num].Empty )
{
HashElem *p = _Elem[num].pNext;
while (p) { p = (*p).pNext; }
p = new HashElem;
(*p).Empty = 1;
(*p).Str = s;
(*p).pNext = 0;
_Length++;
}
else
{
_Elem[num].Empty = 1;
_Elem[num].Str = s;
_Elem[num].pNext = 0;
_Length++;
}
}
bool Hash::SearchHash(const string s)
{
int num= LetterSum(s) % 51;
HashElem *p = &_Elem[num];
while (p)
{
if ( (*p).Str == s ) return 1;
p = (*p).pNext;
}
return 0;
}
bool Hash::Remove(const string s)
{
int num= LetterSum(s) % 51;
HashElem *p = &_Elem[num];
HashElem *pr = 0;
while (p)
{
pr = p;
if ( (*p).Str == s )
{
if ( (*p).pNext )
(*pr).pNext = (*p).pNext;
else (*pr).pNext = 0;
(*p).Str = "";
_Length--;
return 1;
}
p = (*p).pNext;
}
return 0;
}
/*
说明:
本题,我参考了《数据结构》中关于“哈希表类”的相关算法,
由于时间问题,并未在涉及参考相关算法的代码部分做标记。
完成本题总共花费时间大约40分钟,程序未经完善。
1. 编写一个哈希(Hash)表类,以字符串作为关键字存放和查找记录,
提供公共成员函数进行哈希表的记录插入、查询和删除。
并在main函数中测试对该类的使用。
*/
#include "Hash.h"
#include <iostream>
using namespace std;
void main()
{
Hash NewHash;
NewHash.Insert("Good");
NewHash.Insert("Bad");
cout << NewHash.SearchHash ("Good") <<endl;
NewHash.Remove("Good");
cout << NewHash.SearchHash ("Good") <<endl;
}
/*
2.读下列程序段,请写出该程序执行时各构造函数的调用顺序。
*/
/*
顺序如下:
SynAntonym(char* s)
String()
Word(char *s,int cnt=0)
String(char* s)
String()
SynAntonym(char* s1,char* s2,char* s3)
String(char* s)
Word(char *s,int cnt=0)
String(char* s)
String(char* s)
String(char* s)
*/
#include <iostream>
using namespace std;
class String{
public:
String(){ str=0; }
String(char* s){
len = strlen(s);
str = new char[len+1];
strcpy(str,s);
}
String(const String& S){
len = S.len;
str = new char[len+1];
strcpy(str,S.str);
}
~String(){ delete str;}
private:
int len;
char* str;
};
class Word{
public:
Word(char *s,int cnt=0):name(s),occurs(cnt){}
Word(String& s,int cnt=0):name(s),occurs(cnt){}
private:
int occurs;
String name;
};
class SynAntonym
{
public:
SynAntonym(char* s):wd(s){ }
SynAntonym(char* s1,char* s2,char* s3):wd(s1),synonym(s2),antonym(s3){};
~SynAntonym(){};
private:
String synonym;
Word wd;
String antonym;
};
void main()
{
SynAntonym sa1("repine");
SynAntonym sa2("cause","origin","effect");
}
/*
3. 分析下列程序可能存在的问题。
*/
#include <iostream>
using namespace std;
class String{
public:
String(char* s)
{
len = strlen(s);
str = new char[len+1];
strcpy(str,s);
}
String(const String& S)
{
len = S.len;
str = new char[len+1];
strcpy(str,S.str);
}
String(){ }
~String(){ delete str; }
private:
int len;
char* str;
};
class Word{
public:
Word(char *s,int cnt=0):name(s),occurs(cnt){}
Word(String& s,int cnt=0):name(s),occurs(cnt){}
/*
将下面的语句改为:
Word(const Word& w)
{
occurs = 0;
name = w.name;
}
*/
Word(const Word& w):name(w.name),occurs(0){}
private:
int occurs;
String name;
};
void main()
{
Word weather("warm");
Word feeling = weather;
}