散列表的设计与实现.docx
- 文档编号:20439880
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:32
- 大小:569.73KB
散列表的设计与实现.docx
《散列表的设计与实现.docx》由会员分享,可在线阅读,更多相关《散列表的设计与实现.docx(32页珍藏版)》请在冰豆网上搜索。
散列表的设计与实现
软件综合课程设计
散列表的设计与实现
宿舍管理查询软件
二〇一四年六月
散列表的设计与实现
一、问题陈述
【问题描述】
设计散列表实现电话号码查找系统。
【基本要求】
1)设每个记录有下列数据项:
电话号码、用户名、地址;
2)从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表;
3)采用一定的方法解决冲突;
4)查找并显示给定电话号码的记录;
5)查找并显示给定用户名的记录。
【进一步完成内容】
1)系统功能的完善;
2)设计不同的散列函数,比较冲突率;
3)在散列函数确定的前提下,尝试各种不同类型处理冲突的方法,考察平均查找长度的变化。
二、需求分析
(1)设每个记录有下列数据项:
电话号码、用户名、地址;
(2)从键盘输入各记录,分别以电话号码为关键字建立散列表
(3)采用二次探测再散列法解决冲突
(4)查找并显示给定电话号码的记录
(5)通讯录信息文件保存
(6)要求人机界面友好,使用图形化界面
三、概要设计
四、详细设计
主函数:
根据菜单的选项调用各函数,并完成相应的功能。
Menu()的功能:
显示菜单。
Quit()的功能:
退出菜单。
Create()的功能:
创建新的通讯录。
Apend()的功能:
添加新的信息。
Find():
查询某人的信息,如果找到了,则显示该人的信息,如果没有则提示通讯录中没有此人的信息。
List()的功能:
显示通讯录中的所有记录。
Save()的功能:
保存通讯录中的所有记录到指定文件中。
五、程序代码
#include"iostream.h"
#include"string.h"
#include"fstream.h"
#defineNULL0
unsignedintkey;
unsignedintkey2;
int*p;
structnode//建节点
{charname[8],address[20];
charnum[11];
node*next;
};
typedefnode*pnode;
typedefnode*mingzi;
node**phone;
node**nam;
node*a;
voidhash(charnum[11])//哈希函数
{inti=3;
key=(int)num[2];
while(num[i]!
=NULL)
{key+=(int)num[i];
i++;}
key=key%20;
}
voidhash2(charname[8])//哈希函数
{inti=1;
key2=(int)name[0];
while(name[i]!
=NULL){
key2+=(int)name[i];
i++;}
key2=key2%20;}
node*input()//输入节点
{node*temp;
temp=newnode;
temp->next=NULL;
cout<<"输入姓名:
"< cin>>temp->name; cout<<"输入地址: "< cin>>temp->address; cout<<"输入电话: "< cin>>temp->num; returntemp;} intapend()//添加节点 {node*newphone; node*newname; newphone=input(); newname=newphone; newphone->next=NULL; newname->next=NULL; hash(newphone->num); hash2(newname->name); newphone->next=phone[key]->next; phone[key]->next=newphone; newname->next=nam[key2]->next; nam[key2]->next=newname; return0;} voidcreate()//新建节点 {inti; phone=newpnode[20]; for(i=0;i<20;i++) {phone[i]=newnode; phone[i]->next=NULL;} } voidcreate2()//新建节点 {inti; nam=newmingzi[20]; for(i=0;i<20;i++) {nam[i]=newnode; nam[i]->next=NULL;} } voidlist()//显示列表 {inti; node*p; for(i=0;i<20;i++) {p=phone[i]->next; while(p) { cout< p=p->next;} } } voidlist2()//显示列表 { inti; node*p; for(i=0;i<20;i++) { p=nam[i]->next; while(p) { cout< p=p->next; } } } voidfind(charnum[11])//查找用户信息 { hash(num); node*q=phone[key]->next; while(q! =NULL) { if(strcmp(num,q->num)==0) break; q=q->next; } if(q) cout< elsecout<<"无此记录"< } voidfind2(charname[8])//查找用户信息 { hash2(name); node*q=nam[key2]->next; while(q! =NULL) { if(strcmp(name,q->name)==0) break; q=q->next; } if(q) cout< elsecout<<"无此记录"< } voidsave()//保存用户信息 { inti; node*p; for(i=0;i<20;i++){ p=phone[i]->next; while(p) { fstreamiiout("out.txt",ios: : out); iiout< p=p->next;} } } voidmenu()//菜单 { cout<<"0.添加记录"< cout<<"1.查找记录"< cout<<"2.姓名散列"< cout<<"3.号码散列"< cout<<"4.清空记录"< cout<<"5.保存记录"< cout<<"6.退出系统"< } intmain(){ charnum[11]; charname[8]; create(); create2(); intsel; while (1) { menu(); cin>>sel; if(sel==0) { cout<<"请输入要添加的内容: "< apend(); } if(sel==1) { cout<<"8姓名查询,9号码查询"< intb; cin>>b; if(b==8) { cout<<"请输入姓名: "< cin>>name; cout<<"输出查找的信息: "< find2(name); } else { cout<<"请输入电话号码: "< cin>>num; cout<<"输出查找的信息: "< find(num); } } if(sel==2) { cout<<"姓名散列结果: "< list2(); } if(sel==3) { cout<<"号码散列结果: "< list(); } if(sel==4) {cout<<"列表已清空: "< create(); create2();} if(sel==5) { cout<<"通信录已保存: "< save(); } if(sel==6)return0; } return0; } 六、运行结果与测试 1、进入界面,出现选项菜单 2、添加记录,输入要添加的内容: 姓名,地址,电话 3、查找记录 4、姓名散列 5、号码散列 6、清空记录 7、保存记录 8、退出系统 七、设计体会与总结 通过这次的课程设计,我收获了很多。 虽然刚开始没有什么头绪,但是通过各种资料的搜集后发现调用各种函数来实现比较容易,整个过程中出现了很多小问题,各个函数的调用比较混乱,通过一系列的梳理后思路就慢慢清晰了。 这次课程设计让我们知道了要学好数据结构这门课程,不仅要认真的阅读课本知识,更重要的是要通过上机实践才能增强和巩固对课本知识的理解。 首先通过这次的课程设计我发现了自己许多的不足。 在课本上看到各种算法感觉很简单,但是真正的让自己去写一个算法感觉很困难。 即使是课本上的原程序算法,自己写起来感觉有点生疏。 通过课程设计的学习,我认识到学好计算机要重视实践操作,不仅仅是学习数据结构,还是其它的课程,以及其它的计算机方面的知识都重在实践,所以后在学习过程中,我会更加注视实践操作,使自己更好地学好计算机。 宿舍管理查询软件 一、问题陈述 1)任务: 为宿舍管理人员编写一个宿舍管理查询软件,程序设计要求: A.采用交互工作方式 B.建立数据文件,数据文件按关键字(姓名、学号、房号)进行排序(冒泡、选择、插入排序等任选一种) 2)查询菜单: (用二分查找实现以下操作) A.按姓名查询 B.按学号查询 C.按房号查询 3)打印任一查询结果(可以连续操作) 二、程序代码 #include #include #include #defineN40//线性表存储空间的初始分配量 #defineincrease10//线性表存储空间的分配量增量 intf,t=0;//定义全局变量 typedefstruct { charname[20]; intnum;//学号和房号都为整型 introom; }stu; stustud; typedefstruct { intlength;//当前长度 stu*elem;//存储空间基址 intlistsize;//当前分配的存储容量 }linklist; voidinit(linklist&l)//线性表初始化 { l.length=0; l.elem=(stu*)malloc(N*sizeof(stu)); l.listsize=N; } voidmenu()//操作菜单 { printf("***************请按键选择操作****************\n"); printf("1按姓名排序2按学号排序\n"); printf("\n"); printf("3按房号排序4按姓名查找\n"); printf("\n"); printf("5按学号查找6按房号查找\n"); printf("提示: 当输入的数字键为0时,退出操作\n"); if(t==1) { printf("请输入数字键(1~8为操作键): ");//1~8为有效数字操作键 scanf("%d",&f); if(f<0||f>9) { system("cls"); printf("\n"); printf("输入数字不对,请在原处重输! \n");printf("\n"); menu(); } } } voiddisp()//返回主界面 { charc; fflush(stdin); printf("\n"); printf("请按任意键进入主界面: "); scanf("%c",&c); system("cls"); } voidpanduan3()//如果已无学生记录则返回主界面 { printf("\n"); printf("已无学生记录\n"); printf("\n"); disp(); menu(); } voidshuru(linklistl)//输入学生的信息 { printf("请输入姓名: "); fflush(stdin);//清空输入缓冲区,得到正确的输入数据 gets(stud.name);//输入一行字符串(姓名) printf("请输入学号: "); scanf("%d",&stud.num); printf("请输入房号: "); scanf("%d",&stud.room); } voidcreate(linklist&l)//创建学生信息表 { if(l.length>=l.listsize)//判断学生的人数是否超过初值,如果超过,则重新分配 { stu*newbase; newbase=(stu*)realloc(l.elem,(N+increase)*sizeof(stu)); l.elem=newbase; l.listsize+=increase; } inti=2; charch; printf("********************开始创建线性表********************\n"); printf("请输入第1个学生的信息\n"); shuru(l);//调用输入函数 ch=getchar(); strcpy(l.elem[l.length].name,stud.name); l.elem[l.length].num=stud.num; l.elem[l.length].room=stud.room; l.length++; printf("\n"); printf("是否继续输入? "); scanf("%c",&ch); printf("\n"); while(ch=='y') { printf("请输入第%d个学生的信息\n",i); shuru(l); strcpy(l.elem[l.length].name,stud.name); l.elem[l.length].num=stud.num; l.elem[l.length].room=stud.room; l.length++; i++; ch=getchar();printf("\n"); printf("是否继续输入? "); scanf("%c",&ch); printf("\n"); } if(ch=='n')system("cls"); } voidsort3(linklist&l)//按房号排序(采用冒泡排序) { inti,j; stutemp; for(i=0;i for(j=i+1;j if(l.elem[i].room>l.elem[j].room) { temp=l.elem[i]; l.elem[i]=l.elem[j]; l.elem[j]=temp; } } voidsort2(linklist&l)//按学号排序(采用冒泡排序) { inti,j; stutemp; for(i=0;i for(j=i+1;j if(l.elem[i].num>l.elem[j].num) { temp=l.elem[i]; l.elem[i]=l.elem[j]; l.elem[j]=temp; } } voidsort1(linklist&l)//按姓名排序(采用冒泡排序) { inti,j; stutemp; for(i=0;i for(j=i+1;j if(strcmp(l.elem[i].name,l.elem[j].name)>0) { temp=l.elem[i]; l.elem[i]=l.elem[j]; l.elem[j]=temp; } } voidprint1(linklist&l)//打印学生信息 { inti; printf("姓名学号房号\n"); for(i=0;i printf("%-15s%-3d%5d\n",l.elem[i].name,l.elem[i].num,l.elem[i].room); } voidprint2(linklist&l,intmid)//打印查找到的学生信息 { printf("查找成功----->该学生信息为: \n"); printf("姓名学号房号\n"); printf("%-15s%-5d%-5d\n",l.elem[mid].name,l.elem[mid].num,l.elem[mid].room); } intpanduan1(charch)//判断是否继续查找 { scanf("%c",&ch); printf("是否继续查找? "); fflush(stdin); scanf("%c",&ch); if(ch=='y') { system("cls"); return (1); } else return0; } intpanduan2(charch)//如果学生不存在,判断是否继续查找 { scanf("%c",&ch); printf("该学生不存在,是否继续查找? "); fflush(stdin); scanf("%c",&ch); if(ch=='y') { system("cls"); return (1); } else return0; } voidchazhao3(linklist&l)//按房号从小到大查找(采用二分查找) { if(l.length==0)panduan3();//此函数功能为: 返回主界面 else { intlow=0,high=l.length,mid,flag=0;//flag作为标志符,为1则表示查找成功,否则没有所要查找的学生 intm; charch; printf("\n"); printf("按房号查找----->请输入要查找的房号: "); scanf("%d",&m); printf("\n"); while(low<=high) { mid=(low+high)/2; if(m==l.elem[mid].room) { flag=1; break; } elseif(m>l.elem[mid].room) low=mid+1; else high=mid-1; } if(flag==1) {print2(l,mid); if(panduan1(ch))//调用判断函数1 chazhao3(l); else{system("cls"); menu();} } else{ if(panduan2(ch))//调用判断函数2 chazhao3(l); else{system("cls"); menu();} } } } voidchazhao2(linklist&l)//按学号从小到大查找(采用二分查找) { if(l.length==0)panduan3(); else { intlow=0,high=l.length,mid,flag=0; intn; charch; printf("\n"); printf("按学号查找----->请输入要查找的学号: "); scanf("%d",&n); printf("\n"); while(low<=high) { mid=(low+high)/2; if(n==l.elem[mid].num) { flag=1; break; } elseif(n>l.elem[mid].num) low=mid+1; else high=mid-1; } if(flag==1) { print2(l,mid); if(panduan1(ch)) chazhao2(l); else { system("cls"); menu(); } } else { if(panduan2(ch))chazhao2(l); else { system("cls"); menu(); } } } } voidchazhao1(linklist&l)/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 列表 设计 实现