文章目录
问题描述:
为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的电话与地址。设计散列表存储,设计并实现通讯录查找系统。
1.基本要求
(1)每个记录有下列数据项:电话号码、用户名、地址;
(2)从键盘输入各记录,分别以电话号码为关键字建立散列表;
(3)采用二次探测再散列法解决冲突;
(4)查找并显示给定电话号码的记录;
(5)通讯录信息文件保存。
2.重点、难点
重点:
(1)通过实验深入理解哈希表既是一种存储形式,又是一种查找方法;
(2)哈希表的构造;
(3)哈希冲突方案的设计。
难点:哈希表的构造与哈希冲突方案的设计
3.作业及课外学习要求:
按照题意要求独立进行设计,设计结束后要按要求写出课程设计报告。
本知识点的讲授和学习,可以支撑“毕业要求4研究”中的“指标点4.1能够运用科学的研究方法对复杂软件工程问题进行需求分析研究;指标点4.2熟悉复杂软件系统的开发和应用环境,研究制定合理的软件设计与开发方案。指标点4.3能够对原型验证方法进行研究与分析,合理验证软件系统”的指标达成度进行评估。使学生在解决具体问题的过程中,能够灵活熟练地选择合适的数据结构及设计有效的算法,从而加深对常用数据结构的理解,强化学生的逻辑思维能力和动手能力,巩固良好的编程习惯,掌握工程软件设计的基本方法,为后续课程的学习打下坚实基础。
4.代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
#include<cstdio> #include<stdlib.h> #include<iostream> #include<cstring> #include<cmath> #define MAXSIZE 300 #define L 300 using namespace std; class individual { public: char tel[12]; char name[15]; char addr[20]; int key; }; class population { public: individual addr_list[MAXSIZE+1]; individual hash_list[L]; void info_input(); void init_hash_list(); void hash_list_do(); void search_tel(); void hash_out(); int m,n; int individuals; }; population all; int max_prime(int m)//m>2 { int i; if(m%2==0) m--; while(m>=3){ for(i=3;i<=sqrt(m);i+=2) if(m%i==0) break; if(i>sqrt(m)) break; m-=2; } return m; } void population::info_input() { printf("输入通讯录最大长度(<%d):\n",MAXSIZE); cin>>all.m; printf("批量输入人数:"); cin>>all.individuals; printf("批量输入%d个成员的信息(用户名、电话号码(11位)、地址):\n",all.individuals); for(int i=1;i<=all.individuals;i++) { cin>>all.addr_list[i].name; cin>>all.addr_list[i].tel; cin>>all.addr_list[i].addr; if(strlen(all.addr_list[i].tel)!=11) { printf("重新输入第%d位成员的信息:\n",i); cin>>all.addr_list[i].name; cin>>all.addr_list[i].tel; cin>>all.addr_list[i].addr; } all.addr_list[i].key=all.addr_list[i].tel[3]+all.addr_list[i].tel[10]; } printf("批量创建成功!!!\n"); } void population::init_hash_list() { for(int i=0;i<L;i++) { strcpy(all.hash_list[i].addr,""); strcpy(all.hash_list[i].name,""); strcpy(all.hash_list[i].tel,""); all.hash_list[i].key=0; } } void population::hash_list_do() { init_hash_list(); int i,j=1,x,temp; init_hash_list(); all.n=max_prime(all.m); printf("\n最大长度为:%d 模n=%d\n",all.m,all.n); for(i=1;i<=all.individuals;i++) { temp=x=all.addr_list[i].key%all.n; while(all.hash_list[x].key!=0)//此处需要用二次探测再散列法解决冲突 { x=temp; x=(x+j*j)%all.n; if(all.hash_list[x].key!=0) { x=temp; x=(x-j*j)%all.n; } j++; } all.hash_list[x].key=all.addr_list[i].key; strcpy(all.hash_list[x].addr,all.addr_list[i].addr); strcpy(all.hash_list[x].name,all.addr_list[i].name); strcpy(all.hash_list[x].tel,all.addr_list[i].tel); } cout<<"哈希表创建成功!!"<<endl; } void population::hash_out() { FILE *fp; if((fp=fopen("address_list.txt","w"))==NULL) { printf("open file failed!\n"); exit(0); } fprintf(fp,"用户 电话号码 地址 \n"); printf("\n输出Hash表:\n"); printf(" 用户 电话号码 地址 关键字 \n"); for(int i=0;i<all.m;i++) { if(all.hash_list[i].key!=0) { cout<<all.hash_list[i].name<<" "; cout<<all.hash_list[i].tel<<" "; cout<<all.hash_list[i].addr<<" "; cout<<all.hash_list[i].key<<" "<<endl; fprintf(fp,"%s %s %s \n",all.hash_list[i].name,all.hash_list[i].tel,all.hash_list[i].addr); } } fclose(fp); } void population::search_tel() { int i,temp,x,j=1; char room[12]; printf("\n输入电话号码:"); cin>>room; temp=room[3]+room[10]; x=temp%all.n; if(strcmp(all.hash_list[x].tel,room)==0) printf("姓名:%-15s 电话号码:%s 地址:%-5s \n\n", all.hash_list[x].name,all.hash_list[x].tel,all.hash_list[x].addr); else { while(strcmp(all.hash_list[x].tel,room)) { x=(temp+j*j)%all.n; if(strcmp(all.hash_list[x].tel,room)) { x=temp; x=(x-j*j)%all.n; } j++; } printf("姓名:%-15s 电话号码:%s 地址:%-5s \n\n", all.hash_list[x].name,all.hash_list[x].tel,all.hash_list[x].addr); } } void msgbox() { printf("================================\n"); printf("= 基本操作: =\n"); printf("= 电话查询--S =\n"); printf("= 通信录人员名单--H =\n"); printf("= 退出系统--E =\n"); printf("================================\n"); } int main() { char op; cout<<" 警告:当前通信录还未初始化!!!\n\n "; all.info_input(); all.hash_list_do(); msgbox(); cout<<"选择操作\n-"; while(cin>>op) { msgbox(); switch(op) { case 'S': all.search_tel();break; case 'H': all.hash_out();break; case 'E': exit(0);break; default: continue; } } cout<<"谢谢使用!!!"; } |