《数据结构》课程设计报告书

发布 2022-10-05 19:56:28 阅读 6463

利用hash技术统计c源程序中的关键字出现的频度。

班级: 计算机

姓名。指导教师。

成绩。清华大学计算机系。

2012 年 12 月 31 日。

目录。一、题目描述 1

1.1问题描述 1

1.2实现要求 1

二、题目分析 1

2.1hash函数 1

2.2关键技术 2

2.3利用hash函数统计c源程序中关键字出现频度的设计思想 2

2.4处理冲突的方法 3

三、设计思路 3

3.1设计图示 3

3.2函数功能说明 4

3.2函数功能说明 5

四、关键部分实现细节 5

五、调试分析 8

六、程序运行结果 9

七、心得体会 11

参考文献 11

扫描c源程序,利用hash技术统计该源程序中的关键字出现的频度。

先用hash表存储c语言中32个关键字,再扫描c源程序取出每个单词,利用hash查找技术统计该程序中的关键字出现的频度。发生hash冲突用线性探测法解决。设hash函数为:

hash(key)=[key的第一个字母序号)*100+(key的最后一个字母序号)] mod 41。

hash函数就是把任意长度的输入通过散列算法,变换成固定长度的输出的一种转换。该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一地确定输入值。

hash函数主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的编码里。因此也可以说,hash函数就是一种数据内容和数据存放地址之间的映射关系。

统计c源程序中关键字出现的频度,主要分为这样几个关键技术:

是选择合适的hash函数。常用的hash函数有直接定址法、除留余数法、数字分析法、平方取余法等众多种类,分别适合不同的问题要求。hash函数选择的好坏对发生冲突的概率有着很大影响,因而在很大程度上影响程序运行的效率。

是如何将所有关键字使用hash函数存入比较数组中。是字符串模式匹配技术。即如何在众多程序**中选择出c语言的关键字。

是文件输入输出技术。这是整个方法的前提,即需要统计关键字个数的c源程序必须从文件中读入,才能进行处理。处理后的结果还需要写入文件中进行保存。

使用hash技术必须首先选择hash函数。基于对问题的分析,在此我们选用除留取余法建立hash函数。因为直接定址法虽然简单但会造成内存单元的大量浪费,而数字分析法、平方取中法等方法过于复杂,本身对时间资源的消耗过大,在本问题中使用并不值得。

我们建立的hash函数为:

hash(key)=[key的第一个字母序号)*100+(key的最后一个字母序号)]%41

其中key为关键字,在本问题中为c源程序的关键字。c语言关键字是c语言的保留的一些单词,这些单词都有了固定的意义和用途,不可以作为变量或者自定义类型或类名来使用。其特点是都有小写字母构成。

定义一个多维数组,数组第一行存放关键字,数组第二行存储hash函数处理后关键字结点地址,用hash函数存储关键字。

选择再好的hash函数也有出现冲突的可能,因此还必须选择一种解决hash冲突的方法。处理冲突的方法一般有开放定址法、线性探测法、二次探测法、链地址法等。为了简单起见,我选择了线性探测法,即当发生冲突时,从冲突发生位置的下一个位置起,依次寻找空的hash地址,如果该地址为空,就把该关键字存入相应的地址中。

图1函数层次调用图。

int open(char *filename)——打开含关键字的cpp文件。

int findhash(char *keyword)——在hash表中查找关键字找出关键字位置。

int creathash(char *keyword)——建立hash表,keyword是一个数组。

int insert(int key) —在hash表中插入关键字。

void menu()—现实菜单。

void printscreen(int key)——输出关键字。

int letternot(char ch)——判断单词是否扫描结束。

int keywordsnot(char *word)——判断是否为关键字。

int gethashvalue(char *keyword)——得到关键字的哈希函数值。

int open(char *filename)

char word[maxlength],ch;

int i;

file *read指向file类的指针*read

if((read=fopen(filename,"r"))null) /只读方式读取文件,如果为空。

while(!feof(read判断文件是否结束,到末尾函数值为"真"即非0

word[i]='0';

if(keywordsnot(word))

fclose(read);

printf("文件中关键字已经存入表中,请继续!")

int findhash(char *keyword) /在hash表中查找关键字。

int key,find,findcoll=0;

if(!keywordsnot(keyword)) 是否关键字。

return -1;

key=gethashvalue(keyword);

if(strcmp(test[key].keyword,keyword)==0)

return key;

for(find=key+1;find线性探测法。

findcollfindcoll统计冲突次数。

if(strcmp(test[find].keyword,keyword)==0)

for(find=0;find

return -1;

int creathash(char *keyword) /建立hash表,keyword是一个数组。

int key;

if(!keywordsnot(keyword)) 判断是否关键字。

return -1

数据结构课程设计报告书

2010 年 12 月 28 日。设计实现稀疏矩阵的基本功能,例如稀疏矩阵的相加,相减,相乘,转置等。采取的方法有三元组和十字链表来进行实现。要求运行无误,基本功能实现良好。简要说明设计方案 需要设计哪些类,以及类和类之间的关系 利用三元组实现 主要需要设计一个矩阵类和一个三元组类。将三元组做为矩阵...

《数据结构》课程设计报告书

数据结构 课程设计报告。报告 题目1.迷宫问题。2.哈夫曼编码。作者所在系部 计算机科学与工程系。作者所在专业网络工程。作者所在班级b08522 作者姓名马洪彪。作者学号20084052227 指导教师姓名贾振华。完成时间2009年12月31日。北华航天工业学院教务处制。课程设计任务书。摘要。本次课...

数据结构课程设计报告书

课程设计说明书。设计名称 数据结构课程设计 题目 用迷宫算法对数组中的聚点数进行统计学生姓名 专业 10网络工程。班级 2班。学号 2010394201 指导教师 日期 2012年3月3日。课程设计任务书。目录。一 设计题目1 二 主要内容1 2.1设计思想1 2.2程序截图1 2.3算法流程图4 ...