资源简介
1)、先用Hash表存储c语言中32个关键字,再扫描c源程序取出每个单词,利用Hash查找技术统计该程序中的关键字出现的频度。发生Hash冲突用线性探测法解决。设Hash函数为:
Hash(key)=[(key的第一个字母序号)*100+(key的最后一个字母序号)] MOD 41。
(2)、用顺序表存储c语言中的关键字,把c源程序取出每个单词利用二分查找技术统计该程序中的关键字的出现频度。
代码片段和文件信息
#include
#include /* malloc()等 */
#include /* EOF(=^Z或F6)NULL */
#include /* atoi() */
#include /* floor()ceil()abs() */
typedef int Status; /* Status是函数的类型其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型其值是TRUE或FALSE */
typedef char ElemType;
#define TOTAL 32 //32个关键字
#define MAXLEN 10 //关键字长度
#define HASHLEN 41 //哈希表长度
int cont=0; //统计哈希表中的关键字个数
#define LIST_INIT_SIZE 100 /* 线性表存储空间的初始分配量 */
#define LISTINCREMENT 10 /* 线性表存储空间的分配增量 */
typedef struct
{
ElemType *elem; /* 存储空间基址 */
int length; /* 当前长度 */
int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */
}SqList;
typedef struct HASH //哈希表
{
char keyword[MAXLEN];
int count; //出现次数(频度)
int con; //冲突次数
};
HASH HS[HASHLEN];
char KeyWords[TOTAL][MAXLEN]= //构造二维数组存储32个关键字
{
“auto““break““case““char““const““continue“
“default““do““double““else““enum““extern“
“float““for““goto““if““int““long““register“
“return““short““signed““sizeof““static“
“struct““switch““typedef““union““unsigned“
“void““volatile““while“
};
void ResetHX() //重置哈希表,
{
int i;
for(i=0;i {
strcpy(HS[i].keyword““); //不能用等号赋值
HS[i].count=0;
HS[i].con=0;
}
}
void jiemian()
{
printf(“\n“);
printf(“\n“);
printf(“\t========1.读取一个文件===========================================\n“);
printf(“\t========2.输出Hash表(关键字总数,冲突次数)=======================\n“);
printf(“\t========3.查询某关键字在Hash表中的情况===========================\n“);
printf(“\t========4.显示Hash表中的冲突关键字===============================\n“);
printf(“\t========5.显示C语言关键字的Hash函数值(作为对照)==================\n“);
printf(“\t========6.返回主页===============================================\n“);
printf(“\t========7.退出===================================================\n“);
}
int isLetter(char ch) //判断是否是字母,因为关键字都是英文单词
{
if( (ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘) ) return 1;
else return 0;
//是字母就返回1,否则返回0值
}
int isKeyWords(char *word) //判断是否关键字
{
int i;
for(i=0;i if(strcmp(wordKeyWords[i])==0)
return 1;
}
int GetKey(char *keyword) //哈西函数
{ //Hash函数为:Hash(Key)=[(Key的首字母序号)*100+(Key的尾字母序号)] Mod 41
return ( keyword[0]*100+keyword[strlen(keyword)-1] ) % 41;
}
int FindHX(char *keyword) //查找哈希表,分块查找
{
int keyfindtem=0;
if(!isKeyWords(keyword)) return -1;
key=GetKey(keyword);
if(strcmp(HS[key].keywordkeyword)==0) return key;
for(find=key+1;find { //线性探查法顺序查找哈希表中是否已存在关键字
tem++; //统计冲突次数
if(strcmp(HS[find].keywordkeyword)==0)
{
HS[find].con=tem;
return find;
}
}
for(find=0;find {
tem++;
if(strcmp(HS[find].keywordkeyword)==0){
HS[find].con=tem;
return find; }
}
}
int GetFreePos(int key) //在哈希表中给关键字找个位置插进去
{
int findtem=0;
if(key<0||key>=HASHLEN) return -1;
for(find=key+1;find {
tem++;
if(strlen(HS[find].keyword)==0){
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2011-06-15 11:24 课程设计\
文件 486 2011-06-04 16:10 课程设计\guanjianzi.txt
文件 13138 2011-06-15 10:00 课程设计\利用Hash技术统计C源程序中关键字9.cpp
文件 397810 2011-06-15 10:37 课程设计\数据结构课程设计报告格式.docx
- 上一篇:职工信息管理系统C 链表
- 下一篇:C++ primer 第三版习题答案
评论
共有 条评论