版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构课程设计数据结构课程设计报告插队买票专业学生姓名班级学号指导教师完成日期2015年1月24日1目 录1、设计题目12、课题目的及要求23、设计分析44、调试与测试65、小 结86、参考文献97、源程序清单101数据结构课程的设计 1、设计题目春节前夕,一年一度的运输高潮也开始了,成千上万的外出人员都往家赶.火车站售票 窗前买票队伍一眼望不到头.运气好的,碰到一个已经在排队的朋友,直接走过去,排他后 面,这就叫"插队",但对队伍里的其他人来说是不公平的.本课程设计的任务是写一个程序模拟这种情况.每个队伍都允许插队.如果你在排队,有一个以上的朋友要求插队,则你可以安排他
2、们的次序.每次一个人入队,并且如果这个入队的人发现队伍中有自己的朋友,则可以插入到这个朋友的后面;当队伍中的朋友不止一个的时候,这个人会排在最后一个朋友的后面;如果队伍中没有朋友,则他只能够排在这个队伍的最后面.每一个入队的人都先进行上述的判断.当队伍前面的人买到车票之后.依次出队.2、课题目的及要求2.1目的:数据结构课程设计是为数据结构课程独立开设的实践性教学环节。数据结构课程设计对于巩固数据结构知识,加强学生的实际动手能力和提高学生综合素质是十分必要的。 本题目主要解决两个问题:一是怎么存放和查找大量数据(主要是姓名);二是怎么操作“ENQUEUE”和“DEQUEUE”命令。
3、2.2要求:1)输入要求:程序从“input. txt”文件读入测试用例,一个文件可包含多个测试用例。每个用例的第一行是朋友组的数目n(1<=n<=1000).对于一个朋友组以朋友的数目j(1<=j<=1000)开始,由朋友的个数以及他们的名字组成,一个空格后接该组朋友的名字,以空格分开,并且每个人的名字都不同。每个名字不超过4个字母,由A,B,Z,a,b,z 组成。一个朋友组最多有1000个人,每个人只属于一个朋友组。n=0时,测试数据结束。下面是一些具体命令:ENQUEUEXX入队DEQUEUE排队头的人买票,离开队伍,即出队STOP一个测用例结束2)、输出要求:测
4、试结果输出到“output.txt”文件中。每个测试用例的第一行输出“Scenario#k”,k是测试用例的序号(从1开始)。对每一个DEQUEUE命令,输出刚买票离开队伍的人名。两个测试用例之间隔一空行,最后一个用例结束不输出空行。3、设计分析图1 系统总图3.1用散列表来存放和查找数据由于最多有1000个朋友组,每组最多1000人,使用平方探测法解决冲突,则表的大小至少是2*(1000*1000),所以选择TableSize=2000003。同一个组内的都是朋友,所以每个人除了记录他的名字name,还要记录他属于哪个朋友组group,另外用info来表示该单元是否被占用,数据结构如图2所示
5、。散列函数是根据Honer法则计算一个以64为阶的多项式,如图3所示。冲突解决方法采用平方探测法,如图4所示。#define TabSize 2000003 typedef struct hashtab *PtrToHash;struct hashtab char name5; int group; char info; /*用来表示该单元是否被占用*/;图2数据结构:散列表int Hash(char *key,int TableSize) int HashVal=0; while(key!=NULL) HashVal=(HashVal<<6)+*key;Return HashVa
6、l%TableSize;图3 散列函数long int Find(PtrToHash hash,char *c) key=c; CurrentPos=Hash(key,TabSize); /*计算散列值*/ CollisionN
7、um=0; while(单元被占用)and(单元内的名字与查找的名字不同) /*发生冲突*/ /*平方探测法*/ CurrentPos+=2*(+CollisionNum)-1; if(CurrentPos>=TabSize) CurrentPos-=TabSize;
8、60; return CurrentPos;/*返回在散列表中的位置*/ 图4 用平方探测法处理冲突3.2怎么操作“ENQUEUE”和“DEQUEUE”命令这可以用队列来模拟。由于有插队现象的存在,不能单纯地用一个数组来表示队列,因为这样的话,插入一个朋友,则他后面的人都要往后移一个单位,删除一个人,则他后面的人都要前移一个,会降低效率。所以,采用一个Index标记来表示当前元素的后继元素,最后一个单元的后继元素是第0个,形成环,数据结构如图5所示。不用链表是因为链表存放指针也需要空间,并且链表插入、删除的效率没有
9、数组高。typedef struct Que *PtrToQue; struct Que long int HashVal; /*散列值*/ long int Index;
10、60; /*在中的队列序号*/ 图5 数据结构:队列1)输入ENQUEUE命令,如果队伍里有朋友,则排在朋友后面;如果没有遇到朋友,则排到队尾。入队时,用一个数组记录每个朋友组的最后一位,以便下一个朋友到来时排到他后面,这个数组被称为“插入数组”。 2)输入“DEQUEUE”命令,则根据“先进先出”,按照各个元素和它后继元素的先后顺序,每次删除队列中的第一个。程序结构如图6所示。While(读测试文件) if(输入“ENQUEUE”) 读入名字; 插入散列表; 插入
11、队列; else if(输入“DEQUEUE”) 删除队列第一个名字; 将该名字输出到文件; Else stop; 图6 入队、出队操作4、调试与测试4.1调试先运行,出现如图7所示:图7 运行4.2 测试1)测试输入23 Ann Bob Joe3 Zoe Jim FatENQUEUE AnnENQUEUE ZoeENQUEUE BobENQUEUE JimENQUEUE JoeENQUEUE FatDEQUEUEDEQUEUEDEQUEUEDEQUEUEDEQUEUEDEQUEUEST
12、OP25 Anny Jack Jean Bill Jane6 Eva Mike Ron Sony Geo ZoroENQUEUE AnnyENQUEUE EvaENQUEUE JackENQUEUE JeanENQUEUE BillENQUEUE JaneDEQUEUEDEQUEUEENQUEUE MikeENQUEUE RonDEQUEUEDEQUEUEDEQUEUEDEQUEUESTOP02)正确输出Scenario #1AnnBobJoeZoeJimFatScenario #2AnnyJackJeanBillJaneEva4.3实际结果1)实际输入图8 输入数据2)实际输出图9 输出数据
13、5、小 结 在前面的学习过程中我们学到了很多知识,而这次课程设计又是对我们所学的一次总结.我们必须掌握很多已学的知识才能很好的完成本次的课程设计。在这次课程设计中,总的感觉是我遇到了很多困难,这主要是由于我编写代码的经验不足,有时虽然是一个很小的问题,但解决起来却花费了我不少的时间,值得欣慰的是,当自己苦思冥想或者和其它同学一起探讨,把问题解决的时候我还是觉得获益非浅,这就是在摸索中寻求到的知识。设计期间,我发现只有有目的的去学习一些将要用到的东西,充分的运用所学知识,才能顺利的完成设计。在设计时也免不了存在着一些不足,所以在今后的学习中我会努力取得更大的进步,对于我不足的地方希望老师能够及时
14、给予批评,以便我在今后的学习中能够及时的改正。 通过这次课程设计,我收获的不仅仅是课程上的知识得到实际应用,还有编程的基本习惯和应注意的细节。6、参考文献1范策,周世平,胡哓琨.算法与数据结构(C语言版)M. 北京:机械工业出版社,20042 严蔚敏.数据结构(C语言版). 北京:清华大学出版社,20043 许卓群,杨冬青,唐世渭,张铭. 数据结构与算法. 北京:高等教育出版社,20044 徐孝凯. 数据结构实用教程(第二版). 北京:清华大学出版社,20067、源程序清单#include<stdio.h>#include<malloc.h>#include&
15、lt;string.h>#define TabSize 2000003 /*散列表大小TabSize 是大于表最大空间的素数*/#define Max 1000001 /*队列空间最大值*/struct hashtab;typedef struct hashtab *PtrToHash;struct hashtab /*散列表数据结构*/char name5; /*名字*/int group; /*属于哪个朋友组*/char info; /*标志位,该单元是否被占用*/;struct Que;typedef struct Que *PtrToQue;struct Que /*队列数据结构
16、*/long int HashVal; /*散列值*/long int Index; /*在中的队列序号*/;int hashedx=0; /*标记元素是否已经在散列表里*/long int Find(PtrToHash hash,char *c) /*查找在散列表中的位置*/char *key;long int CurrentPos,CollisionNum;key=c;for(CurrentPos=0;*key;+key) /*散列函数,计算散列值*/CurrentPos=(CurrentPos<<6)+*key;CurrentPos%=TabSize; /*散列值*/Coll
17、isionNum=0;/*如果当前单元被占用:单元内的元素与当前操作的名字不同,使用平方探测法解决冲突;与当前操作的名字相同,则直接返回在散列中的位置*/while(hashCurrentP)&&(strcmp(hashCurrentP,c) /*平方探测法*/CurrentPos+=2*(+CollisionNum)-1;if(CurrentPos>=TabSize)CurrentPos-=TabSize; if(hashCurrentP)&&(strcmp(hashCurrentP,c)=0) /
18、*元素已经在散列表里*/hashedx=1;else /*元素不在散列表里*/hashedx=0;return CurrentPos;/*返回在散列表中的位置*/int main()long int Find(PtrToHash hash,char *c); /*查找在散列表中的位置*/PtrToHash hash; /*散列表*/PtrToQue queue; /*队列*/int *grouppos; /*记录每个朋友组的最后一位,即插队数组*/int n; /*测试用例数目*/int num; /*当前测试用例序号*/long int i,ii,j,key,temp;long int he
19、ad,last; /*队列的头和尾*/char c8,tempc8; /*名字*/FILE *fpin,*fpout; /*输入、输出文件指针*/ if(!(fpin=fopen("input.txt","r") /*打开测试文件*/printf("fopen error!"); /*文件打开错误*/return -1;if(!(fpout=fopen("output.txt","w") /*打开输出文件*/printf("fopen error!");return -1;h
20、ash=(PtrToHash)malloc(sizeof(struct hashtab)*TabSize); /*为散列表申请空间*/queue=(PtrToQue)malloc(sizeof(struct Que)*Max); /*为队列申请空间*/grouppos=(int *)malloc(sizeof(int)*1000); /*申请空间记录每个朋友组的最后一位*/for(i=0,j=1;i<Max;+i,+j) /*初始化队列,queuei的后继单元是queuei1*/queuei.Index=j;queuei-1.Index=0; /*最后一个单元的后继单元是第0个,形成环*
21、/num=0;for(fscanf(fpin,"%d",&n);n;fscanf(fpin,"%d",&n)/*输入当前测试用例的朋友组数*/ if(n<1|n>1000) /*处理异常输入n*/ fprintf(fpout,"n is out of rangen"); return -1;num+;if(num!=1) /*两个测试用例间输入一空行*/fprintf(fpout,"n");for(i=0;i<TabSize;)hashi+.info=0; /*初始化散列表,标记位
22、置0*/for(i=0;i<n;+i) /*对每一组朋友*/fscanf(fpin,"%d",&j); /*当前组里的人数*/ if(j<1|j>1000) /*处理异常输入j*/ fprintf(fpout,"j is out of rangen"); return -1;for(;j;-j)fscanf(fpin,"%s",c); /*输入名字*/ for(ii=0;ii<sizeof(tempc);ii+) /*tempc清空,处理异常输入名字*/ tempcii='0'strcp
23、y(tempc,c);ii=0;while(tempcii!='0') /* 是否由四个以内字母组成*/if(tempcii<'A'|('Z'<tempcii&&tempcii<'a')|tempcii>'z'|ii>4)fprintf(fpout,"Group %d: Nonstandard namen ",i); return -1;ii+;key=Find(hash,c); /*找到在散列表中的位置*/if(hashedx=1) /*重名*/f
24、printf(fpout,"repeated name %sn",c); return -1;strcpy(,c);/*插入散列表*/=1; /*标记置1,该单元被占用*/hashkey.group=i; /*记录他属于哪个组*/for(i=0;i<1000;)groupposi+=0; /*初始化插队数组*/head=0; /*初始化队列头、尾标记*/last=0;fprintf(fpout,"Scenario #%dn",num); /*输出当前用例序号到文件*/for(fscanf(fpin,&
25、quot;%s",c);fscanf(fpin,"%s",c) /*输入命令*/if(*c='E') /*入队命令*/fscanf(fpin,"%s",c); /*输入名字*/key=Find(hash,c); /*查找在散列表中的位置*/if(hashedx=0) /*散列表里没这个人*/fprintf(fpout,"no %sn",c); return -1;temp=queue0.Index; /*队列第0个位置记录队尾的后继单元*/queue0.Index=queuetemp.Index; /*在队列中申请一个新单元,队尾标记后移一个位置 */queuetemp.HashVal=key; /*入队*/if(!head) /*如果是队列里的第一个元素 */last=head=temp; /*队头、队尾标记指向第一个元素*/if(!groupposhashkey.group) /*如果队列里没朋友*/queuetemp.Index=0; /*队尾指向对头,形成环*/queuelast.Index=temp;/*前一次队尾的后继元素是当前元素*/last=temp; /*队尾标记指向当前元素*/groupposhashkey.group=temp;/*插队数组记录该
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人工智能通识 学习情境5 智能语音技术
- 心理健康:学会表达情绪小学主题班会课件
- 智能硬件设计开发指导书
- 通信行业5G技术项目经理绩效考评表
- 医生门诊接诊效率绩效考评表
- 矿井维修钳工技能鉴定考试题库及答案
- 矿井调度员考试题库含答案
- 长期采访项目阶段性总结制度
- 促进假期阶段消费市场健康发展
- 2026下半年《小学道德与法治》教师资格证面试真题及答案【完整版】
- 眉山市2026年医务社会工作服务岗招募(26人)笔试模拟试题及答案详解
- 十堰竹溪县事业单位招聘笔试真题2025
- 2026年三级安全教育考试试题及答案(公司级+部门级+班组级 完整版)
- 2023版静脉治疗护理技术操作标准临床应用指南解读课件
- 2026学年部编版新教材语文五年级上册全册教案设计(含教学计划)
- 2026 年监理工程师《建设工程目标控制(土建)》冲关速记
- 华为任职资格体系(6版)
- 财务付款审批权限制度
- 印刷行业工艺流程与质量控制手册
- 2026年移动式压力容器充装R2作业证考试练习题库含答案
- 2025广东江门市江海区绿信再生资源有限公司拟聘人员笔试历年难易错考点试卷带答案解析
评论
0/150
提交评论