算法与数据结构课程设计散列表的设计与实现教学计划编制问题.doc
《算法与数据结构课程设计散列表的设计与实现教学计划编制问题.doc》由会员分享,可在线阅读,更多相关《算法与数据结构课程设计散列表的设计与实现教学计划编制问题.doc(32页珍藏版)》请在三一办公上搜索。
1、*实践教学* 兰州理工大学计算机与通信学院2015年秋季学期算法与数据结构课程设计 题 目: 散列表的设计与实现 教学计划编制问题专业班级:软件工程二班姓 名: 学 号: 指导教师: 成 绩:目 录摘要3一. 散列表的设计与实现 1.采用类语言定义相关的数据类型42. 算法设计43.函数的调用关系图74.调试分析86.源程序(带注释)11 二教学计划编制问题1.采用类语言定义相关的数据类型182.算法设计193. 函数的调用关系图215. 测试结果226.源程序(带注释)23总结31致 谢32摘要1. 散列表的设计与实现 (1)查找并显示给定电话号码的记录(2) 查找并显示给定用户名的记录(3
2、) 用散列表实现电话号码查找系统(4) 以电话号码和用户名为关键字建立散列表关键字:电话号码 用户名 地址 查找2. 教学计划编制问题(1) 输入参数:学期总数,一学期的学分上限,每门课的课程号(2) 输出参数:输出提示信息(3) 阐明了如何搞好教学管理,从而为提高教学质量提供保证(4) 重视教学计划的改革修订工作,以确保教育教学质量,提高教育教学水平。(5) 明确培养目标,注重学科设置的整体性、统一性和灵活性、全面性,学分制改革有机结合关键字:学期 学分 课程号 教学计划 管理 一散列表的设计与实现。设计散列表实现电话号码查找系统。基本要求: (1)设每个记录有下列数据项:电话号码、用户名、
3、地址; (2) 从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表;(3)采用双散列法解决冲突;(4)查找并显示给定电话号码的记录;(5) 查找并显示给定用户名的记录。1.采用类语言定义相关的数据类型typedef int Status;typedef char NAMAX_SIZE;typedef struct/记录 NA name; NA tel; NA add;Record;typedef struct/哈希表 Record *elemHASHSIZE; /数据元素存储基址 int count; /当前数据元素个数 int size; /当前容量HashTable2. 算法设计初
4、始化散列表算法:void InitHashTable(HashTable HT,HashTable2 HT2)for(int i=0;iHashMaxSize;i+)strcpy(HTi.HashName,0);/将哈希表1初始化为空strcpy(HT2i.HashNum,0);/将哈希表2初始化为空哈希函数算法:int Hash1(NA str)/哈希函数 long n; int m; n=fold(str);/先将用户名进行折叠处理 m=n%HASHSIZE; /折叠处理后的数,用除留余数法构造哈希函数 return m; /并返回模值int Hash2(NA str)/哈希函数 long
5、 n; int m; n = atoi(str);/把字符串转换成整型数. m=n%HASHSIZE; /用除留余数法构造哈希函数 return m; /并返回模值整体散列算法:void sanlie(Pnode temp)int i=0,j=0;while(strcmp(tempj.name,0)!=0) j+;/计算当前表中name元素的个数while(ij)/该循环将各元素得到哈希地址后,将元素存储到相应的哈希表中hash1(tempi.name);while(strlen(hashAddsNamekey.HashName)key=(key+1)%m;/线形探测法处理冲突strcpy(h
6、ashAddsNamekey.HashName,tempi.name);/将作为关键字的姓名存入哈希表hash2(tempi.number);while(strlen(hashAddsNumkey2.HashNum)key2=(key2+1)%m;/线形探测法处理冲突strcpy(hashAddsNumkey2.HashNum,tempi.number);/将作为关键字的电话号码存入哈希表i+;输入各个记录信息算法void inputNode() /提示用户输入信息的同时将信息写入文件int i=1;char yn;Pnode temp;openfile(1);/调用”打开文件”函数while
7、(1)printf( 请输入第%d个姓名:,i);scanf(%s,temp.name);printf( 请输入第%d个电话号码:,i);scanf(%s,temp.number);printf( 请输入第%d个地址:,i);scanf(%s,temp.add);fprintf(fp,%15s %15s %30sn,temp.name,temp.number,temp.add);printf( 是否继续添加( Y继续 )?t);scanf(%s,&yn);if(yn!=y&yn!=Y) break;/当键入Y或 y 时继续输入i+;fclose(fp); 显示记录算法void display(
8、)int i=0,j=1;Pnode a;openfile(2);/以写方式调用打开文件函数printf(n);printf( - - - - - - - - - - - - - - - - - - - - - - -n);printf( 序号 姓名 电话号码 地址nn);while(!feof(fp)/当文件指针没有指向文件末尾时循环fscanf(fp,%s%s%s,&a.name,&a.number,&a.add);printf( %2dt%-15s%-15s %-30sn,j+,a.name,a.number,a.add);printf(nn);fclose(fp);/关闭文件 依靠散列
9、的查找算法int search1(char name15) /*关键字为姓名*/hash1(name);/调用哈希函数求取哈希地址下标while(strlen(hashAddsNamekey.HashName)!=0)if(strcmp(hashAddsNamekey.HashName,name)=0)return 1;/如果输入的关键字与哈希表中的关键字相等返回1elsekey=(key+1)%m;/*线性探测法处理冲突在下一位继续查找return -1;/如果未找到返回-1 3.函数的调用关系图4.调试分析a、 调试中遇到的问题及对问题的解决方法在编写算法时,遇到文件的具体操作,在从文件中
10、读取整条数据后,无法直接与其他算法相关联。while(!feof(fp)fgets(temp,100,fp);for(j=0,i=0;j15;j+)if(tempj!= )t1i=tempj;i+; t1i=0;for(j=16,i=0;j31;j+)if(tempj!= )t2i=tempj;i+; t2i=0;for(j=31,i=0;j63;j+)if(tempj!= )t3i=tempj;i+; t3i=0;strcpy(tempobjk.name,t1);strcpy(tempobjk.number,t2);strcpy(tempobjk.add,t3);k+;fclose(fp);
11、经过查阅书籍及网络资料,采取以上的方法解决问题 ,将从文件中读取出的一整行数据,经过拆分后,将各段数据分别存入结构体中的各个元素中去,问题得以解决。b、算法的时间复杂度和空间复杂度空间复杂度数据结构定义 5%散列部分 5%显示函数 5%查找部分5%添加部分10%删除部分10%处理函数30% 输入函数部分 10%主函数10%其他占:10%时间复杂度散列函数时, 输入信息函数, 显示函数,查找函数时间复杂度 O(n)主函数,转换函数时间复杂度O(n2);5.测试结果(1)、程序初始运行结果:(2)新建通讯录:(3) 读取用户信息(4) 解决冲突(5) 查找(号码 用户名 )6.源程序(带注释)ty
12、pedef int Status;typedef char NAMAX_SIZE;typedef struct/记录 NA name; NA tel; NA add;Record;typedef struct/哈希表 Record *elemHASHSIZE; /数据元素存储基址 int count; /当前数据元素个数 int size; /当前容量HashTable;Status eq(NA x,NA y)/关键字比较,相等返回SUCCESS;否则返回UNSUCCESS if(strcmp(x,y)=0) return SUCCESS; else return UNSUCCESS;Stat
13、us NUM_BER; /记录的个数void getin(Record* a)/键盘输入各人的信息 printf(输入要添加的个数:n); scanf(%d,&NUM_BER); int i; for(i=0;iNUM_BER;i+) printf(请输入第%d个记录的用户名:n,i+1); scanf(%s,ai.name); printf(请输入%d个记录的电话号码:n,i+1); scanf(%s,ai.tel); printf(请输入第%d个记录的地址:n,i+1); scanf(%s,ai.add); /gets(str2);? void ShowInformation(Record
14、* a)/显示输入的用户信息 int i; for( i=0;iNUM_BER;i+) printf(n第%d个用户信息:n 姓 名:%sn 电话号码:%sn 联系地址:%sn,i+1,ai.name,ai.tel,ai.add); void Cls(Record* a) printf(*); system(cls);long fold(NA s)/人名的折叠处理 char *p; long sum=0; NA ss; strcpy(ss,s);/复制字符串,不改变原字符串的大小写 strupr(ss);/将字符串ss转换为大写形式 p=ss; while(*p!=0) sum+=*p+; p
15、rintf(nsum=%d,sum); return sum;int Hash1(NA str)/哈希函数 long n; int m; n=fold(str);/先将用户名进行折叠处理 m=n%HASHSIZE; /折叠处理后的数,用除留余数法构造哈希函数 return m; /并返回模值int Hash2(NA str)/哈希函数 long n; int m; n = atoi(str);/把字符串转换成整型数. m=n%HASHSIZE; /用除留余数法构造哈希函数 return m; /并返回模值Status collision(int p,int &c)/冲突处理函数,采用二次探测再
16、散列法解决冲突 int i,q; i=c/2+1; while(i=0) return q; else i=c/2+1; else q=(p-i*i)%HASHSIZE; c+; if(q=0) return q; else i=c/2+1; return UNSUCCESS;void benGetTime();void CreateHash1(HashTable* H,Record* a)/建表,以人的姓名为关键字,建立相应的散列表 /若哈希地址冲突,进行冲突处理 benGetTime(); int i,p=-1,c,pp; for(i=0;ielempp!=NULL) pp=collisi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 数据结构 课程设计 列表 设计 实现 教学计划 编制 问题

链接地址:https://www.31ppt.com/p-2396883.html