[C++]第六次作业:编写一个哈希(Hash)表类

//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;
}

阅读更多
个人分类: C++学习(原创)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭