第一篇:数据结构分析报告
银行自动取款系统一、目的
根据所学知识,编写指定题目的C语言程序,并规范地完成课程设计报告。通过课程设计,加深对《C语言程序设计》课程所学知识的理解,熟练掌握和巩固C语言的基本知识和语法规范,包括:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);库函数应用(时间函数、绘图函数以及文件的读写操作函数等);复杂任务功能分解方法(自顶向下逐步求精、模块化设计、信息隐藏等)。学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备利用计算机编程分析解决综合性实际问题的初步能力。
二 需求分析
根据任务书里的“课程设计的基本要求”及给定的“课程设计的主要内容”。编写的银行自动提款模拟系统由使用者担当银行卡使用者自行输入卡号模拟银行卡使用系统进行各项操作,该系统有简便、稳定等特点。
该系统开始时有使用者自行初始化各项数据,包括卡的数量,一天内可操作次数上相及“银行卡”的卡号和余额,使用者可根据不同情况对系统的各项内容进行初始化,方便、快捷。
当使用者输入错误数据及操作次数达到上限时系统会自动退出或者给出相应的恢复提示使用者重新操作,直到输入正确,系统不会出现异常、突然崩溃,稳定。
1、所实现的功能:
①.系统能够让使用者自行输入卡的数量及每天操作次数上限,然后初始化卡的卡号和卡上所拥有的余额;
②.初始化信息后,可以开始使用系统进行存取款,输入卡号,如果卡号为负责退出程序、卡号不存在则提示重新输入直到输入正确为止,如果此卡的操作次数已达上限则同样退出程序;
③.输入正确后可以输入想要存取款数目,当数目为正是存款,负数为取款;
④.正确存取款后,系统会自行输出操作、卡上余额和剩下操作次数到屏幕,然后返回选择菜单,使用者可以再进行选择进行操作。
2、测试预测
①.进行测试,每个编写的函数逐个进行调试直到都能够正常运行;
②.在进行存取款操作都,所对应卡的操作次数应加一,余额能够进行相应的改变;
③.程序的各项运作结果与预想的与一样。
三 概要设计
程序的主要功能函数包括如下几个部分: void init(void)/*初始化,输入银行卡初始信息*/ int search(int x)/*搜索输入的卡号对应的银行卡*/ void work(void)/*主要功能函数,存取款以及查询*/ int main(void)/*主函数,选择菜单*/ 程序总体结果图如下:
程序主体部分结构图如下:
开始进入选择菜单输入选择1.2.31.初始化信息输入卡的数量和操作次数上限循环输入卡号和卡上余额2.存取款输入此次操作卡号输入存款数,正数为存,负数为取操作成功,显示各项数据3.退出程序结束返回选择菜单否输入操作卡号如果为负数否进入search函数是是否已达操作上限否输入存取款数是Exit(结束)是Exit(结束)取款是是否负数否存款更改各项初始化数据显示各项数据
四 详细设计
1、二维数组的应用 #define MAXN 100 #define MAX 10/*但是首先用宏定义来限制二维数组的行与列的长度,同时也方便了使用者可以随意更改它的长度*/ int card[MAXN+1][MAX+1];/* 定义了一个card二维数组来承载信息,包括卡号、卡上余额、剩余操作次数,还有每次操作存取款的具体数目*/
2、循环语句与选择性语句的使用
2.1.在init函数里面用循环语句来循环初始化二维数组的各项信息:
void init(void)/*初始化,输入银行卡初始信息*/ { int i;printf(“请输入银行卡的数量M:n”);scanf(“%d”,&m);printf(“请输入操作次数上限N:n”);scanf(“%d”,&n);for(i=1;i<=m;i++){ printf(“请输入第%d张银行卡的卡号:n”,i);scanf(“%d”,&card[i][0]);printf(“请输入第%d张银行卡的金额:n”,i);scanf(“%d”,&card[i][1]);} } 2.2.同时在主功能函数work里面用了数次选择语句来对输入信息进行判断,以保证函数正常运行 if(i<=-1){ printf(“感谢您使用本银行的存取款软件,再见n”);return;}/*操作者结束操作,打印感谢语,结束程序*/ if(t>m){ printf(“对不起,没有此银行卡。n”);break;}/*银行卡号不存在*/ if(card[t][2]==n){ printf(“对不起,本银行卡操作已达到日上限,请明日再操作。n”);continue;}/*操作达到上限*/
if(money<0)/*取款时操作*/ /*当取款金额超过余额时提示操作者重新输入存取金额,直到输入正确为止*/ while(card[t][1]<(-money)){ printf(“对不起,本银行卡余额不足,只剩下%d元,请重新输入存取金额:n”,card[t][1]);/*提示操作者重新输入*/ scanf(“%d”,&money);/*输入存取金额*/ } 3.在为了加入菜单,使用了switch语句已达到此目的
switch(i){ case 1:
init();/* 录入帐号 */
goto menu;
break;case 2:
work();/*存取款以及查询*/
goto menu;
case 3:
printf(“Thank for your using!”);/*退出程序*/
exit(1);} 4.为了让使用者在进行存取款操作后能够看清操作信心,使用延迟清屏语句是程序暂时停止,防止屏幕关闭
system(“pause”);//防止屏幕自动关闭,方便用户查看这次使用的过程,可按任意键结束
五 调试分析
1、在写程序过程中要注意中文标点和英文标点之间的区别,如果不小心输入了中文标点,在编译过程中会出现报错,而且错误不易发现;
2、每完成一整段代码后要记得打上分号,在出现报错后应及时补上。
3、注意函数定义之前必须进行对其的声明,养成良好的编程习惯。
4、尽量少使用递归的方式来调用函数,这样会减少一些逻辑上的错误。
六 测试结果
图1程序成功运行后的界面
在初次运行程序后,请先选择<1>对数组各项信息进行初始化,以便一下的操作
图2初始化卡号数量及每天操作次数上限,然后循环初始化卡号及卡上余额
图3进入存取款界面,输入存取款数目,成功操作后,系统自动输出操作信息
七 用户使用说明
使用者在打开软件后会出现相应的菜单界面,菜单上有相应操作的选项。用户只需根据菜单提示输入所需的操作序号即可进入后面的一系列操作。进行正确的初始化信息后,就可以正常的使用程序来模拟ATM机来进行存取款了,在使用过程中如果有操作错误,系统会自动的提示你直到操作正确。
八 课程设计总结
在做这个课程设计的过程中,一开始我碰到过很多困难,比如如何实现初始化卡号信息、以及账户里面各种信息的储存,虽然任务书里面有对相关的提示,但是一开始还是没有找到方法。然后在想到界面的优化时候,不知道什么方法能够实现在第一个用户使用完程序后进行全屏幕的清屏,方便后面的用户使用。然后通过调用system()函数达到清屏的效果。总之,这次课程设计让我学习到了很多东西,收获颇丰!
第二篇:数据结构课程设计报告
数据结构课程设计
散列表的应用:插队买票
专业 计算机科学与技术(网络技术)
金玲 计算机131 1310704114 张静林 2015年1月23日 学生姓名 班学级 号
指导教师 完成日期
目录概述……………………………………………………………………………………1 1.1 课程设计目的……………………………………………………………………….1 1.2 课程设计内容……………………………………………………………………….1 2 系统需求分析……………………………………………………………………….1 2.1 主体功能…………………………………………………………………………....2 3系统概要设计…………………………………………………………………………2 3.1 系统流程图………………………………………………………………………….2 4 系统详细设计…………………………………………………………………………3 5 测试……………………………………………………………………………………5 5.1 测试方案…………………………………………………………………………….5 5.2 测试结果…………………………………………………………………………….5 6 小结……………………………………………………………………………………5 参考文献…………………………………………………………………………………5 附录………………………………………………………………………………………7 附录1 源程序清单……………………………………………………………………...7 概述
1.1 课程设计目的
数据结构课程设计是为数据结构课程独立开设的实践性教学环节。数据结构课程设计对于巩固数据结构知识,加强学生的实际动手能力和提高学生综合素质是十分必要的。课程设计的目的:
1.要求学生达到熟练掌握C语言的基本知识和技能。
2.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力。3.提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
4.培养算法分析能力。分析所设计算法的时间复杂度和空间复杂度,进一步提高程序设计水平。
5.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能。
1.2课程设计内容
本课程设计的任务是写一个程序模拟这种情况。每个队伍都允许插队。如果你在排队,有一个以上的朋友要求插队,则你可以安排他们的次序。每次一个人入队,并且如果这个入队的人发现队伍中有自己的朋友,则可以插入到这个朋友的后面;当队伍中的朋友不止一个的时候,这个人会排在最后一个朋友的后面;如果队伍中没有朋友,则他只能够排在这个队伍的最后面。每一个入队的人都先进行上述的判断。当队伍前面的人买到车票之后,依次出队。系统需求分析
2.1 主体功能
程序从“input.txt”文件读入测试用例,一个文件可包含多个测试用例。每个用例的第一行是朋友组的数目n(1<=n<=1000)。对于一个朋友组以朋友的数目j(1<=j<=1000)开始,由朋友的个数以及他们的名字组成,一个空格后接该组朋友的名字,以空格分开,并且每个人的名字都不同。每个名字不超过四个字母,由{A,B,...,Z,a,b,...,z}组成。一个朋友组最多有1000个人,每个人只属于一个朋友组。n=0时,测试数据结束。
下面是一些具体命令:.ENQUEUE——X入队;.DEQUEUE——排队头的人买票,离开队伍,即出队;.STOP——一个测试用例结束。
测试结果输出到“output.txt”文件中。每个测试用例第一行输出“Scenario#k”,k是测试用例的序号(从1开始)。对每一个出队命令,输出刚买票离开队伍的人名。两个测试试用例 之间隔一空行,最后一个用例结束不输出空行。系统概要设计
3.1 系统流程图 系统详细设计
本题目主要解决两个问题:一是怎么存放和查找大量数据(主要是姓名);二是怎么操作“ENQUEUE”和“DEQUEUE”命令。
用散列表来存放和查找数据。由于最多有1000个朋友组,每组最多有1000人,使用平方探测法解决冲突,则表的大小是2*(1000*1000),所以选择TableSize=2000003(2000003是大于2000000的最小素数)。同一个组内的都是朋友,所以每个人除了记录他的名字name,还要记录他属于哪个组group,另外用info来表示该单元是否被占用,数据结构如图4.1所示。散列函数是根据Honer法则计算一个以64为阶的多项式,如图4.2所示。冲突解决方法采用平方探测法,如图4.3所示。
#define TabSize 2000003 typedef struct hashtab *PtrToHash;struct hashtab
/*散列表数据结构*/ { char name[5];
/*名字*/ int group;
/*属于哪个朋友组*/ char info;
/*标志位,该单元是否被占用*/ };图4.1数据结构:散列表
Int Hash(char *key,int TableSize){
Int HashVal=0;
While(key!=NULL)
HashVal=(HashVal<<6)+*key;
Return HashVal%TableSize;} 图4.2散列函数
Long int Find(PtrToHash hash,char *c){
key=c;
CurrentPos=Hash(key,TableSize);
CollisionNum=0;
While((单元被占用)and(单元内的名字与查找的名字不同))
{
CurrentPos+=2*(++CollisionNum)-1;
If(CurrentPos>=TabSize)
CurrentPos=TabSize;
}
Return CurrentPos;} 图4.3用平方探测法解决冲突
第二个问题是关于怎么操作“ENQUEUE”和“DEQUEUE”命令。这可以用队列来模拟。由于有插队现象的存在,不能单纯的用一个数组来表示队列,因为这样的话,插入一个朋友,则他后面的人都要往后移一个单位,删除一个人,则他后面的人都要前移一个,会降低效率。所以,采用一个Index标记来表示当前元素的后继元素,最后一个单元的后继元素是第0个,形成环,数据结构如图4.4所示。不用链表是因为链表存放指针也需要空间,并且链表插入、删除的效率没有数组高。
typedef struct Que *PtrToQue;struct Que
/*队列数据结构*/ { long int HashVal;
/*散列值*/ long int Index;
/*在中的队列序号*/ };图4.4数据结构:队列
输入ENQUEUE命令,如果队伍里有朋友,则排在朋友后面;如果没有朋友,则排在队尾。入队时,用一个数组记录每个朋友组的最后一位,以便下一个朋友到来时排到他后面,这个数组被称为“插队数组”。
输入DEQUEUE命令,则根据“先进先出”,按照各个元素和它后继元素的先后顺序,每次删除队列重的第一个。程序结构如图4.5所示。
While(读测试文件){
if(输入”ENQUEUE”)
{
读入名字;
插入散列表;
插入队列;
}
else if(输入”DEQUEUE”)
{
删除队列第一个名字;
将该名字输出到文件;
}
else stop;} 图4.5入队、出队操作 测试
5.1 测试方案 按输入要求输入正常测试数据,测试程序是否能正确解决问题,得到正确答案。应注意边界测试。例如,将n,j分别取为1的用例和n为1000的用例。n,j比较大时需写程序生成测试用例。
不按输入要求输入数据,测试程序能否对输入内容进行数据合法性检测并进行相应的异常处理。例如,将n或j取为小于1或大于1000的数,名字超过4个字母等情况下的测试用例。5.2 测试结果 小结
在前面的学习过程中我们学到了很多知识而这次课程设计又是对我们所学的 一次总结,刚开始,可以说是没有头绪,于是就去图书馆找资料,找到了一些关于程序方面的,可这远远不够,这只是小小的开始。我们必须掌握很多已学的知识才能很好的完成本次的课程设计。在这次课程设计中,总的感觉是我遇到了很多困难这主要是由于我编写代码的经验不足,有时虽然是一个很小的问题但解决起来却花费了我不少的时间,值得欣慰的是,当自己苦思冥想或者和其它同学一起探讨把问题解决的时候我还是觉得获益非浅,这就是在摸索中寻求到的知识。在设计时也免不了存在着些不足,所以在今后的学习中我会努力取得更大的进步。虽然对着电脑做程序,有些累,可当看到劳动成果时,却有另一番滋味。
参考文献
[1]范策,周世平,胡晓琨.《算法与数据结构(C语言版)》[M].北京:机械工业出版社,2004 [2]严蔚敏.《数据结构(C语言版)》.北京:清华大学出版社,2004 [3]许卓群,杨冬青,唐世渭,张铭.《数据结构与算法》.北京:高等教育出版社,2004 [4]徐孝凯.《数据结构实用教程(第二版)》.北京:清华大学出版社,2006
附录
附录1 源程序清单
#include
/*散列表大小TabSize 是大于表最大空间的素数*/ #define Max 1000001
/*队列空间最大值*/ struct hashtab;typedef struct hashtab *PtrToHash;struct hashtab
/*散列表数据结构*/ { char name[5];
/*名字*/ int group;
/*属于哪个朋友组*/ char info;
/*标志位,该单元是否被占用*/ };struct Que;typedef struct Que *PtrToQue;struct Que
/*队列数据结构*/ { 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;
/*散列值*/ CollisionNum=0;/*如果当前单元被占用:单元内的元素与当前操作的名字不同,使用平方探测法解决冲突;与当前操作的名字相同,则直接返回在散列中的位置*/ while((hash[CurrentPos].info)&&(strcmp(hash[CurrentPos].name,c)))
{
/*平方探测法*/
CurrentPos+=2*(++CollisionNum)-1;
if(CurrentPos>=TabSize)
CurrentPos-=TabSize;}
if((hash[CurrentPos].info)&&(strcmp(hash[CurrentPos].name,c)==0))
/*元素已经在散列表里*/
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 head,last;
/*队列的头和尾*/ char c[8],tempc[8];
/*名字*/ 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;}
hash=(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 queue[i].Index=j;queue[i-1].Index=0;/*最后一个单元的后继单元是第0个,形成环*/ 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 hash[i++].info=0; /*初始化散列表,标记位置0*/ for(i=0;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 tempc[ii]=' '; strcpy(tempc,c); ii=0; while(tempc[ii]!=' ') /* 是否由四个以内字母组成*/ { if(tempc[ii]<'A'||('Z' { fprintf(fpout,“Group %d: Nonstandard namen ”,i); return-1; } ii++; } key=Find(hash,c); /*找到在散列表中的位置*/ if(hashedx==1)/*重名*/ { fprintf(fpout,“repeated name %sn”,c); return-1; } strcpy(hash[key].name,c);/*插入散列表*/ hash[key].info=1; /*标记置1,该单元被占用*/ hash[key].group=i; /*记录他属于哪个组*/ } } for(i=0;i<1000;) grouppos[i++]=0;/*初始化插队数组*/ head=0; /*初始化队列头、尾标记*/ last=0;fprintf(fpout,“Scenario #%dn”,num);/*输出当前用例序号到文件*/ for(fscanf(fpin,“%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=queue[0].Index; /*队列第0个位置记录队尾的后继单元*/ queue[0].Index=queue[temp].Index; /*在队列中申请一个新单元,队尾标记后移一个位置 */ queue[temp].HashVal=key;/*入队*/ if(!head)/*如果是队列里的第一个元素 */ last=head=temp;/*队头、队尾标记指向第一个元素*/ if(!grouppos[hash[key].group])/*如果队列里没朋友*/ { queue[temp].Index=0;/*队尾指向对头,形成环*/ queue[last].Index=temp;/*前一次队尾的后继元素是当前元素*/ last=temp; /*队尾标记指向当前元素*/ grouppos[hash[key].group]=temp;/*插队数组记录该朋友组里已入队的最后一位*/ } else/*如果队列中已经有他的朋友*/ { queue[temp].Index=queue[grouppos[hash[key].group]].Index; /*插队到朋友的后面*/ queue[grouppos[hash[key].group]].Index=temp; /*插队到朋友后面一位的前面*/ grouppos[hash[key].group]=temp; /*替换插队数组里该组的元素为当前元素*/ if(hash[queue[last].HashVal].group==hash[key].group) /*如果当前元素和前一元素是朋友,队尾标志指向当前元素*/ last=temp; } } else if(*c=='D')/*出队命令*/ { if(last==0) /*不能对空队列执行出队命令*/ { fprintf(fpout,“Empty queue!nCan't execute DEQUEUE!n”); return-1; } fprintf(fpout,“%sn”,hash[queue[head].HashVal].name); /*输出队头元素到文件*/ temp=head; head=queue[temp].Index; /*队列第一位出队,队头标记后移一位*/ queue[temp].Index=queue[0].Index; /*队列第0个元素后移一位*/ queue[0].Index=temp; /*释放空间*/ if(grouppos[hash[queue[temp].HashVal].group]==temp) /*当前删除的元素是该朋友组在队列里的最后一位*/ grouppos[hash[queue[temp].HashVal].group]=0; if(last==temp) /*出队后,队列为空*/ last=0; } else /*输入 “STOP”*/ break; /*测试结束*/ } } fprintf(fpout,“b”);fclose(fpin);fclose(fpout);return 1;} 正文要求:对每一个题目,正文必须包括以下几个方面 知识点回顾: 实验要求: 实验过程:包括设计思路,算法描述,程序清单,调试等等; 实验小结: 注意:(1)正文中字体用小四号宋体,行间距1.25倍行距; (2)页码居中; (3)A4纸双面打印,在纸的左侧装订。 (4)上交的课程设计报告控制在10页以内。 齐鲁工业大学 理学院 信计11-1 郑桥 一、提示:对于单窗口的服务系统知识点回顾如下: 1、什么是负指数分布? 又称指数分布。泊松事件流的等待时间(相继两次出现之间的间隔)服从指数分布。用于描述非老化性元件的寿命(元件不老化,仅由于突然故障而毁坏)。常假定排队系统中服务器的服务时间和Petri网中变迁的实施速率符合指数分布。 2、用C语言如何产生随机序列? double rd_MN1(double m,double n){ double r;if(m>n){r=n;n=m;m=r;};r =((double)rand()/((double)(RAND_MAX)+(double)(1)));r = m+ r*(n-m);return r;} 3、用C语言如何产生负指数分布的时间序列? double expntl(double x){ double z;do { z =((double)rand()/ RAND_MAX);} while((z == 0)||(z == 1));return(-x * log(z));//z相当于1-x,而x相当于1/lamda。} 其中的x相当于1/λ 4、排队论简单叙述; 排队系统主要有:X/Y/Z,其中X表示到达时间间隔的分布,Y表示服务时间的分布,Z表示并列的服务设备的数目。表示相继到达的时间间隔或服务时间的分布的符号是: M——负指数分布,D——确定性,Ek——k阶Erlang,GI——相互独立的一般随机分布,G——一般的随机分布。 例如:M/M/1表示达到时间间隔为负指数分布,服务时间为负指数分布,单服务设备的排队系统。 这里我们用静态仿真的思想来实现M/M/1仿真。在排队系统中的每一个动态实体的状态可以有三个量来反映:与前一个实体到达的时间间隔,在排到自己服务前的等待时间以及服务时间。其中服务时间和到达时间间隔服从指数分布,不受别的因素的影响。开始服务前的等待时间则受到排在前面的动态实体的状态的影响。其更新算法如下: 即:如果某个实体到达以后,发现处在它前面的动态实体已经结束服务,所以这个实体就不用等待,直接接受服务;反之,处在它前面的动态实体如果没有结束服务(包括没有开始服务),则这个实体的等待时间就是它前一实体结束服务的时刻减去它到达的时刻。 5、如何得到每个顾客的到达时刻,服务时间,等待时间和离开时刻; 到达时间=前面各个到达时间之和; 服务时间就是负指数随机生成的时间; 等待时刻:如果前一个人的离开时间小于这个人的到达时间,等待时间=0; 如果不是,则等待时间=该人的离开时间-他的到达时间-服务时间 6、如何排队,排队的主要算法思想? 排队就是来到的人数多于离开的人数; 如果下一个人到达时前一个人依旧在接受服务,则此人就要排队。 7、如何求队长?以及最大的队长? 假设以5分钟为一个时间段,则在第5分钟时用这5分钟内来到的人数减去这5分钟内离开的人数即是排队人数 8、如何求平均等待时间? 求平均等待时间首先要求出总的等待时间与接受服务的人数; 总的等待时间=每个人的等待时间之和;接受服务的人数由时间540分钟来控制,如果在540分钟之后才到达的人则不再算入接受服务的人数之内。 9、用C语言如何将得到的数据输出到文件? 在C语言中用fopen函数打开文件,然后把数据输出比如用fprintf函数,最后fclose。 利用ofstream fcout(“d:arr_time.txt”);语句来实现C++中的输出文件 10、如何用已学的数学语言程序(如:Mathematica, Matlab)把C语言得到的数据文件画出其相应的图像? 11、如果是两个窗口的服务系统,则该怎么修改程序? 12、如果到达时间间隔,服务时间服从泊松分布或者其他分布,该程序该如何改进? 二、数据结构课程设计题目 单窗口的排队模型的数值仿真(参考课本上第四章的离散事件模拟)要求如下:(1)要求相邻两个顾客的到达时间间隔服从负指数分布;且每个顾客接受服务的时间也服从负指数分布; (2)求出各个时刻的队长(以五分钟为一时间单位,即求零时刻的队长,五分钟时的队长,十分钟时的队长,依次类推); (3)一个工作日内的顾客总数,约定8:30上班,17:30下班,中午不休息;(4)求平均等待时间(顾客总等待时间除以总人数); (5)画出顾客的到达,离开图像(横坐标是顾客图,纵坐标是到达时刻,和离开时刻); (6)画出队长变换图像(横坐标是时刻图,纵坐标是队长个数);(7)求出一个工作日内的最大队长; 三、设计思路: 1)把8::30记做第0分钟,17:30记做第540分钟。 2)首先利用C++随机生成200个服从负指数分布的到达时间与200个服务时间 然后根据随机生成的数计算到达的时刻,即到达时间的逐步加和,然后计算离开的时刻; 3)根据到达时刻与离开时刻来计算等待时刻,于是便可得到平均等待时间; 同时根据这两个时刻求出每5分钟到达人数与离开的人数,于是便得出每5分钟的队长,同时也可求出最大队长。4)再利用MATLAB画出相应的图像。 四、算法描述: 1)首先将8:30这个时刻化为0时刻,17:30化为第540分钟这个时刻,全体单位为分钟。 2)定义到达时间间隔arr_time[200],服务时间ser_time[200],到达时刻arr_time1[200],离开时间lea_time[200],等待时间sta_time[200],离开人数lea_num[200],到达人数arr_num[200]等变量。3)根据负指数函数 来利用C++程序生成随机到达时间间隔与服务时间。 4)利用到达时刻与离开时刻之间的关系来求出等待时间。同时将这540分钟划分为5分钟间隔的108个时间段来求出在每个时间段到达人数与离开人数,再求出队长。 5)利用已知的服务人数,平均到达时间与平均离开时间来做出图像。(借助MATLAB软件。) 五、总结 (1)求出各个时刻的队长(以五分钟为一时间单位,即求零时刻的队长,五分钟时的队长,十分钟时的队长,依次类推);见程序清单中数据部分对长。(2)求平均等待时间(顾客总等待时间除以总人数);根据程序可得,平均等待时间为21.6分钟。 (3)画出顾客的到达,离开图像(横坐标是顾客图,纵坐标是到达时刻,和离开时刻); ***0100806040200 0Arrive curveleave curve***600 (6)画出队长变换图像(横坐标是时刻图,纵坐标是队长个数); 25Queue Length Curve 20151050 ***0600 (7)求出一个工作日内的最大队长: 最大对长为16个人在排队。 六、程序清单: 求随机产生负指数 #include #include void main(){ long int i,k;double m,n;//m,n控制时间间隔 double r;double a,s,sum;//arr为到达时间,ser为服务时间 double LAM=1.2; //f(x)=LAM*exp(-LAM*x);double arr_time[200];double ser_time[200];ofstream fcout(“d:arr_time.txt”);ofstream fscout(“d:ser_time.txt”);m=2.0;n=5.0;srand((unsigned)time(NULL)); k=0;loop: r=((double)rand()/((double)(RAND_MAX)+(double)(1))); a =-log(r)/LAM;if(a >= m && a <= n){ arr_time[k]=a; k++;};if(k < 200)goto loop; // 产生200个指数分布随机数 for(i=0;i<200;i++){ fcout< //cout< if(i!=0 && i%5==0) //cout< fcout< s =-log(r)/LAM;if(s >= m && s <= n){ ser_time[k]=s;k++;};if(k < 100)goto loop1; // 产生200个指数分布随机数 m=3.0;n=5.5; srand((unsigned)time(NULL));k=100;loop2: r=((double)rand()/((double)(RAND_MAX)+(double)(1))); s =-log(r)/LAM;if(s >= m && s <= n){ ser_time[k]=s;k++;};if(k < 200)goto loop2; // 产生200个指数分布随机数 for(i=0;i<200;i++){ fscout< //cout< if(i!=0 && i%5==0) //cout< fscout< #include double sta_time[200];//等待时间 double arr_time[200];//随机生成到达时间 double ser_time[200];//随机生成服务时间 double arr_time1[200];//到达时间 ifstream fcin(“d:arr_time.txt”);ifstream fscin(“d:ser_time.txt”);ofstream fcout(“d:arr_time1.txt”);ofstream flcout(“d:lea_time.txt”);ofstream fscout(“d:sta_time.txt”); //求到达的时间 for(i=0;i<200;i++){ fcin>>arr_time[i]; arr_time1[i]=arr_time[i];} double sum=0.0;for(i=0;i<200;i++){ sum+=arr_time1[i]; arr_time1[i]=sum;} for(i=0;i<200;i++){ fcout< if(i!=0 && i%5==0) fcout< //求离开时间 fscin>>ser_time[0];lea_time[0]=arr_time1[0]+ser_time[0];for(i=1;i<200;i++){ fscin>>ser_time[i]; if(lea_time[i-1]>arr_time1[i]) {lea_time[i]=lea_time[i-1]+ser_time[i];} else {lea_time[i]=arr_time1[i]+ser_time[i];} } for(i=0;i<200;i++){ flcout< if(i!=0 && i%5==0) flcout< sta_time[i]=lea_time[i]-arr_time1[i]-ser_time[i];// if(sta_time[i]<0) { sta_time[i]=0; } } for(i=0;i<200;i++){ fscout< if(i!=0 && i%5==0) fscout< sta_sum+=sta_time[i];} //求平均等待时间 double ave;int peo_sum;for(i=0;i<200;i++){ if(lea_time[i]<540) peo_sum=i;} cout<<“总的服务人数为:”< 求离开人数和到达人数 #include #include int i,j; int arr_num[200];//到达人数arr int lea_num[200];//lea离开人数 int arr_jian=0;//时间间隔 double arr_time1[200];double lea_time[200];int peo_sum;int count=0;int count1=0;ifstream fcin(“d:arr_time1.txt”);ifstream flcin(“d:lea_time.txt”);ofstream fcout(“d:arr_num.txt”);ofstream flcout(“d:lea_num.txt”);for(i=0;i<200;i++){ fcin>>arr_time1[i]; flcin>>lea_time[i];} for(i=0;i<200;i++){ if(lea_time[i]<540) peo_sum=i;} while(arr_jian<540){ for(i=0;i { if(arr_time1[i]>arr_jian) { arr_num[count]=i; count++; //cout< break; } } for(j=0;j { if(lea_time[j]>arr_jian) { lea_num[count1]=j; count1++; break; } } arr_jian=arr_jian+5;} for(i=0;i<108;i++){ fcout< //cout< if(i!=0 && i%5==0) //cout< fcout< for(i=0;i<108;i++){ flcout< //cout< if(i!=0 && i%5==0) //cout< flcout< 求对长 #include int i;int max;int que[200];int arr_num[200];int lea_num[200];ifstream fcin(“d:arr_num.txt”);ifstream flcin(“d:lea_num.txt”);ofstream fcout(“d:que.txt”); for(i=0;i<200;i++){ fcin>>arr_num[i]; //cout< flcin>>lea_num[i]; //cout< for(i=0;i<200;i++){ que[i]=arr_num[i]-lea_num[i]; //cout< } for(i=0;i<200;i++){ fcout< if(i!=0 && i%5==0) { fcout< } } max=que[0];for(i=1;i<200;i++) { if(que[i]>max) { max=que[i]; //cout< } } cout<<“最大对长是”< 画图: function[maxque,mwait_t,mstay_t,queue_l,use_rate]=MM1queue(mean_arr,mean_lea,peo_num)status=zeros(3,peo_num); %用一个3行矩阵表示每个顾客的状态; %到达时间间隔,服务时间,等待时间;status(1,:)=exprnd(mean_arr,1,peo_num); %按照指数分布随机生成各顾客的到达间隔;status(2,:)=exprnd(mean_lea,1,peo_num); %按照指数分布随机生成各顾客的服务时间;for i=2:peo_num if status(1,i)<=status(2,i-1)+status(3,i-1) status(3,i)=status(2,i-1)+status(3,i-1)-status(1,i); else status(3,i)=0; end; %对状态进行更新; end;arr_time=cumsum(status(1,:));status(1,:)=arr_time;lea_time=sum(status);stairs([0 arr_time],0:peo_num); %绘出各顾客的到达时间图; hold on;stairs([0 lea_time],0:peo_num,'r'); %绘出各顾客的离去时间图;legend('Arrive curve','leave curve',0)hold off figure;plot(1:peo_num,status(3,:),'r:',1:peo_num,status(2,:)+status(3,:),'k-'); %绘出每个顾客的等待时间和停留时间;legend('Wait Time','Stay Time',0);n1=1;n2=1;mstay_t=(sum(status(2,:))+sum(status(3,:)))/peo_num;mwait_t=mean(status(3,:)); %求平均停留时间和等待时间;queue_num=zeros(1,2*peo_num+1);queue_time=zeros(1,2*peo_num+1);n3=1; %while循环求每个时间队列的长度;while n1<=peo_num n3=n3+1; if arr_time(n1) queue_num(1,n3)=n1-n2+1; queue_time(1,n3)=arr_time(n1); n1=n1+1; else queue_num(1,n3)=n1-n2-1; queue_time(1,n3)=lea_time(n2); n2=n2+1; end;end;while n2<=peo_num n3=n3+1; queue_num(1,n3)=peo_num-n2; queue_time(1,n3)=lea_time(n2); n2=n2+1;end;figure;stairs(queue_time,queue_num,'k'); %绘出队列长度的时间变化曲线, stairs 是Matlab的函数 legend('Queue Length Curve',0);hold off;temp=diff(queue_time);overtime=max(queue_time);queue_l=sum(temp.*queue_num(2:(2*peo_num+1)))/overtime;use_rate=sum(temp(find(queue_num)))/overtime;maxque=max(queue_num);% 最大队长 在MATLAB中命令窗口中输入MM1queue(2.86,3.22,175)数据结果: 随机到达时间arr_time 2.2218 2.91038 2.70151 3.20392 2.20729 2.23954 2.27037 2.12161 2.97105 2.59537 2.05195 2.33276 2.40885 2.54536 3.18395 4.34619 2.9621 4.03687 2.56005 4.3556 2.59767 2.6854 2.2156 2.35007 2.01546 3.16558 2.51725 2.4227 3.00499 2.68796 2.57445 2.29238 2.04275 3.56593 4.12181 3.14539 4.60806 2.85305 2.18215 4.15836 2.75386 2.45691 3.15095 3.84449 3.29556 2.35349 2.88082 2.96656 2.60517 3.09175 3.77562 2.12649 2.17347 2.28761 2.91709 2.59767 2.20084 3.64077 2.09167 2.30401 2.89137 2.78563 2.35564 2.60401 3.47721 2.31212 2.2892 2.26189 2.71001 3.23541 3.15543 4.04989 2.33905 2.60575 2.93069 2.63466 2.33025 2.67211 2.13304 2.46765 2.01119 2.66026 2.17867 4.26591 2.56115 2.84451 3.37485 2.22326 2.3109 3.08451 2.75872 3.02393 2.32155 2.37607 2.43489 3.70764 3.07631 2.56943 2.81941 2.81567 2.18215 3.78511 2.72393 2.02062 2.28013 2.03219 2.9324 4.02088 2.83606 2.01804 2.82241 2.23062 2.38448 2.15369 4.07996 2.02407 2.77847 2.93584 4.92381 4.07996 2.52143 2.10523 3.29291 2.34922 2.60807 2.83989 3.77091 2.4652 2.12096 2.36601 4.23257 2.29039 2.03278 3.42756 3.04233 2.80972 4.46149 2.04867 3.6673 2.04363 3.56409 4.8267 4.40435 3.60347 2.01375 4.41955 2.28406 2.49971 2.85853 2.11547 2.29079 2.2037 3.0078 2.43726 2.43963 3.82172 2.26189 3.14207 3.02297 2.39612 2.26381 3.59773 2.454 4.98197 3.60539 3.04233 3.21228 2.48553 2.16591 2.17244 2.25882 2.11773 3.77326 2.1113 3.15319 2.4011 2.66648 3.58261 3.36182 2.74012 2.16046 2.53464 2.21742 2.48754 2.86484 2.45837 2.4213 2.81047 4.02405 2.08667 2.24179 2.17971 3.1465 2.96925 2.07709 2.6139 3.48217 4.50565 3.25667 2.71528 随机服务时间ser_time 1.36266 1.25234 1.19953 1.81288 1.7025 1.49777 1.18475 1.2005 2.2218 2.91038 1.69353 1.06181 1.95277 1.86629 1.35603 1.36501 1.98628 1.05845 1.48635 2.70151 1.56285 1.7392 1.00964 1.69024 1.23548 1.68311 3.20392 2.20729 2.23954 1.0431 1.986 1.09644 2.27037 1.53367 2.12161 2.97105 1.68177 2.59537 2.05195 1.54594 1.24156 1.42946 2.33276 1.06994 2.40885 1.9069 2.54536 3.18395 4.34619 2.9621 1.09313 4.03687 2.56005 1.01332 1.97996 1.76143 1.26501 1.34689 1.66416 4.3556 1.6471 1.46631 2.59767 2.6854 1.92952 1.51985 1.85138 1.04044 2.2156 1.30726 1.1663 1.16661 5.21173 2.35007 1.3357 1.00973 2.01546 3.16558 2.51725 1.27905 2.4227 1.04284 1.69508 1.63761 1.13783 1.05052 1.94433 1.53127 3.00499 2.68796 2.57445 2.29238 1.40015 1.2112 1.64527 2.04275 1.29598 1.29286 3.56593 1.07538 3.20392 3.18395 4.34619 4.03687 4.3556 5.21173 3.16558 3.00499 3.56593 4.12181 3.14539 4.60806 4.15836 3.15095 3.84449 3.29556 5.29513 3.09175 3.77562 3.64077 3.47721 3.23541 3.15543 4.04989 4.26591 3.37485 3.08451 3.02393 3.70764 3.07631 3.78511 4.02088 4.07996 4.92381 4.07996 3.29291 3.77091 4.23257 3.42756 3.04233 4.46149 3.6673 3.56409 4.8267 4.40435 3.60347 4.41955 3.0078 3.82172 3.14207 3.02297 3.59773 4.98197 3.60539 3.04233 3.21228 3.77326 3.15319 3.58261 3.36182 5.0445 4.02405 3.1465 3.48217 4.50565 3.25667 4.85208 4.16211 4.13261 3.21952 3.46087 3.74548 4.5463 3.72969 3.29423 3.0804 3.08657 3.47556 4.09022 3.17586 5.29513 3.75694 3.74548 3.30222 3.01725 3.18627 3.40305 4.12539 3.49556 3.02777 3.87053 3.39703 3.51433 3.67983 3.27072 4.11115 4.22444 4.08337 3.37339 5.03375 到达时刻:arr_time1 2.2218 5.13218 7.83369 11.0376 13.2449 15.4844 17.7548 19.8764 22.8475 25.4428 27.4948 29.8276 32.2364 34.7818 37.9657 42.3119 45.274 49.3109 51.8709 56.2265 58.8242 61.5096 63.7252 66.0753 68.0907 71.2563 73.7736 76.1963 79.2012 81.8892 84.4637 86.756 88.7988 92.3647 96.4865 99.6319 104.24 107.093 109.275 113.434 116.187 118.644 121.795 125.64 128.935 131.289 134.17 137.136 139.741 142.833 146.609 148.735 150.909 153.196 156.113 158.711 160.912 164.553 166.644 168.948 171.84 174.625 176.981 179.585 183.062 185.374 187.664 189.925 192.635 195.871 199.026 203.076 205.415 208.021 210.952 213.586 215.917 218.589 220.722 223.189 225.201 227.861 230.039 234.305 236.867 239.711 243.086 245.309 247.62 250.705 253.463 256.487 258.809 261.185 263.62 267.327 270.404 272.973 275.793 278.608 280.79 284.575 287.299 289.32 291.6 293.632 296.565 300.586 303.422 305.44 308.262 310.493 312.877 315.031 319.111 321.135 323.913 326.849 331.773 335.853 338.374 340.48 343.773 346.122 348.73 351.57 355.341 357.806 359.927 362.293 366.525 368.816 370.849 374.276 377.318 380.128 384.59 386.638 390.306 392.349 395.913 400.74 405.144 408.748 410.762 415.181 417.465 419.965 422.823 424.939 427.23 429.433 432.441 434.878 437.318 441.14 443.402 446.544 449.567 451.963 454.227 457.824 460.278 465.26 468.866 471.908 475.12 477.606 479.772 481.944 484.203 486.321 490.094 492.205 495.359 497.76 500.426 504.009 507.371 510.111 512.271 514.806 517.023 519.511 522.376 524.834 527.255 530.066 534.09 536.176 538.418 540.598 543.744 546.714 548.791 551.405 554.887 559.393 562.649 565.364 离开时刻:lea_time 3.58446 6.38452 9.03322 12.8505 14.9474 16.9822 18.9396 21.0769 25.0693 28.3532 30.0467 31.1086 34.1892 36.6481 39.3217 43.6769 47.2603 50.3693 53.3573 58.928 60.4909 63.2488 64.7348 67.7655 69.3262 72.9394 76.9775 79.1848 81.4408 82.9323 86.4497 87.8525 91.0692 93.8984 98.6081 102.603 105.922 109.688 111.74 114.979 117.429 120.074 124.128 126.71 131.344 133.251 136.715 140.32 144.666 147.628 148.722 152.772 155.332 156.345 158.325 160.472 162.177 165.9 168.308 173.304 174.951 176.417 179.579 182.27 184.992 186.894 189.515 190.966 194.851 197.178 200.193 204.243 210.627 212.977 214.313 215.322 217.932 221.754 224.271 225.551 227.973 229.016 231.735 235.943 238.004 240.762 245.03 246.84 250.625 253.393 256.038 258.78 260.209 262.396 265.265 269.37 271.7 274.266 279.358 280.434 283.994 287.759 292.106 296.142 300.498 305.71 308.875 311.88 315.446 319.568 322.713 327.322 331.48 334.631 338.475 341.771 347.066 350.158 353.933 357.574 361.051 364.287 367.442 371.492 375.758 379.133 382.217 385.241 388.949 392.025 395.81 399.831 403.911 408.835 412.915 416.208 419.979 424.211 427.639 430.681 435.143 438.81 442.374 447.201 451.605 455.209 459.628 462.636 466.458 469.6 472.623 476.22 481.202 484.808 487.85 491.062 494.836 497.989 501.572 504.933 509.978 514.002 517.148 520.631 525.136 528.393 533.245 537.407 541.54 544.759 548.22 551.966 556.512 560.242 563.536 566.616 569.703 573.178 577.269 580.444 585.74 589.496 593.242 596.544 599.561 602.748 606.151 610.276 613.772 616.799 620.67 624.067 627.581 631.261 634.532 638.643 642.867 646.951 650.324 655.358 到达人数:peo_num 0 1 3 5 8 9 12 14 15 16 18 19 21 23 25 27 29 31 33 34 36 39 40 42 43 45 47 49 50 52 54 56 58 60 62 64 65 68 69 71 74 76 78 80 82 84 86 87 89 91 93 95 96 98 100 102 104 106 107 109 111 113 115 117 118 119 121 123 125 126 129 130 132 134 135 137 138 140 141 142 144 145 148 150 152 154 155 157 159 161 162 163 165 166 167 169 170 171 173174 175 177 离开人数:lea_num 0 1 3 5 7 8 10 13 15 16 17 19 20 23 25 26 28 30 32 34 35 38 40 41 43 44 46 47 49 51 52 55 57 59 61 63 65 67 69 70 72 75 77 79 82 83 85 86 88 90 92 94 96 98 99 101 102 103 104 105 107 108 110 111 112 114 115 116 117 119 120 122 123 124 127 129 130 132 133 134 135 137 138 139 140 142 143 144 147 148 150 151 152 154 155 157 158 160 161 162 队长que 0 0 0 0 1 1 2 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 0 1 0 1 2 1 1 2 1 1 1 1 1 0 1 0 1 0 2 1 1 1 0 1 1 1 1 1 1 0 0 1 1 2 3 3 4 4 5 5 6 6 5 6 7 8 7 9 8 9 10 0 10 9 10 9 9 10 10 11 12 13 14 13 14 15 16 15 15 15 15 0 0 0 0 0 0 0 0 605040302010Wait TimeStay Time***401601800 0 数据结构课程设计的实习报告怎么写呀,请求做过课设的同学发一篇范文过来谢谢-_-规范实习报告的开头应给出题目、班级、姓名、学号和完成日期,并包括以下七个内容: 1、需求分析以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?明确规定:(1)输入的形式和输入值的范围;(2)输出的形式;(3)程序所能达到的功能;(4)测试数据:包括正确地输入及其输出结果和含有错误的输入及其输出结果,数据结构实习报告。 2、概要设计说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。 3、详细设计实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);画出函数的调用关系图。 4、调试分析内容包括:(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;(2)算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进思想;(3)经验和体会等,实习报告《数据结构实习报告》。 5、用户使用说明说明如何使用你编写的程序,详细列出每一步操作步骤。 6、测试结果列出你的测试结果,包括输入和输出。这里的测试数据应该完整和严格,最好多于需求分析中所列。 7、附录题目:约瑟夫-实习报告尺寸:约瑟夫-实习报告.doc目录: 一、需求分析 二、概要设计 三、程序具体设计及函数调用关系 四、调试分析 五、测试结果原文:实习报告题目:约瑟夫(Joseph)问题的一种描述是:编号为1,2,.,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个开始重新从1报数,如此下去,直至年有人全部出列为止。试设计一个程序求出出列顺序。班级:姓名:学号:完成日期: 一、需求分析1.本演示程序中,利用单向循环链表存储结构存储约瑟夫环数据(即n个人的编号和密码)。2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中需要输入的数据,运算结果显示在其后。3.程序执行的命令包括:1)构造单向循环链表;2)4.测试数据m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m值为6(正确的出列顺序为6,1,4,7,2,1,3,5)。 二、概要设计1.单向循环链表的抽象数据类型定义为:ADT List{数据对象:D={ai|ai∈正整数,I=1,2,.,n,n≥0}数据关系:R1={ai-1,ai|,ai-1,ai∈D,I=1,2,.,n}基本操作:Init List(&L)操作结果:构造一个空的线性表L。List Insert(&L,i,e)初始条件:线性表L已存在,1≤i≤List Length(L)+1.操作结果:在L中第i个位置之前插入新的数据无素e,L长度加1。List Delete(&L,i,&e)初始条件:线性表L存在非空,1≤i≤List Length(L).操作结果:删除L的第i个元素,并用e返回其值,L长度减1。2.程序包含四个模块:1)主程序模块:void main(){. 数据结构第六次作业p134 ——11411203张玉 24.template void SeqQueue if(IsFull()==true){ maxSize=2*maxSize; elements[rear]=x; rear=(rear+1)%maxSize; } elements[rear]=x; rear=(rear+1)%maxSize; }; template bool SeqQueue if(rear<=maxSize/4){ maxSize=maxSize/2; x=elements[front]; front=(front+1)%maxSize; } x=elements[front]; front=(front+1)%maxSize; return true; }; 29.// 利用优先级队列实现栈和队列 #include template template template class PQueueNode { friend class PQueue friend class Queue public: PQueueNode(T &value, int newpriority, PQueueNode virtual int GetPriority(){ return priority;}//取得结点优先级 virtual PQueueNode virtual void SetData(T& value){ data = value;}//修改结点数据 virtual void SetPriority(int newpriority){ priority = newpriority;} //修改结点优先级 virtual void SetLink(PQueueNode T data;//数据 int priority;//优先级 PQueueNode }; //优先级队列的类定义 template class PQueue { friend class Stack friend class Queue public: PQueue():front(NULL), rear(NULL){}//构造函数 virtual ~PQueue(){ MakeEmpty();}//析构函数 virtual void Insert(T &value, int newpriority);//插入新元素value到队尾 virtual T Remove();//删除队头元素并返回 virtual T Get();//读取队头元素的值 virtual void MakeEmpty();//置空队列 virtual int IsEmpty(){ return front == NULL;}//判队列空否private: PQueueNode };template void PQueue { //将优先级队列置空 PQueueNode while(front!= NULL)//链不空时, 删去链中所有结点 { //循链逐个删除 q = front; front = front->link; delete q; } rear = NULL;//队尾指针置空 }template void PQueue { //插入函数 PQueueNode front = rear = q;//队列空时新结点为第一个结点 else { PQueueNode while(p!= NULL && p->priority >= newpriority)//队列中按优先级从大到小链接{ pr = p; p = p->link; } if(pr == NULL) { //插入在队头位置 q->link = front; front = q; } else { q->link = p; pr->link = q;//插入在队列中部或尾部 if(pr == rear) rear = q; } } } //删除队头元素并返回 template T PQueue { if(IsEmpty()) return NULL;PQueueNode front = front->link;//将队头结点从链中摘下 T &retvalue = q->data; delete q; if(front == NULL) rear = NULL;return retvalue; } //读取队头元素的值 template T PQueue if(IsEmpty()) return NULL; else return front->data; } //(1)栈的定义与实现 template class Stack:public PQueue { //栈类定义 public: Stack():PQueue void Insert(T & value);//插入新元素value到队尾 };template void Stack { //插入函数 PQueueNode else { //插入在前端 q->link = front; front = q; } }//--------------------------Queue //(2)队列的定义与实现 template class Queue:public PQueue { //队列类定义 public: Queue():PQueue void Insert(T & value);//插入新元素value到队尾 };template void Queue { //插入函数 PQueueNode if(IsEmpty()) front = rear = q;//队列空时新结点为第一个结点 else rear = rear->link = q;//插入在队尾位置 void main(){ Stack int n = 1; aStack.Insert(n);aQueue.Insert(n);}第三篇:数据结构课程设计报告
第四篇:数据结构实习报告
第五篇:数据结构实习报告