没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
一、题目序号及题目内容
7.杂凑表的设计与实现(难度系数:1.2)
问题描述:
针对本班的人名设计一个杂凑表,数据表的长度为 50~80 个记录;分析平均查找长度,完成相
应的建表和查表程序,设计直观的界面显示杂凑表的内容。
基本要求:
人名用汉语拼音表示,例如“陈伟津”表示为“chen weijin”。人名的长度不超过 19 个字符。字符
的取码方法可直接利用 C 语言中的 toascii 函数。
二、解决的思路
由于中国人的名字多以三个字居多,而且单字的拼音长度不超过 6 位,比如 zhuang(庄),所
以三个字的人名串长度最大为 18,在姓与名之间加空格刚好 19 个。
将全班人名用汉语拼音表示之后存入一个 name.txt 文件,每一个人名占用一行,方便输入、修
改跟读取。构造哈希表时,只需利用文件操作,即可获得人名信息,无需逐个重新录入。
为了构造哈希关键字,对 19 个字符中截取前 18 个,再将 18 个字符分成 3 组,每组各 6 个字符。
每一组的每一个字符都利用 toascii 函数转成 ASCII 码,只取该 ASCII 码的个位数,并按每组字符
的先后顺序组成 3 组 6 位的整数,不满六位的后面补零。比如字符串“ chen weijin”分组转 ASCII 后
为“941029”,“ 156500”和“000000”。再将所得的三个 6 位整数分别加上姓名串的串长,最后将所
得 的 三 个 6 位 数 相 加 。 即
941029+11=941040,156500+11=156511,000000+11=000011,941040+156511+000011=1097562。
所得 1097562 这个数就是关键字。
利用以上办法获得关键字,再使用哈希类提供的除留余数法和线性探查法,将关键字插入哈希
表并可以进行搜索操作。
三、算法思想
KeyType CharToNum(char name[NAMELENGHT]) //将 name 转为整数
{
int i=0,j=0,k=0;
int nameLen;
nameLen=GetNameLen(name);//单个名字的长度
KeyType temp=0;
for(i=0,j=0;i<3;i++)
{
for(k=0;k<6;k++,j++)
{
temp+=toascii(name[j])%10*pow(10,5-k);
}
temp+=+nameLen;
//将最多 NAMELENGHT 位的姓名拆分为 3 组 6 位的串,每位字符取其 ASCII 码的个位数,每组组成一
个 6 位的整数加上名字的长度,再将这 3 个 6 位整数相加得到结果关键字
}
for(i=0;i<NAMELENGHT;i++)
name[i]=' ';//清空名字数组,恢复原始状态,防止上一操作影响下一操作
1
return temp;
}
void BuildHash(HashTable &myTable,int &line)//创建哈希查找表
{ ifstream infile("name.txt",ios::in);//读方式打开文件
if(!infile)
{ cout<<"文件读取失败"<<endl;
abort(); //文件读取失败直接退出
}
char name[NAMELENGHT]="\0";
int j;
KeyType result=0;
cout<<"哈希表内容:"<<endl;
while(infile.getline (name,NAMELENGHT))//逐行读取文件
{ result=CharToNum(name);//获取名字转换后的数字(关键字)
myTable.Insert(result,line);//插入哈希表
line++;//统计文件行数
j=myTable.Find(result);//获取插入哈希表的位置
if(j>0)
{ DataType item=myTable.GetValue(j);
cout<<"j=";
cout<<setiosflags(ios::left)<<setw(7)<<j<<"ht[]="<<item.key<<endl;//设置对齐,不足补空格
}
}
cout<<"--------------------"<<endl<<endl;
infile.close();
}
四、实现的功能的描述
hash.cpp 包含以下操作:
int Check(char name[NAMELENGHT])//检查姓名输入的合法性,不合法返回 1,合法返回 0
int GetNameLen(char name[NAMELENGHT])//返回当个姓名的长度
KeyType CharToNum(char name[NAMELENGHT])//将姓名从汉语拼音转为整数,即求关键字
void BuildHash(HashTable &myTable,int &line)//创建哈希查找表
void PrintName(int line)//输出文件中的姓名,与要搜索的姓名进行匹配核对
void main()//主操作,主要包含创建哈希表,输入搜索的姓名与调用搜索函数功能
HashTable.h 包含以下操作:
int HashTable::Find(const DataType &x)const//哈希表的查找
int HashTable::Insert(const DataType &x,int pos)//哈希表的插入
int HashTable::Delete(const DataType &x)//哈希表的元素删除
DataType HashTable::GetValue(int i)const//取数据元素
int HashTable::IsIn(const DataType &x) //判断要搜索的元素是否已存在
2
int HashTable::GetPos(int x); //输出找到的元素的所在位置
五、数据结构的说明
Data 域存储关键字,info 域存储状态标识,position 存储姓名在文件中的位置。
六、主程序的流程图和主要功能模块流程图及说明
3
剩余12页未读,继续阅读
资源评论
- 无敌小巨蛋2013-12-07有一些作用,谢谢分享。
- u0106668992013-12-11对算法有详细的介绍,让人一看就懂
- qq5250912112013-10-21对于题目的评析比较完整
cwj2009
- 粉丝: 31
- 资源: 25
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功