首页 > 试题

请输入关键字

更新时间:2025-12-12 05:42:08 阅读: 评论:0

蹄膀-养鱼塘


2023年3月4日发(作者:羊肉火锅做法)

/*预处理部分*/

#include

#include

#include

#define OK 1

#define ERROR 0

#define MIN -842150451 //初值

#define MB -800000000 //墓碑



/*结构类型定义部分*/

typedef int Status; //定义状态函数类型

typedef int KeyType; //定义关键字类型

typedef int InforType; //定义信息类型

typedef struct {

KeyType *colral; //关键字数组

int ba; //栈底下标

int rear; //栈顶下标

}Stack; //关键字栈

typedef struct {

KeyType key; //关键字

InforType infor; //信息数据

}RedType; //数据结点

typedef struct {

int length; //数据结点个数

int sizeindex; //哈希查找表长度

double load_factor; //装填因子

RedType *hashsize; //哈希查找表

int count; //当前比较总次数

Stack CL; //关键字栈

}HashTable; //哈希表

HashTable HT; //全局变量



/*函数声明部分*/

int Hash (KeyType key);

int In (KeyType key);

void CreateHashTable ();

void PrintHashTable ();

Status SearchHashTable (KeyType key);

Status InrtHashTable (KeyType key);

Status DeleteHashTable (KeyType key);

void ASLofHashTable ();



/*函数定义部分*/

int Hash (KeyType key) {

int a=0;

a=key%10000; //取6位数关键字的后4位数

a=(a*a)%dex+1; //哈希函数给出的位置

return a; //返回可能的插入位置

} //end Hash

int In (KeyType key) {

//检测关键字key是否在关键字栈中

int i=0;

for (i=1;i<;i++) {

if (key==[i]) return 1;

}

return 0;

} //end In

void CreateHashTable () {

//创建哈希表

int i=0,a=0,j=0;KeyType key;

printf ("注:关键字为6位数.
");

printf ("请输入数据结点的个数:");

scanf ("%d",&);

printf ("请输入哈希表的初始装填因子(在区间(0,1)中):");

scanf ("%lf",&_factor);

dex=(int)(/_factor);

ze=(RedType *)malloc ((dex+1)*sizeof (RedType)); //动态分配哈希查找表,0号未用

=(KeyType *)malloc ((+2)*sizeof (KeyType)); //动态分配关键字数组,以便防止关键字重复,0号未用

==1;

for (i=1;i<=;i++) {

key=rand ()+100000; //将随机数变换为6位数,作为关键字

while (In (key)==1) {

key=rand ()+100000;

}

[++]=key;

a=Hash (key);

for (j=a;(ze[j].key!=MIN)&&(ze[j].key!=MB);j=j%dex+1) {

++;

}

++;

ze[j].key=key; //插入哈希查找表

}

} //end CreateHashTable

void PrintHashTable () {

//显示哈希表

int i=0,num=0;

printf ("注:6位数为关键字,括号中的数为在哈希查找表中的位置下标.
");

for (i=1;i<=dex;i++) {

if ((ze[i].key!=MIN)&&(

ze[i].key!=MB)) {

num++; //记录输出个数

if (i<10) printf ("%d( %d) ",ze[i].key,i);

el if (i<100) printf ("%d( %d) ",ze[i].key,i);

el if (i<1000) printf ("%d( %d) ",ze[i].key,i);

el printf ("%d(%d) ",ze[i].key,i);

if (num%5==0) printf ("
"); //使输出样式一致

}

}

if (num%5!=0) printf ("
");

} //end PrintHashTable

Status SearchHashTable (KeyType key) {

//查找

int i=0,j=0,num=0,a=0;

a=Hash (key);

for (i=1,j=a;(i<=dex)&&(key!=ze[j].key);j=j%dex+1,i++) {

num++;

}

num++;

if (i>dex) {printf ("查找失败,关键字比较次数为:%d
",num-1);return ERROR;}

el {printf ("查找成功,关键字比较次数为:%d,记录的存储位置为:%d
",num,j);return OK;}

} //end SearchHashTable

Status InrtHashTable (KeyType key) {

//插入“新纪录”的关键字

int i=0,a=0,j=0;

for (i=1;i<;i++) { //在关键字栈中查找

if (key==[i]) {printf ("此关键字已存在,操作无法进行.
");return ERROR;}

}

if (==+1) { //栈满,需重分配空间

=(KeyType *)realloc (,(+3)*sizeof (KeyType));

}

[++]=key;++; //数据个数加1

if (>dex) { //哈希查找表满,需重分配空间

dex++; //哈希查找表长度加1

ze=(RedType *)realloc (ze,(dex+1)*sizeof (RedType));

}

_factor=(double)/(double)dex; //计算装填因子

a=Hash (key);

for (j=a;(ze[j].key!=MIN)&&(ze[j].key!=MB);j=j%dex+1) {

++;

}

++;

ze[j].key=key; //插入哈希查找表

printf ("此关键字不存在,插入成功.
");

return OK;

} //end InrtHashTable

Status DeleteHashTable (KeyType key) {

//删除“已有纪录”

int i=0,a=0,j=0;

for (i=1;(key!=[i])&&(i<);i++) {} //在关键字栈中查找

if (i==) {printf ("此关键字不存在,无法进行删除操作.
");return ERROR;}

for (a=i+1;a<;a++) { //删除关键字栈中的相应纪录的关键字

[a-1]=[a];

}

--; //修改栈顶下标

--; //修改数据个数

_factor=(double)/(double)dex; //修改装填因子

a=Hash (key);

for (j=a;key!=ze[j].key;j=j%dex+1) {

--;

}

--;

ze[j].key=MB; //做墓碑标记

printf ("此关键字存在,删除成功.
");

return OK;

} //end DeleteHashTable

void ASLofHashTable () {

//计算哈希表的平均查找长度,假定各数据查找概率一样

double a=0.0;

a=(double)/(double);

printf ("该哈希表的ASL为:%lf
",a);

} //end ASLofHash

Table



/*主函数部分*/

void main () {

int menu=1;KeyType key;

while (menu) {

printf ("***************************菜单如下******************************
");

printf (" 0————————————————完全结束操作
");

printf (" 1————————————————创建哈希表
");

printf (" 2————————————————显示哈希表
");

printf (" 3————————————————哈希查找
");

printf (" 4————————————————插入新纪录
");

printf (" 5————————————————删除已有纪录
");

printf (" 6————————————————计算ASL
");

printf ("请选择菜单:");

scanf ("%d",&menu);

switch (menu) {

ca 0:

break;

ca 1:

printf ("**********************开始创建哈希表**********************
");

CreateHashTable ();

printf ("**********************结束创建哈希表**********************
");

break;

ca 2:

printf ("**********************开始显示哈希表**********************
");

PrintHashTable ();

printf ("**********************结束显示哈希表**********************
");

break;

ca 3:

printf ("**********************开始哈希查找**********************
");

printf ("请输入关键字(1#####,#为数字):");

scanf ("%d",&key);

SearchHashTable (key);

printf ("**********************结束哈希查找**********************
");

break;

ca 4:

printf ("**********************开始插入新纪录**********************
");

printf ("请输入“新纪录”的关键字(######,#为数字):");

scanf ("%d",&key);

InrtHashTable (key);

printf ("**********************结束插入新纪录**********************
");

break;

ca 5:

printf ("**********************开始删除已有纪录**********************
");

printf ("请输入“已有纪录”的关键字(######,#为数字):");

scanf ("%d",&key);

DeleteHashTable (key);

printf ("**********************结束删除已有纪录**********************
");

break;

ca 6:

printf ("**********************开始计算ASL***********************
");

ASLofHashTable ();

printf ("**********************结束计算ASL***********************
");

break;

default:

printf ("选择错误,无法操作.
");

break;

}

printf ("
");

}

printf ("操作完全结束
");

} //end main



本文发布于:2023-03-04 07:06:35,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/zhishi/e/action/ShowInfo.php?classid=88&id=3246

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:请输入关键字.doc

本文 PDF 下载地址:请输入关键字.pdf

下一篇:母爱作文300字
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 实用文体写作网旗下知识大全大全栏目是一个全百科类宝库! 优秀范文|法律文书|专利查询|