哈希表c语言程序代码.docx
- 文档编号:9869556
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:14
- 大小:18.17KB
哈希表c语言程序代码.docx
《哈希表c语言程序代码.docx》由会员分享,可在线阅读,更多相关《哈希表c语言程序代码.docx(14页珍藏版)》请在冰豆网上搜索。
哈希表c语言程序代码
/*实验项目名称:
电话号码查询系统的实现
实验目的与要求:
1.基础知识:
掌握数据结构中的查找、排序等算法相关知识;
掌握C或VC++语言中程序设计的方法。
2.参考教材相关算法,完成以下程序功能:
(1)自选存储结构实现电话号码表的初始化;
(2)编写一个电话号码查询系统,要求有电话号码记录的录入(插入)存储、查询、记录删除、排序、打印等模块;
实验性质:
综合性(4学时)
说明:
存储结构可采用哈希表的方式,完成用电话号码或姓名为关键字构建哈希表,并进行查询、添加、删除、打印记录等功能模
块(此方式为推荐方式),其次子函数的调用顺序由最终用户决定(可用多分支结构),程序中应有用户的操作选择界面.*/
#include"stdio.h"
#include"stdlib.h"
#defineSUCCESS1
#defineNULL_KEY-2//-2为无标志记录
#defineUNSUCCESS0
#defineDUPLICATE-1
inthashsize[]={11,19,29,37};//哈希表容量递增表,一个合适的素数序列
intm=0;//哈希表表长,全局变量
typedefintKeyType;//设关键字为整形
typedefstruct{
charname;//姓名
KeyTypenum;//号码
}Node;
typedefstruct{
Node*elem;//数据元素存储地址,动态分配数组
intcount;//当前数据元素个数
intsizeindex;//hashsize[H.sizeindex]为当前容量
}HashTable;
voidChuangJian(HashTable&H){//构建一个空哈希表
inti;
H.count=0;//当前元素个数
H.sizeindex=0;//初试存储容量为hashsize[0]
m=hashsize[0];
H.elem=(Node*)malloc(m*sizeof(Node));
if(!
H.elem)
exit(-2);//存储分配失败
for(i=0;i H.elem[i].num=NULL_KEY;//未填记录的标志 } voidDaYin(intp,Nodee){//打印下标为p的记录 printf("哈希下标=%d姓名: %c号码: %d\n",p,e.name,e.num); } intHaXi(KeyTypeK){//哈希函数(m为表长,全局变量) returnK%m; } voidChongTu(int&p,intd){//线性探测再散列 p=(p+d)%m; } intEQ(inta,intv){//判断a和v是否相等 if(a==v) return1;//相等返回1 else return0;//否则返回0 } intFind(HashTableH,KeyTypeK,int&p){//在开放定址哈希表H中查找关键字为K的元素,若查找成 //功,以p指示待查数据元素在表中下标,并返回SUCCESS;否则,返回UNSUCCESS intc=0; p=HaXi(K);//求得哈希地址 while(H.elem[p].num! =NULL_KEY&&! EQ(K,H.elem[p].num)){//该位置中填有记录,并且与关键字不相等 c++; if(c ChongTu(p,c);//求得下一探查地址p else returnUNSUCCESS;//查找不成功 } if(EQ(K,H.elem[p].num)) returnSUCCESS;//查找成功,p返回待查数据元素下标 else returnUNSUCCESS;//查找不成功 } intChaXun(HashTableH,KeyTypeK,int&p,int&c){//在开放定址哈希表中查找关键字为K的元素,若查找成功,以p指示 //待查数据元素在表中位置,并返回SUCCESS;否则,以p指示插入位置,并返回UNSUCCESS;c用以计冲突次数,其初值为0 p=HaXi(K);//求得哈希地址 while(H.elem[p].num! =NULL_KEY&&! EQ(K,H.elem[p].num)){//该位置中填有记录,并且与关键字不相等 if(c ChongTu(p,c);//求得下一探查地址p else break; } if(EQ(K,H.elem[p].num)) returnSUCCESS;//查找成功,p返回待查数据元素下标 else returnUNSUCCESS;//若查找不成功,p返回插入位置 } voidChongJian(HashTable&H){//重建哈希表 intChaRu(HashTable&H,Nodee); inti,count=H.count; Node*p,*elem=(Node*)malloc(count*sizeof(Node)); p=elem; printf("重建哈希表! \n"); for(i=0;i if((H.elem+i)->num! =NULL_KEY)//该单元有数据 *p++=*(H.elem+i); H.count=0; H.sizeindex++;//增大存储容量 m=hashsize[H.sizeindex]; p=(Node*)realloc(H.elem,m*sizeof(Node)); if(! p) exit(-2);//存储分配失败 H.elem=p; for(i=0;i H.elem[i].num=NULL_KEY;//未填记录的标志化 for(p=elem;p ChaRu(H,*p); } intChaRu(HashTable&H,Nodee){//查找不成功时插入数据e到开放定址哈希表H中,并返回1;若冲突次数过大,则重建哈希表 intc=0,p; if(H.count==m-1){ H.sizeindex++;//增大存储容量 m=hashsize[H.sizeindex]; H.elem=(Node*)realloc(H.elem,m*sizeof(Node));//追加空间 if(! H.elem) exit(-2);//追加空间失败 } if(ChaXun(H,e.num,p,c)){//表中已有与e有相同关键字的元素 printf("表中已有相同关键字的元素! \n"); returnDUPLICATE; } else{ if(c H.elem[p]=e;//插入e ++H.count; return1; } else{ ChongJian(H);//重建哈希表 returnUNSUCCESS; } } } intBaoCun(HashTableH){//将哈希表中所有数据保存到phone.txt FILE*fp; inti=0,p; if((fp=fopen("phone.txt","w+"))==NULL) return0; for(p=0;p if(H.elem[p].num! =NULL_KEY) i++; } fprintf(fp,"%d\n",i); for(p=0;p if(H.elem[p].num! =NULL_KEY) fprintf(fp,"%d%c%d\n",p,H.elem[p].name,H.elem[p].num); } fclose(fp); printf("保存成功! \n"); return1; } intDuQu(HashTable&H){//将phone.txt所有数据读到哈希表中 FILE*fp; inti,p,n; chara[15]; if((fp=fopen("phone.txt","r+"))==NULL) return0; fscanf(fp,"%s",a); n=atoi(a);//phone.txt中当前记录的个数 H.count=n; for(i=0;i fscanf(fp,"%s",a); p=atoi(a); fscanf(fp,"%s",a); H.elem[p].name=a[0]; fscanf(fp,"%s",a); H.elem[p].num=atoi(a); } fclose(fp); return1; } voidQingKong(HashTable&H){//清空哈希表 inti; H.count=0;//当前元素个数置为0 H.sizeindex=0;//初试存储容量为hashsize[0] m=hashsize[0]; H.elem=(Node*)malloc(m*sizeof(Node)); if(! H.elem) exit(-2);//存储分配失败 for(i=0;i H.elem[i].num=NULL_KEY;//未填记录的标志 printf("哈希表已清空! \n"); } voidPaiXu(HashTable&H1,HashTableH){//排序 inti,j; Nodee; H1.count=H.count; H1.sizeindex=H.sizeindex; m=hashsize[0]; H1.elem=(Node*)malloc(m*sizeof(Node)); if(! H1.elem) exit(-2); for(i=0;i H1.elem[i]=H.elem[i]; for(i=0;i for(j=i+1;j if(H1.elem[i].num! =-2&&H1.elem[j].num! =-2) if(H1.elem[i].name>H1.elem[j].name){ e=H1.elem[i]; H1.elem[i]=H1.elem[j]; H1.elem[j]=e; } } intmain(){//主函数 inti,j,p; charc,v; Nodee; KeyTypeK; HashTableH,H1; ChuangJian(H); DuQu(H); while (1){ system("cls"); system("colorF0"); printf("\t|===========================================================|\t\n"); printf("\t||\t\n"); printf("\t|电话号码系统|\t\n"); printf("\t||\t\n"); printf("\t|===========================================================|\t\n"); printf("\n\t【1】-->打印! \t\t【2】-->查询! \t\t【3】-->插入! \n"); printf("\n\t【4】-->修改! \t\t【5】-->删除! \t\t【6】-->排序! \n"); printf("\n\t【7】-->保存! \t\t【8】-->清空! \t\t【0】-->退出! \n"); printf("\n\n\t\t\t请输入你的选择: "); scanf("%d",&i); switch(i){ case1: //打印 if(H.count>0){ printf("按哈希表下标遍历结果如下: \n"); for(p=0;p if(H.elem[p].num! =NULL_KEY) DaYin(p,H.elem[p]); } else printf("哈希表为空,不用打印! \n"); system("pause"); break; case2: //查询 do{ printf("请输入你要查询的关键字: "); scanf("%d",&K); j=Find(H,K,p); if(j==SUCCESS){ printf("你输入的关键字查询结果如下: \n"); DaYin(p,H.elem[p]); } else printf("该哈希表中没有你要查找的关键字! \n"); printf("是否继续查找? 是/否,y/n: "); getchar(); }while((c=getchar())=='y'||(c=getchar())=='Y'); system("pause"); break; case3: //插入 do{ printf("请输入你要插入的姓名号码: "); getchar(); scanf("%c%d",&e.name,&e.num); ChaRu(H,e); printf("是否继续插入? 是/否,y/n: "); getchar(); }while((c=getchar())=='y'||(c=getchar())=='Y'); system("pause"); break; case4: //修改 if(H.count>0) do{ printf("请输入你要修改的关键字: "); scanf("%d",&K); j=Find(H,K,p); if(j==SUCCESS){ printf("你输入的关键字查询结果如下: \n"); DaYin(p,H.elem[p]); printf("请输入修改后的姓名号码: "); getchar(); scanf("%c%d",&e.name,&e.num); if(e.num! =K){ H.elem[p].num=NULL_KEY; ChaRu(H,e); } else H.elem[p]=e; } else printf("该哈希表中没有你要修改的关键字! \n"); printf("是否继续修改? 是/否,y/n: "); getchar(); }while((c=getchar())=='y'||(c=getchar())=='Y'); else printf("哈希表为空,无法修改! \n"); system("pause"); break; case5: //删除 if(H.count>0) do{ printf("请输入你要删除的关键字: "); scanf("%d",&K); j=Find(H,K,p); if(j==SUCCESS){ printf("你输入的关键字查询结果如下: \n"); DaYin(p,H.elem[p]); printf("是否确认删除? 是/否,y/n: "); getchar(); if((v=getchar())=='y'||(v=getchar())=='Y'){ H.elem[p].num=NULL_KEY; H.count=H.count-1; printf("该记录已删除! \n"); } } else printf("该哈希表中没有你要删除的关键字! \n"); printf("是否继续删除? 是/否,y/n: "); getchar(); }while((c=getchar())=='y'||(c=getchar())=='Y'); else printf("哈希表为空,无法删除! \n"); system("pause"); break; case6: //排序 if(H.count>0){ PaiXu(H1,H); printf("排序后的哈希表按下标遍历结果如下: \n"); for(p=0;p if(H1.elem[p].num! =NULL_KEY) DaYin(p,H1.elem[p]); } else printf("哈希表为空,无法排序! \n"); system("pause"); break; case7: //保存 BaoCun(H); system("pause"); break; case8: //清空 if(H.count>0) QingKong(H); else printf("哈希表为空,不用清空! \n"); system("pause"); break; case0: //退出程序 printf("退出程序! \n"); return1; default: //重新输入选择的功能序号 printf("输入有误,请重新输入! \n"); system("pause"); break; } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈希表 语言 程序代码
![提示](https://static.bdocx.com/images/bang_tan.gif)