数据结构——电梯模拟的报告

数据结构——电梯模拟的报告
数据结构——电梯模拟的报告

数据结构课程设计报告

1
页,共

1.课程设计目的
1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定 问题。 2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并 在此过程中培养他们严谨的科学态度和良好的工作作风。
2.课程设计任务与要求:
任务 根据教材《数据结构题集(C 语言版)(严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数 》 据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解 和综合运用。 设计题目从《数据结构题集》 “第二篇 实习篇”中选取,每班每题不得超过 2 人。 另选题: 学生自选课题 学生原则上可以结合个人爱好自选课题,要求课题有一定的深度与难度,有一定的算法复杂性,能够巩固 数据结构课程所学的知识。学生自选课题需在 17 周前报课程设计指导教师批准方可生效。 要求: 要求: 1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象 数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。前期准备工作完备与否 直接影响到后序上机调试工作的效率。在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。 2、.设计的题目要求达到一定工作量(300 行以上代码) ,并具有一定的深度和难度。 3、程序设计语言推荐使用 C/C++,程序书写规范,源程序需加必要的注释; 4、每位同学需提交可独立运行的程序; 5 、每位同学需独立提交设计报告书(每人一份) ,要求编排格式统一、规范、内容充实,不少于 10 页(代 码不算) ; 6、课程设计实践作为培养学生动手能力的一种手段,单独考核。
3.课程设计说明书

数据结构课程设计报告

2
页,共

一 需求分析 (1) 、模拟某校五层教学楼的电梯系统。该楼有一个自动电梯,能在每层停留。五个楼层由下至 上依次称为地下层、第一层、第二层、第三层和第四层,其中第一层是大楼的进出层,即是电梯 的“本垒层” ,电梯“空闲”时,将来该层候命。五个楼层从下到上的编号为:0、1、2、3、4。 除了地下层外,每一层都有一个要求向下的按钮除了第四层外,每一层都有一个要求向上的按钮。 对应的变量为:CallUp[0..3]和 CallDown[1..4]。电梯内的五个目标层按钮对应的变量为: CallCar[0..4]。 (2) 、电梯一共有七个状态,即正在开门(Opening) 、已开门(Opened) 、正在关门(Closing) 、 已关门(Closed) 、等待(Waiting) 、移动(Moving) 、减速(Decelerate) 。 (3) 乘客可随机地进出于任何层。对每个人来说,他有一个能容忍的最长等待时间,一旦等候 、 电梯时间过长,他将放弃。对于在楼层内等待电梯的乘客,将插入在等候队列里,每一层有两个 等候队列,一队要求向上,一队要求向下,用链队列来实现。对于在电梯内的乘客,用五个乘客 栈来实现,该乘客要去哪一层,就把他放在相应编号的栈中,对应变量为 EleStack[0…4]。 (4) 模拟时钟从 0 开始, 、 时间单位为 0.1 秒。 人和电梯的各种动作均要耗费一定的时间单位 (简 记为 t) : 有人进出时,电梯每隔 40t 测试一次,若无人进出,则关门 关门和开门各需要 20t 每个人进出电梯均需要 25t 电梯加速需要 15t 上升时,每一层需要 51t,减速需要 14t 下降时,每一层需要 61t,减速需要 23t 如果电梯在某层静止时间超过 300t,则驶回 1 层候命。 (5) 、按时序显示系统状态的变化过程:发生的全部人和电梯的动作序列。 二 概要设计 1、乘客类型 反映乘客的所有属性。 ADT Client 数据对象:D={ai∈乘客信息,I=1,2,…,n,n≥0} 数据关系:R={|ai-1,ai∈D,i=2,…,n} 基本操作: PrintClientInfo(Client const &e,ClientStatus s) 操作结果:输出乘客信息。 CreatClient(Client *&p) 操作结果:生成新的乘客。 DestoryClient(Client *&p) 操作结果:该乘客离开系统。 GoAbove(Client const &e) 操作结果:判断该乘客是否去往高层。 CInfloor(Client const &e) 操作结果:返回乘客进入的楼层。 CInTime(Client const &e) 操作结果:返回乘客进入时间。 COutfloor(Client const &e) 操作结果:返回乘客进入时间。 } 2、乘客栈类型

数据结构课程设计报告 第 3 页,共 页 电梯内的乘客用乘客栈表示,去不同楼层的乘客放在不同的栈中。 ADT Estack 数据对象:D={ai∈乘客信息,I=1,2,…,n,n≥0} 数据关系:R={|ai-1,ai∈D,i=2,…,n} 基本操作: 略。 } 3、等候队列类型 在电梯外等待的乘客用等待队列表示。每层各有两个等待队列,分别为上楼队列和 下楼队列。 与 一 般 队 列 不 同 的 是 在 基 本 操 作 中 加 入 了 放 弃 操 作 CGiveUp(WQueue &Q,int floor)。 4、电梯类型 表示电梯的各个属性和所有动作。 ADT Elevator 数据对象:D={ai∈电梯信息,I=1,2,…,n,n≥0} 基本操作: InitEle(Elevator &E) 操作结果:初始化电梯类型。 DestoryEle(Elevator &E) 操作结果:销毁电梯类型。 EleDecide(Elevator &E,WQueue w[Maxfloor+1][2]) 操作结果:电梯动作决策。 ElevatorRun(Elevator &E,WQueue w[Maxfloor+1][2]){ 操作结果:电梯状态转换。 CountOver(Elevator &E) 操作结果:判断电梯计时是否完成。 EleFloor(Elevator const &E) 操作结果:返回电梯所在的层。 EleStatus(Elevator const &E) 操作结果:返回电梯状态。 RequireAbove(Elevator const &E) 操作结果:判断是否有高层请求。 RequireBelow(Elevator const &E) 操作结果:判断是否有低层请求。 EleAchieved(Elevator &E) 操作结果:判断电梯是否要停于当前层。 EleOpenDoor(Elevator &E) 操作结果:判断电梯是否要开门。 } 高楼模块 5、 实现电梯和乘客之间的互交功能。包括: InOut(Elevator &E,WQueue w[Maxfloor+1][2]) 操作结果:进行乘客的进出电梯活动。 NewClient(Elevator &E,WQueue w[5][2]) 操作结果:进入新乘客。

数据结构课程设计报告 第 4 页,共 页 PrintStatus(Elevator &E,WQueue w[5][2]) 操作结果:输出当前状态。 Print(Elevator &E,Action a) 操作结果:输出电梯动作信息。 6、 主程序 主程序主要处理两类事件:乘客事件和电梯事件。除此之外,主程序还处理各个模块的 初始化和销毁工作,以及电梯状态的输出。 乘客事件包括新乘客到达事件,乘客放弃等待事件,乘客进出电梯事件。 电梯事件包括电梯运行事件。 7、 本程序包含 6 个模块: (1) 主程序模块 (2) 乘客模块 (3) 乘客栈模块 (4) 电梯模块 (5) 等待队列模块 (6) 高楼模块:实现电梯和乘客之间的互交。 各模块之间的调用关系如下:
主程序
等待队列模块
高楼模块
电梯模块
乘客模块
乘客栈模块
三 详细设计 //所有常量,全局变量和类型定义 #define NULL 0 //空指针 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define INT_MAX 32767 //Status 是函数类型,其值是函数结果状态代码 typedef int Status; #define Empty 0 //-----------------------------------------------------//电梯状态 enum EleStatus{Opening,Opened,Closing,Closed,Moving,Decelerate,Waiting}; enum Action{DoorOpened,DoorClosed,GoingUp,GoingDown,Achieved,None}; enum EleStage{Up,Down,OpenDoor,Stop}; enum ClientStatus{New,GiveUp,In,Out,Finish};

数据结构课程设计报告 #define CloseTest 40 //电梯关门测试时间 #define OverTime 300 //电梯停候超时时间 #define Accelerate 15 //加速时间 #define UpTime 51 //上升时间 #define DownTime 61 //下降时间 #define UpDecelerate 14 //上升减速 #define DownDecelerate 23 //下降减速 #define DoorTime 20 //开门关门时间 #define InOutTime 25 //进出电梯时间 #define Maxfloor 4 //最高层 #define Minfloor 0 //最低层

5
页,共

long Time=0; //时钟 long MaxTime;//系统运行最长时间 int InOutCount=0;//用于进出计时 int InterTime=0;//下一乘客进入系统的时间 int ID=0; //乘客编号 int GiveUpNumber=0;//乘客放弃的数目 int TotalTime=0;//总共等待时间 部分重要操作的算法: 1、判断运动方向函数 EleDecide 的算法: 2、统计高层和低层的请求(不包括当前层) 。 3、高层和低层均无请求:发出 Stop 命令。 4、否则, 1)若电梯在上升期: 1. 若有高层请求:上升; 2.若无高层请求:转下降期,下降。 2)若电梯在下降期: 1. 若有低层请求:下降; 2. 若无有低层请求:转上升期,上升。 判断电梯是否要停于当前层函数 EleAchieved 的算法: 1. 该层的 CallCar 为 1; 2. 该层在上升(下降)期有上升(下降)请求(判断 CallUp 或 CallDown) ; 3. 上升(下降)期高(低)层没有请求而该层由下降(上升)请求,要转换运行时期。 判断电梯动作函数 ElevatorRun 的算法: 1. 若电梯在 Opening 状态,则转至 Opened 状态。 2. 若电梯在 Opened 状态,若无人进出,则转至 Closing 状态。 3. 若电梯在 Closed 状态,则根据电梯请求情况转至相应状态。 4. 若电梯在 Closing 状态,则转至 Closed 状态。 5. 若电梯在 Moving 状态,若达到目标层,则转至 Decelerate 状态。否则,继 续移动。 6. 若电梯在 Decelerate 状态,则设定电梯时期,并转至 Opening 状态。 若电梯在 Waiting 状态,在判断是否等待超时,若超时则向第一层移动。否 7. 则,判断电梯请求情况并转至相应状态。 四 设计与调试分析 在本程序中如何判断电梯的动作最为关键。此外,合理划分各个模块和处理各个模块之间的

数据结构课程设计报告 第 6 页,共 页 联系也非常重要。 本设计中涉及时间函数的使用,由于刚开始接触,这方面的使用相当有难度。使用不当就容 易造成编译不通过或者运行时发送错误报告。还有在电梯调度方面不能按照预定的想法实现,所 以和现实中的电梯有出入。没有显示电梯的运行到哪里,而是用有乘客进入电梯时显示乘客进入 到哪层楼来告知电梯运行到几楼。开门,关门时需要精心思考,此处记时及判断是否要开门也是 难点,所以这些看似很平常的动作却是最难也是最容易错的地方。此外在指针的使用方面也是难 点,很多地方比如乘客进队出队以及放弃乘坐电梯时均涉及指针的使用,也经常在这些地方通不 过编译。为了便于控制循环,设计了电梯运行时间,则在时间到达时即可退出系统。由于开始为 了简化程序而定义了很多变量,结果发现并不实际,有的变量仅是在某些函数中赋予其值罢了, 于是就将这些变量删除,比如开始按照提示设置了 D1—表示人们正在进出电梯等等。 由于将程序分块,将不同部分写入不同源文件中,这样出错后便于查找及修改,这是分模块 的优点之一也是编写和调试的一个小技巧。 五 用户手册 程序运行后输入程序的运行时间,电梯开始运行。 在本设计中,用 0—4 分别表示地下一楼至四楼,用户只要按照提示依次输入正确的数值,每次按 下回车键即认为已经输入信息。此后只需等待系统自行进行处理,若未显示乘客放弃乘坐电梯即 认为该乘客已达目的楼层。此间程序会一直运行到开始时输入的运行时间,此时整个程序运行结 束,按任意键退出。此操作可参考测试成果中的效果图。 六 测试成果 从测试结果看,乘客放弃数的大小和平均等待时间的长短还与乘客出现的密度和乘客的平均 容忍时间有关系。

数据结构课程设计报告

7
页,共

七 附录(源程序清单) 附录(源程序清单) #include #include #include #include #include #include #include //所有常量,全局变量和类型定义 #define NULL 0 //空指针 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define INT_MAX 32767 //Status 是函数类型,其值是函数结果状态代码 typedef int Status; #define Empty 0 //-----------------------------------------------------//电梯状态 enum EleStatus{Opening,Opened,Closing,Closed,Moving,Decelerate,Waiting}; enum Action{DoorOpened,DoorClosed,GoingUp,GoingDown,Achieved,None}; enum EleStage{Up,Down,OpenDoor,Stop}; enum ClientStatus{New,GiveUp,In,Out,Finish}; #define CloseTest 40 //电梯关门测试时间 #define OverTime 300 //电梯停候超时时间 #define Accelerate 15 //加速时间 #define UpTime 51 //上升时间 #define DownTime 61 //下降时间 #define UpDecelerate 14 //上升减速

数据结构课程设计报告 #define DownDecelerate 23 //下降减速 #define DoorTime 20 //开门关门时间 #define InOutTime 25 //进出电梯时间 #define Maxfloor 4 //最高层 #define Minfloor 0 //最低层

8
页,共

long Time=0; //时钟 long MaxTime;//系统运行最长时间 int InOutCount=0;//用于进出计时 int InterTime=0;//下一乘客进入系统的时间 int ID=0; //乘客编号 int GiveUpNumber=0;//乘客放弃的数目 int TotalTime=0;//总共等待时间 //乘客类型 typedef struct { int ClinetID; //乘客编号 int Outfloor; //去哪层 int InTime; //该乘客进入时间 int GivepuTime; //所能容忍的等待时间 int Infloor;//乘客进入的楼层 }Client; //乘客类型基本操作 void PrintClientInfo(Client const &e,ClientStatus s) { //输出乘客信息 #if !test switch(s) { case New:cout<ClinetID=++ID; //ut<>d; p->GivepuTime=d;//产生所能容忍的等待时间

//
数据结构课程设计报告 第 p->InTime=Time; cout<<"下一乘客要到达的时间:";cin>>d; InterTime=d;//产生下一乘客要到达的时间 cout<<"所要到达的楼层:";cin>>d; p->Outfloor=d; //产生所要到达的楼层 //该乘客出现的楼层 while((p->Infloor=rand()%(Maxfloor+1))==p->Outfloor); cin>>p->Infloor>>p->Outfloor>>InterTime; PrintClientInfo(*p,New); return OK;
9
页,共

} Status DestoryClient(Client *&p) { //该乘客离开系统 delete p; p=NULL; return OK; } Status GoAbove(Client const &e) { //判断该乘客是否去往高层 if(e.Outfloor>e.Infloor) return TRUE; else return FALSE; } int CInfloor(Client const &e) { //返回乘客进入的楼层 return e.Infloor; } int CInTime(Client const &e) { //返回乘客进入时间 return e.InTime; } int COutfloor(Client const &e) { //返回乘客进入时间 return e.Outfloor; } #define STACK_INIT_SIZE 10 //存储空间初始分配量 #define STACKINCREMENT 5 //存储空间分配增量 //乘客栈 typedef Client *SElemType; typedef struct { SElemType *base; //栈底指针,栈不存在时 base 的值为 NULL SElemType *top; //栈顶指针 int stacksize; //当前已分配存储空间,以元素为单位 }ClientStack; //乘客栈的基本操作 Status InitStack(ClientStack &S); //构造一个空栈

数据结构课程设计报告 Status DestroyStack(ClientStack &S); //销毁栈 S Status ClearStack(ClientStack &S); //把 S 置为空 Status StackEmpty(ClientStack S); //若栈 S 为空,则返回 TRUE,否则返回 FALSE int StackLength(ClientStack S); //返回栈 S 的长度 Status GetTop(ClientStack S,SElemType &e); //返回栈顶元素 Status Push(ClientStack &S,SElemType e); //入栈 Status Pop(ClientStack &S,SElemType &e); //出栈 void PrintStack(ClientStack &S); //输出栈

10
页,共

Status InitStack(ClientStack &S) { //构造一个空栈 S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) return OVERFLOW; S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; }//InitStack Status DestroyStack(ClientStack &S) { //销毁栈 S SElemType *p; if(S.base) { for(p=S.base;p

数据结构课程设计报告 第 11 页,共 页 int StackLength(ClientStack S) { //返回栈 S 的长度 return S.top-S.base; } Status GetTop(ClientStack S,SElemType &e) { //返回栈顶元素 if(!S.base) return ERROR; e=*(S.top-1); return OK; }//GetTop Status Push(ClientStack &S,SElemType e) { //入栈 if(!S.base) return ERROR; if(S.top-S.base>=S.stacksize) { S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S.base) return OVERFLOW; S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; return OK; }//Push Status Pop(ClientStack &S,SElemType &e) { //出栈 if(S.top==S.base) return ERROR; e=*(--S.top); return OK; }//Pop void PrintStack(ClientStack &S) { //输出栈 SElemType *i; i=S.base; while(iClinetID<<' '; } //电梯类型 #include "ClientStack.h" typedef struct { int floor; //电梯所在层 int ClientNumber;//电梯内人数 EleStatus status; //电梯当前状态 EleStage Stage; //电梯运行时期 int Count;//用于电梯计时 int CallUp[Maxfloor+1];//每层的 Up 按钮 int CallDown[Maxfloor+1];//每层的 Down 按钮

数据结构课程设计报告 第 12 页,共 int CallCar[Maxfloor+1];//电梯内的目标层按钮 ClientStack S[Maxfloor+1];//乘客栈,要去不同楼层的人放在不同的栈中 }Elevator; //电梯类型基本操作 void InitEle(Elevator &E) { //初始化电梯类型 int i; E.floor=1;//电梯初始停在第一层 E.status=Waiting;E.Count=OverTime; E.Stage=Down; E.ClientNumber=0; for(i=0;i<=Maxfloor;i++) { E.CallUp[i]=0;E.CallDown[i]=0;E.CallCar[i]=0; } for(i=0;i<=Maxfloor;i++) InitStack(E.S[i]); } Status CountOver(Elevator &E) { //判断电梯计时是否完成 if(E.Count) { E.Count--;return FALSE; } return TRUE; } void DestoryEle(Elevator &E) { //销毁电梯类型 int i; for(i=0;i<=Maxfloor;i++) DestroyStack(E.S[i]); } int EleFloor(Elevator const &E) { //返回电梯所在的层 return E.floor; } EleStatus EleStatus(Elevator const &E) { //返回电梯状态 return E.status; } Status RequireAbove(Elevator const &E) { //判断是否有高层请求 for(int i=E.floor+1;i<=Maxfloor;i++) if(E.CallCar[i]||E.CallDown[i]||E.CallUp[i]) return TRUE; return FALSE; } Status RequireBelow(Elevator const &E) { //判断是否有低层请求 for(int i=E.floor-1;i>=Minfloor;i--) if(E.CallCar[i]||E.CallDown[i]||E.CallUp[i]) return TRUE;


数据结构课程设计报告 return FALSE;

13
页,共

} Status EleAchieved(Elevator &E) { //判断电梯是否要停于当前层 if(E.CallCar[E.floor]) return TRUE; if(E.Stage==Up&&E.CallUp[E.floor]||E.Stage==Down&&E.CallDown[E.floor]) return TRUE; if(E.Stage==Up&&E.CallDown[E.floor]&&!RequireAbove(E)) { E.Stage=Down;return TRUE; } if(E.Stage==Down&&E.CallUp[E.floor]&&!RequireBelow(E)) { E.Stage=Up;return TRUE; } return FALSE; } Status EleOpenDoor(Elevator &E) { //判断电梯是否要开门 if(E.CallCar[E.floor]||E.CallDown[E.floor]&&E.Stage==Down||E.CallUp[E.floor]&&E.Stage==Up) return TRUE; if(E.status==Waiting) { if(E.CallDown[E.floor]) {E.Stage=Down;return TRUE;} if(E.CallUp[E.floor]) {E.Stage=Up;return TRUE;} } return FALSE; } EleStage EleDecide(Elevator &E) { //判断电梯动作 int Above,Below; Above=RequireAbove(E); Below=RequireBelow(E); //无请求则停止 if(Above==0&&Below==0) return Stop; //有请求则按请求移动 else { if(E.Stage==Up) { if(Above!=0) return Up; else { E.Stage=Down;return Down; } }//if else { if(Below!=0) return Down; else { E.Stage=Up;return Up; } }//if

数据结构课程设计报告

14
页,共

} } Action ElevatorRun(Elevator &E){ //电梯状态转换 switch(E.status) { case Opening: //完成开门则转入 Opened 状态 E.status=Opened;E.Count=CloseTest; return DoorOpened; case Opened: //进行关门测试 if(E.Stage==Down&&!E.CallCar[E.floor]&&!E.CallDown[E.floor]|| E.Stage==Up&&!E.CallCar[E.floor]&&!E.CallUp[E.floor]) {//无人进出,关门 E.status=Closing;E.Count=DoorTime; }//if break; case Closing: //完成关门则转入 Closed 状态 E.status=Closed; return DoorClosed; case Waiting: //不在第一层且超出所规定的停候时间,电梯向第一层移动 if(E.Count==0) { if(E.floor!=1) E.CallCar[1]=1; } else E.Count--; //如果有人可以进入,则开门 if(EleOpenDoor(E)) { E.status=Opening;E.Count=DoorTime;break; } case Closed: //根据 EleDecide 的返回值设定电梯状态 switch(EleDecide(E)) { case Up: E.status=Moving;E.Count=UpTime+Accelerate;return GoingUp; case Down: E.status=Moving;E.Count=DownTime+Accelerate;return GoingDown; case Stop:if(E.status!=Waiting) {E.status=Waiting;E.Count=OverTime;} };//switch break; case Moving: //完成移动 if(E.Stage==Up) E.floor++; else E.floor--; if(EleAchieved(E)) {//到达目标层,转入减速状态 E.status=Decelerate; E.Count=DownDecelerate; }

数据结构课程设计报告 第 15 页,共 页 else E.Count+=DownTime;//未到达目标层,继续下降 return Achieved; case Decelerate: //完成减速 //确定正确的电梯时期 if(E.Stage==Up&&!E.CallUp[E.floor]&&!RequireAbove(E)) E.Stage=Down; else if(E.Stage==Down&&!E.CallDown[E.floor]&&!RequireBelow(E)) E.Stage=Up; //转到开门状态 E.status=Opening;E.Count=DoorTime; break; };//switch return None; }//ElevatorRun //单链队列——队列的链式存储结构 typedef Client *QElemType; //等候队列 typedef struct QNode { QElemType data; struct QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front; //队头指针 QueuePtr rear; //队尾指针 }WQueue; //等待队列的基本操作 Status InitQueue(WQueue &Q) { //构造一个空队列 Q Q.front=Q.rear=new QNode; if(!Q.front) return OVERFLOW;//分配存储失败 Q.front->next=NULL; Q.front->data=NULL; return OK; } Status DestroyQueue(WQueue &Q) { //销毁队列 Q while(Q.front) { Q.rear=Q.front->next; if(Q.front->data) DestoryClient(Q.front->data); delete Q.front; Q.front=Q.rear; } return OK; } Status EnQueue(WQueue &Q,QElemType e) {

数据结构课程设计报告 //插入元素 e 为 Q 的新的队尾元素 QueuePtr p; p=new QNode; if(!p) return OVERFLOW; p->data=e;p->next=NULL; Q.rear->next=p; Q.rear=p; return OK;

16
页,共

} Status DeQueue(WQueue &Q,QElemType &e) { //若队列不空,则删除 Q 的队头元素,用 e 返回其值,并返回 OK; //否则返回 ERROR QueuePtr p; if(Q.front==Q.rear) return ERROR; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; delete p; return OK; } Status QueueEmpty(WQueue Q) { //判断队列是否为空 if(Q.front==Q.rear) return TRUE; else return FALSE; } Status QDelNode(WQueue &Q,QueuePtr p) { //删除队列中 p 指向的结点的下一个结点 QueuePtr q; if(p==NULL||p->next==NULL) return ERROR; q=p->next; p->next=q->next; if(p->next==NULL) Q.rear=p; DestoryClient(q->data); delete q; return OK; } Status CGiveUp(WQueue &Q,int floor) { //删除放弃等待的乘客 QueuePtr p; p=Q.front; if(p->next!=NULL) if(p->next->data->GivepuTime==0&&floor!=p->next->data->Infloor) {

数据结构课程设计报告 PrintClientInfo(*(p->next->data),GiveUp); TotalTime+=Time-CInTime(*(p->next->data)); QDelNode(Q,p);//将放弃等待的人删除 GiveUpNumber++; } else p->next->data->GivepuTime--; return OK; } void PrintQueue(WQueue Q) { //输出队列 QueuePtr q; int count=0; if(Q.front->next==NULL) goto end; q=Q.front->next; while(q!=NULL) { cout<data->ClinetID<<' '; q=q->next; count++; } end: while(count++<=4) cout<<" "; }

17
页,共

#include "main.h" #include "Client.h" #include "wqueue.h" #include "Elevator.h" void InOut(Elevator &E,WQueue w[Maxfloor+1][2]) { //进行乘客的进出电梯活动 //注意:电梯时期要正确,否则乘客无法进入。 Client *p; if(E.CallCar[E.floor]) //人要从电梯中走出 if(StackEmpty(E.S[E.floor])) E.CallCar[E.floor]=0; else {//当前层的乘客栈非空,出电梯 Pop(E.S[E.floor],p);E.ClientNumber--; InOutCount=InOutTime; PrintClientInfo(*p,Out); TotalTime+=Time-CInTime(*p); DestoryClient(p); }//else if(E.CallCar[E.floor]==0) //有人要走入电梯 if(!QueueEmpty(w[E.floor][E.Stage])) {//若队列不空,继续进电梯 DeQueue(w[E.floor][E.Stage],p); Push(E.S[COutfloor(*p)],p);

数据结构课程设计报告 if(E.CallCar[COutfloor(*p)]!=1) { //按下要去楼层的按钮 E.CallCar[COutfloor(*p)]=1; } E.ClientNumber++; InOutCount=InOutTime; PrintClientInfo(*p,In);

18
页,共

}//if else {//乘客的进出活动已完成 if(E.Stage==Down) E.CallDown[E.floor]=0;//将相应的下降按钮取消 else E.CallUp[E.floor]=0;//将相应的上升按钮取消 } } void NewClient(Elevator &E,WQueue w[5][2]) { //进入新乘客 Client *p; CreatClient(p);//新的乘客 //将该乘客插入相应队列并按下相应按钮(Up/Down) if(GoAbove(*p)) { EnQueue(w[CInfloor(*p)][Up],p);E.CallUp[CInfloor(*p)]=1; } else { EnQueue(w[CInfloor(*p)][Down],p);E.CallDown[CInfloor(*p)]=1; }//else } /**********************************************************/ void Print(Elevator &E,Action a) { //输出电梯动作信息 switch(a) { case DoorOpened: cout<

数据结构课程设计报告

19
页,共

int main() { Elevator E;//电梯 WQueue w[Maxfloor+1][2];//每层都有两个等待队列:上楼队列和下楼队列 //初始化 InitEle(E); srand( (unsigned)time( NULL )); for(int i=0;i<=Maxfloor;i++) { InitQueue(w[i][Up]); InitQueue(w[i][Down]); } #if test MaxTime=100000;//12099999 #else cout<<"请输入电梯的运行时间:"; cin>>MaxTime; #endif while(Time++

数据结构课程设计报告 cout<<"共"<
20
页,共

4.课程设计心得 本设计对于现在的学习程度来说十二分的难,当初因为考虑不够成熟,以为有提示会简单一 点,可这大大超出目前编程能力,思考不严谨,以至于程序层次十分混乱。 当参考有关资料后发现思路相当重要,将程序分块,划分基本类型,分析各模块的基本操作, 这些均可独立开来做。在编译时发现了错误也可以方便修改。这些基本功其实在实用时才会发现 自己掌握得并不牢靠, 许多依然会犯低级错误,输入时若不根据设计的程序所规定的方式就容易发 生错误。 由于开始按照实现提示来做就定义了很多后来都没有用到的变量,结果既浪费了时间又打乱 了设计思绪。原来简单的现实事件当做成程序想实现它时还是很难的,这就不能凭空想象来对待 编程了。编程很需要将实际与程序用变通的思想联系起来。平时还经常抱怨所学的知识与实际应 用脱节,现在才觉得基本功的重要性,准备工作很有必要。 期间几经波折,由于用栈和队列做基本操作基础时,程序一再陷入僵局,编译无错但不能实 现功能,仅能做简单的输入、输出,对其他操作函数无一反应;于是崩溃,转为链表来做,结果 仍然不出结果,连基本的时间函数都不能运行。 所以完成这份报告要感谢那些默默无闻的给予帮助的同学和老师。

数据结构模拟题(开卷)

《数据结构》模拟题(补) 一.单项选择题 1.在线性表的下列存储结构中,读取元素花费时间最少的是【】。 A.单链表B.双链表C.顺序表D.循环链表 2.设计一个判定表达式中左、右括号是否配对出现的算法,采用【】数据结构最佳。 A.集合B.线性表C.队列D.栈 3.n个结点的线索二叉树上含有的线索数为【】。 A.2n B.n-1 C.n D.n+1 4.设广义表D=(a,(b,c)),则tail(D)=【】。 A.b,c B.(b,c) C.((b,c)) D.c 5.由4个结点可以构造出【】种不同的二叉树。 A.12 B.13 C.14 D.15 6.在栈中,出栈操作的时间复杂度为【】。 A.O(1) B.O(n) C.O(log2n) D.O(n2) 7.假设Q[0..len-1]表示循环队列,f为队头指针,r为队尾指针,则进队操作语句是【】。 A.f=f+1 B.r=r+1 C.f=(f+1)%len D.r=(r+1)%len 8.一个n*n的对称矩阵,如果以行或列为主序放入内存,则其容量为【】。 A.n*n B.n*n/2 C.n*(n+1)/2 D.(n+1)*(n+1)/2 9.队列操作的原则是【】。 A.进优于出B.出优于进C.先进先出D.后进先出 10.下列数据结构中,【】是非线性数据结构。 A.栈B.串C.队列D.树 11.两个指针p和q,分别指向单链表的两个元素,p所指元素是q所指元素的前驱,则【】。 A.p==q B.q->next=p C.p->next=q D.p->next=q->next 12.数组A中,每个元素的长度为4个字节,行下标i从1到5,列下标j从1到4,从首 地址SA开始连续存放在存储器内,该数组按行存放时,元素A[3][2]的起始地址为【】。 A.SA+20 B.SA+36 C.SA+40 D.SA+45 13.已知一个顺序存储的线性表,设每个结点需占m个存储单元,若第一个结点的地址为d1, 则第i个结点的地址为【】。 A.d1+(i-1)*m B.d1+i*m C.d1+(i+1)m D.d1-i*m 14.分析下列算法suanfa1(n)的时间复杂度是【】。 void suanfa1(int n) { int i,j,x=1; for(i=0;i

电梯模拟课程设计

[问题描述] 设计一个电梯模拟系统。这是一个离散的模拟程序,因为电梯系统是乘客和电梯等 “活动体”构成的集合,虽然他们彼此交互作用,但他们的行为是基本独立的。在离散的模拟中,以模拟时钟决定每个活动体的动作发生的时刻和顺序.系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一个时刻。 [基本要求] (1) 模拟某校五层教学楼的电梯系统。该楼有一个自动电梯,能在每层停留。五个楼层由下至上依次称为地下层、第一层、第二层、第三层和第四层,其个第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。 (2) 乘客可随机地进出于任何层。对每个入来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。 (3) 模拟时钟从0开始,时间单位为0.1秒。人和电梯的各种动作均要耗费一定的时间单位(简记为t),比如: 有人进出时,电梯每隔40t测试一次,若无人进出,则关门。 关门和开门各需要20t 每个人进出电梯均需要25t 如果电梯在某层静止时间超过300t,则驶回1层候命。 (4) 按时序显示系统状态的变化过程:发生的全部人和电梯的动作序列。 [测试数据] 模拟时钟Time的初值为0,终值可在500—l0000范围内逐步增加。 [实现提示] (1) 楼层由下至上依次编号为0,1,2,3,4。每目有要求Up(上)和Down(下)的两个按钮,对应l0个变量CallUp[0..4]和 CallDown[0..4]。电梯内5个目标层按钮对应变量CallCar[0..4]。有人按下某个按钮时,相应的变量就置为1,一旦要求满足后,电梯就把该变量清为0。 (2) 电梯处于三种状态之一:GoingUp(上行)、GoingDown(下行)和IdIe(停候)。如果电梯处于IdIe状态且不在1层,则关门并驶回1层。在1层停候时,电梯是闭门候命。一旦收到往另一层的命令,就转入GoingUp或GoingDown状态,执行相应的操作。

数据结构模拟试题及答案

数据结构模拟试题一 一、判断题(每小题1 分,共15分) 1.计算机程序处理的对象可分为数据和非数据两大类。 2.全体自然数按大小关系排成的序列是一个线性表。 3.在描述单向链表的结点类型时,必须首先描述数值字段,然后再描述指针字段。 4.顺序栈是一种规定了存储方法的栈。 5.树形结构中的每个结点都有一个前驱。 6.在任何一棵完全二叉树中,最多只有一个度为1的分支结点。 7.若某顶点是有向图的根,则该顶点的入度一定是零。 8.如果某图的邻接矩阵有全零的行,没有全零的列,则该图一定是有向图。 9.用一维数组表示矩阵可以节省存储空间。 10.广义表的长度与广义表中含有多少个原子元素有关。 11.分块查找的效率与线性表被分成多少块有关。 12.散列表的负载因子等于存入散列表中的结点个数。 13.在起泡排序过程中,某些元素可能会向相反的方向移动。 14.按某种逻辑关系组织起来的记录的集合称为逻辑记录。 15.索引非顺序文件的特点是索引表中的索引项不一定按关键字大小有序排列。 二、填空题(每空1分,共15分) 1.顺序表是一种_____________线性表。 2.若用Q[1]~Q[m]作为非循环顺序队列的存储空间,则对该队列最多只能执行___次插入操作。 3.栈和队列的区别在于________的不同。 4.在高度为h(h≥0)的二叉树中至少有___个结点,至多有___个结点。 5.若用二叉链表来存储具有m个叶子,n个分支结点的树,则二叉链表中有___个左指针域为空的结点,有___个右指针域 为空的结点。 6.n个顶点的有根有向图中至少有___条边,至多有___条边。 7.10行20列矩阵若用行优先顺序表来表示,则矩阵中第8行第7列元素是顺序表中第___个元素。 8.在各元素查找概率相等的情况下,用顺序查找方法从含有12个元素的有序表中查找一个元素,元素间的平均比较次数是 _____。 9.在归并两个长度为m的有序表时,排序码的比较次数至少是___次,至多是___次。 10.在高度为3的6阶B-树中,至少有___个关键字,至多有___个关键字。 三、选择题(每题2分,共30分) 1.计算机所处理的数据一般具有某种内在联系性,这是指________。 A.元素和元素之间存在某种关系B.数据和数据之间存在某种关系 C.元素内部具有某种结构D.数据项和数据项之间存在某种关系 2. 假设顺序表目前有4个元素,第i个元素放在R[i]中,1≤i≤4 。若把新插入元素存入R[6],则________。 A.会产生运行错误B.R[1]~R[6]不构成一个顺序表 C.顺序表的长度大于顺序表元素个数,会降低存储空间利用率 D.顺序表元素序号和数组元素下标不一致,会给使用带来麻烦 3. 设H是不带表头结点循环单向链表的表头指针,P是和H同类型的变量。当P指向链表最后一个结点时,_________。A.P所指结点指针字段的值为空B.P的值与H的值相等 C.P所指结点的地址与H的值相等D.P所指结点指针字段的值与H的值相等 4. 栈的定义不涉及数据的__________。 A.逻辑结构B.存储结构C.运算D.逻辑结构和存储结构 5. 设5个元素进栈的顺序是1,2,3,4,5,则出栈的顺序有可能是___________。 A.2,4,1,3,5 B.3,4,1,5,2 C.3,2,4,1,5 D.4,1,3,2,5 6. 若某棵二叉树结点的前序序列和中序序列相同,则该二叉树_________。 A.只有一个结点B.每个结点都没有左孩子C.每个结点都没有右孩子D.不存在 7.对于一棵具有n个结点,度为3的树来说,____________。 A.树的高度至多是n-3 B.树的高度至多是n-2 C.树的最低高度是┏log3(n+1)┓ D.至少在某一层上正好有3个结点 8.n个顶点的有向图如果可以进行拓扑排序,则可以断定该有向图__________。 A.含n个强连通分量B.有唯一的入度为0的顶点C.有多个出度为0的顶点 D.是一个有根有向图 9. 特殊矩阵用行优先顺序表表示,_____________ A.简化了矩阵元素之间的逻辑关系B.便于按行处理矩阵元素

数据结构课程设计报告--电梯模拟

课程设计 课程名称数据结构 题目名称 2.8电梯模拟(难度5) 学生学院计算机学院 专业班级 XXXXXXXXXX 学号XXXXXXXX 学生姓名 XXX 指导教师 XX 2013年7月4日

电梯模拟系统 一、简单介绍 1、问题描述 设计一个电梯模拟系统,这是一个离散的模拟程序,因为电梯系统是乘客和电梯等“活动体”构成的集合,虽然他们彼此交互作用,但他们的行为是基本独立的,在离散的模拟中,以模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一个时刻。 2、基本要求 (1)、模拟某校五层教学楼的电梯系统。该楼有一个自动电梯,能在每层停留。五个楼层由下至上依次称为地下层、第一层、第二层、第三层,第四层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。 (2)、乘客可随机地进出于任何层。对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。 (3)、模拟时钟从0开始,时间单位为0.1秒。人和电梯的各种动作均要消耗一定的时间单位(简记为t),比如:有人进出时,电梯每隔40t测试一次,若无人进出,则关门;关门和开门各需要20t;每个人进出电梯均需要25t;如果电梯在某层静止时间超过300t,则驶回1层侯命。 (4)、按时序显示系统状态的变化过程:发生的全部人和电梯的动作序列。 二、设计目的 当初之所以选择做电梯模拟这个课题,主要是因为觉得当今时代需要,所以觉得想尝试一下,因为为了方便,我们都会选择乘坐电梯,既省时间又省力,粗略看了书本里面的描述,觉得应该不难,只是按照要求输出动作序列即可,后来经过老师的辅导,才发现,原来自己选了个最难的课程设计,也问了同学,很多都是因为太难了才没有选这个题目,因为它远比想象中的复杂的多很多,它实际上是模拟现实中的电梯的运行状况,因此要考虑很多现实中遇到的实际情况,坐过电梯的人都会应该有点印象,现实中的电梯是按照每个人按下按钮的时间顺序进行服务的,但是,并不是将一个人接进来后就直接开往其目的楼层就完事,其实,当电梯将某个人送往其目的楼层的过程中,经过某层时,如果此层的人也要用电梯,虽然其按按钮的时间有可能比先前那个人晚,但是电梯依旧会开门将其接入,然后继续送前一个人去目的地,之后再送这个人去他的目的楼层,如果有多人在电梯中时,也是按照申请时间的先后决定先去哪层的,同理,若在某层,电梯中的某个人,或者某几个人要在该层下,电梯也不能忽略这些,而是要先开门使要下的人出去,之后继续开往先前的楼层,所以设计时,每当电梯上升或下降一层后,都应该检测现在电梯所处的这层有没有人有用电梯的请求,或者电梯中的人有没有要在该层下的情况,若有则电梯要在该层停一下,否则继续上升或下降…. 此外,当电梯停在某一层时不外乎三种情况:1.此层有个人{或有几个人}等候要用电梯 2.电梯中的某个人或者某几个人要在该楼层下 3.则是前面两种情况的结合,此时情况相当复杂,因为,题目要求电梯开门和关门都要消耗一定的时间(题目中没有提电梯上升或者下降一层需要多少时间,所以不妨就假定为30t),而且人进电梯和人出电梯时也要消耗一定的时间,这说明了当同一时刻有至少两个以上的人要进行同一种动作的时候(比方说都是要出电梯,或都是在某一层等电梯,电梯来了后都要进去),但是因为每个人进出电梯都要消耗时间,所以不能单纯的同时让这些人同进或同出电梯,而是要有先后顺序的进出,此为其

《数据结构C》模拟试题

山东科技大学继续教育学院 《数据结构C》模拟试题一 班级姓名学号 一、选择题(20分) 1. 组成数据的基本单位是( )。 (A) 数据项(B)数据类型(C)数据元素(D)数据变量 2. 线性表的链接实现有利于( )运算。 (A) 插入(B)读表元(C)查找(D)定位 3. 串的逻辑结构与( )的逻辑结构不同。 (A) 线性表(B)栈(C)队列(D)树 4. 二叉树第i(i≥1)层最多有( )个结点。 (A) 2i(B)2i (C) 2i-1(D) 2i-1 5. 设单链表中p指向结点A,若要删除A后结点(若存在),则需要修改p的操作为( ) (A) p.Next = p.Next.Next (B)p=p.Next (C)p=p.Next.Next (D)p.Next=p 6. 设一数列的输入顺序为1,2,3,4,5,6,通过栈操作不可能排成的输出序列为( ) (A) 3,2,5,6,4,1 (B) 1,5,4,6,2,3 (C) 2,4,3,5,1,6 (D) 4,5,3,6,2,1 7. 设字符串S1=’ABCDEFG’,S2=’PQRST’,则运算S=CONCAT(SUB(S1,2,LENGTH(S2)),SUB(S1,LENGTH(S2),2))的结果为( ) (A) ‘BCQR’ (B) ‘BCDEF’ (C) ’BCDEFG’ (D) ‘BCDEFEF’ 8. 有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占1个地址空间,则a85地址为( ) (A)13 (B) 33 (C) 18 (D) 40 9. 如果结点A有3个兄弟,而且B为A的双亲,则B的度为( ) (A) 3 (B) 4 (C) 5 (D) 1 10. 线索化二叉树中某结点D没有左孩子的必要条件是( ) (A) D.Lchild=null (B) D.ltag=1 (C) D.Rchild=null (D) D.ltag=0 二、填空题(20分) 1. 对于一个以顺序实现的循环队列Q[0..m_1],队头、队尾指针分别为f,r,其判空的条件是 ,判满的条件是。 2. 循环链表的主要优点是。 3. 给定一个整数集合{3,5,6,9,12},画出其对应的一棵Huffman树。 4 双向循环链表中,在p所指的结点之后插入f所指的结点,其操作为。 5. 下列为朴素的模式匹配算法,请在算法的处填入正确的子句。

电梯模拟

一电梯模拟 一.题目要求 模拟某校九层教学楼的电梯系统。该楼有一个自动电梯,能在每层停留。九个楼层由下至上依次称为地下层、第一层、第二层、……第八层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。 乘客可随机地进出于任何层。对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。 模拟时钟从0开始,时间单位为0.1秒。人和电梯的各种动作均要消耗一定的时间单位(简记为t),比如:有人进出时,电梯每隔40t测试一次,若无人进出,则关门;关门和开门各需要20t;每个人进出电梯均需要25t;如果电梯在某层静止时间超过300t,则驶回1层侯命。 要求: 按时序显示系统状态的变化过程,即发生的全部人和电梯的动作序列。 二.设计 1. 设计思想 (1)数据结构设计 构建一个栈用以表示乘客,用等待队列表示电梯外等待的乘客 (2)算法设计 1.乘客类型反映乘客的所有属性 2乘客栈类型,电梯内的乘客用乘客栈表示,去不同楼层的乘客放在不同的栈中。 3.等候队列类型,在电梯外等待的乘客用等待队列表示。每层各有两个等待队列,分别为上楼队列和下楼队列。 4.电梯类型,表示电梯的各个属性和所有动作。 2设计表示 1. 调用的函数如下: #include #include #include #include #include #include #include 2. 各函数说明如下: #define DownDecelerate 23 //下降减速 #define DoorTime 20 //开门关门时间 #define InOutTime 25 //进出电梯时间 #define Maxfloor 4 //最高层 #define Minfloor 0 //最低层 long Time=0; //时钟 long MaxTime;//系统运行最长时间 int InOutCount=0;//用于进出计时

专升本《数据结构》模拟题试卷汇编

专升本《数据结构》模拟题试卷 一. (共75题,共150分) 1. 数据的基本单位是()。(2分) A.数据元素 B.记录 C.数据对象 D.数据项 ★检查答案标准答案:A 2. ()是数据的不可分割的最小单位。(2分) A.数据对象 B.数据元素 C.数据类型 D.数据项 ★检查答案标准答案:D 3. 算法的空间复杂度是对算法()的度量。(2分) A.时间效率 B.空间效率 C.可读性 D.健壮性 ★检查答案标准答案:B 4. ()是限制了数据元素的内部结构仅为一个字符的线性表。(2分) A.栈 B.队列 C.串 D.数组 ★检查答案标准答案:B 5. 串的长度是指串中所含()的个数。(2分) A.不同字符 B.不同字母 C.相同字符 D.所有字符 ★检查答案标准答案:D 6. 采用带头结点双向链表存储的线性表,在删除一个元素时,需要修改指针()次。(2

分) A.1 B.2 C.3 D.4 ★检查答案标准答案:B 7. 线性表的顺序存储结构是一种()的存储结构。(2分) A.顺序存取 B.随机存取 C.索引存取 D.Hash存取 ★检查答案标准答案:B 8. 数组a[1..m]采用顺序存储,a[1]和a[m]地址分别为1024和1150,每个元素占2字节,则m是()。(2分) A.64 B.32 C.16 D.8 ★检查答案标准答案:A 9. 深度为h的二叉树,第h层最多有()个结点。(2分) A.h B.2h-1 C.2h-1 D.2h ★检查答案标准答案:C 10. m个结点的二叉树,其对应的二叉链表共有()个非空链域。(2分) A.m B.m+1 C.2m D.m-1 ★检查答案标准答案:B 11. 下面叙述错误的是()。(2分) A.顺序表是借助物理单元相邻表示数据元素之间的逻辑关系 B.对于空队列进行出队操作过程中发生下溢现象

《数据结构》模拟试卷一及答案

模拟试卷一 一、单选题(每题 2 分,共20分) 1.以下数据结构中哪一个是线性结构?( ) A. 有向图 B. 队列 C. 线索二叉树 D. B树 2.在一个单链表HL中,若要在当前由指针p指向的结点后面插入一个由q指向的结点, 则执行如下( )语句序列。 A. p=q; p->next=q; B. p->next=q; q->next=p; C. p->next=q->next; p=q; D. q->next=p->next; p->next=q; 3.以下哪一个不是队列的基本运算?() A. 在队列第i个元素之后插入一个元素 B. 从队头删除一个元素 C. 判断一个队列是否为空 D.读取队头元素的值 4.字符A、B、C依次进入一个栈,按出栈的先后顺序组成不同的字符串,至多可以组成 ( )个不同的字符串? A.14 B.5 C.6 D.8 5.由权值分别为3,8,6,2的叶子生成一棵哈夫曼树,它的带权路径长度为( )。 A. 11 B.35 C. 19 D. 53 图一 6.该二叉树结点的前序遍历的序列为( )。 A.E、G、F、A、C、D、B B. E、A、G、C、F、B、D C. E、A、C、B、D、G、F D. E、G、A、C、D、F、B 7.该二叉树结点的中序遍历的序列为( )。 A. A、B、C、D、E、G、F B. E、A、G、C、F、B、D C. E、A、C、B、D、G、F D. B、D、C、A、F、G、E 8.该二叉树的按层遍历的序列为( )。 A.E、G、F、A、C、D、B B. E、A、C、B、D、G、F C. E、A、G、C、F、B、D D. E、G、A、C、D、F、B 9.下面关于图的存储的叙述中正确的是( )。 A.用邻接表法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关B.用邻接表法存储图,占用的存储空间大小与图中边数和结点个数都有关 C. 用邻接矩阵法存储图,占用的存储空间大小与图中结点个数和边数都有关 D.用邻接矩阵法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关10.设有关键码序列(q,g,m,z,a,n,p,x,h),下面哪一个序列是从上述序列出发建 堆的结果?( )

电梯模拟系统教学内容

电梯模拟系统

目录 一:问题描述—————————————————————————第2页二:问题分析—————————————————————————第2页三:数据结构—————————————————————————第2页四:算法设计—————————————————————————第4页五设计与调试分析———————————————————————第6页六:体会及建议————————————————————————第7页七:参考文献—————————————————————————第7页八:原代码——————————————————————————第7页

一:问题描述 设计一个电梯模拟系统。这是一个离散的模拟程序,因为电梯系统是乘客和电梯等“活动体”够成的集合,虽然他们彼此交互作用,但是他们的行为是基本独立的。在离散的模拟中,一模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一个时刻。 二:问题分析 (1)、模拟某校五层教学楼的电梯系统。该楼有一个自动电梯,能在每层停留。五个楼层由下至上依次称为地下层、第一层、第二层、第三层和第四层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来该层候命。五个楼层从下到上的编号为:0、1、2、3、4。除了地下层外,每一层都有一个要求向下的按钮除了第四层外,每一层都有一个要求向上的按钮。对应的变量为:CallUp[0..3]和CallDown[1..4]。电梯内的五个目标层按钮对应的变量为:CallCar[0..4]。

数据结构模拟题及复习资料

数据结构试题(A05) 一、选择题(共10小题,每小题1分,共10分) 1.下面程序段的时间复杂度是( ) m=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++) m=m+1; A. O(n2) B.O(m+n+1) C.O(m+n) D. O(n) 2.在单链表中,指针p指向元素为x的结点,实现“删除x的后继”的语句是( ) A.p=p->next; B.p->next=p->next->next; C.p->next=p; D.p=p->next->next; 3.在长度为n的顺序表,当在任何位置上删除一个元素的概率相等时,删除一个元素需要移动的元素的平均个数为( ) A.n/2 B.(n-1)/ 2 C.(n+1)/2 D.(n+2)/2 4.一个栈的输入序列为 1 2 3 4 5,则下列序列中不可能是栈的输出序列的是( ) A. 2 3 4 1 5 B. 5 4 1 3 2 C. 2 3 1 4 5 D. 1 5 4 3 2 6.设循环队列中数组的下标范围是1~n,其头尾指针分别为f和r,则其元素个数为( ) A. r-f B. r-f+1 C. (r-f) mod n+1 D. (r-f+n) mod n 7.以下序列不是堆的是( )。 A.(100,85,98,77,80,60,82,40,20,10,66) B.(100,98,85,82,80,77,66,60,40,20,10) C.(100,85,40,77,80,60,66,98,82,10,20) D.(10,20,40,60,66,77,80,82,85,98,100) 8.在有序表(12,24,36,48,60,72,84)中折半查找关键字72时所需进行的关键字比较次数为( )。 A. 3 B. 4 C. 5 D. 2 9.在待排序的元素序列基本有序的前提下,效率最高的排序方法是( )。 A.选择排序 B.冒泡排序 C.快速排序 D.插入排序 二、填空题(共20小题,每小题1分,共20分) 1、在单链表中,删除指针P所指结点的后继结点的语句是。 2、线性表的两种存储结构分别是和。 3、己知完全二叉树的第4层有5个结点,则其叶子结点数是。 4、将下三角矩阵A[1….8,1….8]的下三角部分逐行地存储到起始地址为1000的内存单元中,已知每个元素占4个单元,则A[7,5]的地址是。 5、有n个结点的强连通有向图G至少有条弧。 7、在有序表A[1….20]中,采用二分查找算法查找元素值等于A[12]的元素,所

数据结构模拟试卷(含答案)

数据结构设计课程代码:7399 一、单项选择题(在每小题列出的四个选项中只有一个选项是符合题目要求的,请将正确选项前的字母填在题后的括号内。每小题2分,共40分) 1、串的长度是()。 A、串中不同字母的个数 B、串中不同字符的个数 C、串中所含字符的个数,且大于0 D、串中所含字符的个数 2、若用数组S[1..n]作为两个栈S1和S2的共同存储结构,对任何一个栈,只有当S全满时才不能作入栈操作。为这两个栈分配空间的最佳方案是()。 A、S1的栈底位置为0,S2的栈底位置为n+1 B、S1的栈底位置为0,S2的栈底位置为n/2 C、S1的栈底位置为1,S2的栈底位置为n D、S1的栈底位置为1,S2的栈底位置为n/2 3、队列操作的原则是()。 A、先进先出 B、后进先出 C、只能进行插入 D、只能进行删除 4、有64个结点的完全二叉树的深度为()(根的层次为1)。 A、8 B、7 C、6 D、5 5、在有n个结点的二叉链表中,值为非空的链域的个数为()。

A、n-1 B、2n-1 C、n+1 D、2n+1 6、带权有向图G用邻接矩阵A存储,则顶点i的人度等于A中()。 A、第i行非∞的元素之和 B、第i列非∞的元素之和 C、第i行非∞且非0的元素个数 D、第i列非∞且非0的元素个数 7、在有n个结点且为完全二叉树的二叉排序树中查找一个键值,其平均比较次数的数量级为()。 A、0(n) B、0(log2n) C、0(nolg2n) D、0(n2) 8、若表R在排序前已按键值递增顺序排列,则()算法的比较次数最少。 A、直接插入排序 B、快速排序 C、归并排序 D、选择排序 9、下列排序算法中,()排序在某趟结束后不一定选出一个元素放到其最终的位置上。 A、选择 B、冒泡 C、归并 D、堆

电梯模拟系统

电梯模拟系统 Company Document number:WUUT-WUUY-WBBGB-BWYTT-1982GT

目录 一:问题描述—————————————————————————第2页二:问题分析—————————————————————————第2页三:数据结构—————————————————————————第2页四:算法设计—————————————————————————第4页五设计与调试分析———————————————————————第6页六:体会及建议————————————————————————第7页七:参考文献—————————————————————————第7页八:原代码——————————————————————————第7页一:问题描述 设计一个电梯模拟系统。这是一个离散的模拟程序,因为电梯系统是乘客和电梯等“活动体”够成的集合,虽然他们彼此交互作用,但是他们的行为是基本独立的。在离散的模拟中,一模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一个时刻。 二:问题分析 (1)、模拟某校五层教学楼的电梯系统。该楼有一个自动电梯,能在每层停留。五个楼层由下至上依次称为地下层、第一层、第二层、第三层和第四层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来该层候命。五个楼层从下到上的编号为:0、1、2、3、4。除了地下层外,每一层都有一个要求向下的按钮除了第四层外,每一层都有一个要求向上的按钮。对应的

变量为:CallUp[0..3]和CallDown[1..4]。电梯内的五个目标层按钮对应的变量为:CallCar[0..4]。 (2)、电梯一共有七个状态,即正在开门(Opening)、已开门(Opened)、正在关门(Closing)、已关门(Closed)、等待(Waiting)、移动(Moving)、减速(Decelerate)。 (3)、乘客可随机地进出于任何层。对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。对于在楼层内等待电梯的乘客,将插入在等候队列里,每一层有两个等候队列,一队要求向上,一队要求向下,用链队列来实现。对于在电梯内的乘客,用五个乘客栈来实现,该乘客要去哪一层,就把他放在相应编号的栈中,对应变量为EleStack[0…4]。(4)、模拟时钟从0开始,时间单位为秒。人和电梯的各种动作均要耗费一定的时间单位(简记为t): 有人进出时,电梯每隔40t测试一次,若无人进出,则关门 关门和开门各需要20t 每个人进出电梯均需要25t 电梯加速需要15t 如果电梯在某层静止时间超过300t,则驶回1层候命。 (5)、按时序显示系统状态的变化过程:发生的全部人和电梯的动作序列。三:数据结构 1、乘客类型 反映乘客的所有属性。 ADT Client 数据对象:D={a i∈乘客信息,I=1,2,…,n,n≥0}

数据结构模拟试题1

一、单项选择题(在每小题列出的四个选项中只有一个选项是符合题目要求的,请将正确选项前的字母填在题后的括号内。每小题2分,共40分) 1、串的长度是()。 A、串中不同字母的个数 B、串中不同字符的个数 C、串中所含字符的个数,且大于0 D、串中所含字符的个数 2、若用数组S[1..n]作为两个栈S1和S2的共同存储结构,对任何一个栈,只有当S全满时才不能作入栈操作。为这两个栈分配空间的最佳方案是()。 A、S1的栈底位置为0,S2的栈底位置为n+1 B、S1的栈底位置为0,S2的栈底位置为n/2 C、S1的栈底位置为1,S2的栈底位置为n D、S1的栈底位置为1,S2的栈底位置为n/2 3、队列操作的原则是()。 A、先进先出 B、后进先出 C、只能进行插入 D、只能进行删除 4、有64个结点的完全二叉树的深度为()(根的层次为1)。 A、8 B、7 C、6 D、5 5、在有n个结点的二叉链表中,值为非空的链域的个数为()。 A、n-1 B、2n-1

C、n+1 D、2n+1 6、带权有向图G用邻接矩阵A存储,则顶点i的人度等于A中()。 A、第i行非∞的元素之和 B、第i列非∞的元素之和 C、第i行非∞且非0的元素个数 D、第i列非∞且非0的元素个数 7、在有n个结点且为完全二叉树的二叉排序树中查找一个键值,其平均比较次数的数量级为()。 A、0(n) B、0(log2n) C、0(nolg2n) D、0(n2) 8、若表R在排序前已按键值递增顺序排列,则()算法的比较次数最少。 A、直接插入排序 B、快速排序 C、归并排序 D、选择排序 9、下列排序算法中,()排序在某趟结束后不一定选出一个元素放到其最终的位置上。 A、选择 B、冒泡 C、归并 D、堆

电梯工作原理及结构图

电梯功能及结构图 一、主要是由控制部分、驱动部分及曳引部分组成。 从以上链接地址中可以看出电梯全部结构的组成,区别于卷扬机的是,它有交互性、有舒适且安全的乘坐空间。 电梯简单理解是这样工作的:它是将动力电能,通过某种变频装置或直接向驱动装置供电,由驱动装置拖动曳引装置,再通过曳引装置上悬挂的钢丝绳拉动井内轿厢做上下运行工作。所有这些动力驱动是由很多的电气装置、机械装置实现整合工作的。 二、为什么电梯在楼上,而在一楼一按它就会下来呀? 电梯停候在上面某层,当一楼按下外召唤时,实际上简单的理解是一个触点开关,按下去的一瞬间,指令通过井内电线传输到控制柜的主控制板(或信号控制板或PC机控制板或最原始的电梯就是继电器动作),我们以控制板为例,它收到瞬间信号以后再次触动控制板内的固有程序,同时由它输出电梯准备如何响应的指令,分别至外呼灯亮及驱动装置,最后电能直接或间接驱使电机带动变速箱转动,通过钢丝绳与曳引轮的摩擦力带动轿厢向下运行,每一层都有一个平层装置来采集电梯所处位置,当电梯快到一楼时,控制板通过程序输出不同信号来控制驱动装置,使电梯换速到1楼平层开门,实现电梯外召指令。 三、为什么在轿厢里按几楼就会在几楼停呀? 工作方法类同于你提到的第二个问题,只是把外召按钮搬到了轿内,工作运行也相同。唯一不同的是轿厢指令起动的程序与外召唤不同,程序是独立的,外召唤有上、下按钮,而轿内的没有上、下之分是直达(除非路过的楼外有同方向召唤指令),站在外面按上及下所响应的结果是不同的,这里我不做详解了,相信楼主经常做电梯有感触,当你要下楼时同时按上、下所得到的电梯响应是有区别的,电梯做的功也不同,不利于节能。

数据结构期末模拟试题05(有答案)

课程测试试题(卷) ----------------------以下为教师填写-------------------- I、命题院(部):数学与计算机科学学院 II、课程名称:数据结构 III、测试学期:20 -20 学年度第学期 IV、测试对象:学院专业级班 V、问卷页数(A4):页 VI、答卷页数(A4):页 VII、考试方式:闭卷(开卷、闭卷或课程小论文,请填写清楚) VIII、问卷内容:(请老师在出题时安排紧凑,填空题象征性的留出一点空格,学生将所有的答案做在答题纸上的规定位置,并写清楚大题、小题的题号) 一、单选题(每题 2 分,共20分) 1.以下数据结构中哪一个是线性结构?( ) A. 有向图 B. 队列 C. 线索二叉树 D. B树 2.在一个单链表HL中,若要在当前由指针p指向的结点后面插入一个由q指 向的结点,则执行如下( )语句序列。 A. p=q; p->next=q; B. p->next=q; q->next=p; C. p->next=q->next; p=q; D. q->next=p->next; p->next=q; 3.以下哪一个不是队列的基本运算?() A. 在队列第i个元素之后插入一个元素 B. 从队头删除一个元素 C. 判断一个队列是否为空 D.读取队头元素的值 4.字符A、B、C依次进入一个栈,按出栈的先后顺序组成不同的字符串,至多 可以组成( )个不同的字符串? A.14 B.5 C.6 D.8 5.由权值分别为3,8,6,2的叶子生成一棵哈夫曼树,它的带权路径长度为 ( )。

以下6-8题基于图1。 6.该二叉树结点的前序遍历的序列为( )。 A.E、G、F、A、C、D、B B.E、A、G、C、F、B、D C.E、A、C、B、D、G、F D.E、G、A、C、D、F、B 7.该二叉树结点的中序遍历的序列为( )。 A. A、B、C、D、E、G、F B. E、A、G、C、F、B、D C. E、A、C、B、D、G、F E.B、D、C、A、F、G、E 8.该二叉树的按层遍历的序列为( )。 A.E、G、F、A、C、D、B B. E、A、C、B、D、G、F C. E、A、G、C、F、B、D D. E、G、A、C、D、F、B 9.下面关于图的存储的叙述中正确的是( )。 A.用邻接表法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关 B.用邻接表法存储图,占用的存储空间大小与图中边数和结点个数都有关 C. 用邻接矩阵法存储图,占用的存储空间大小与图中结点个数和边数都有关 D.用邻接矩阵法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关 10.设有关键码序列(q,g,m,z,a,n,p,x,h),下面哪一个序列是从上述 序列出发建堆的结果?( ) A. a,g,h,m,n,p,q,x,z B. a,g,m,h,q,n,p,x,z C. g,m,q,a,n,p,x,h,z D. h,g,m,p,a,n,q,x,z 二、填空题(每空1分,共26分) 1.数据的物理结构被分为_________、________、__________和___________四 种。 2.对于一个长度为n的顺序存储的线性表,在表头插入元素的时间复杂度为 _________,在表尾插入元素的时间复杂度为____________。 3.向一个由HS指向的链栈中插入一个结点时p时,需要执行的操作是 ________________;删除一个结点时,需要执行的操作是 ______________________________(假设栈不空而且无需回收被删除结点)。

电梯运行模拟控制器

目录 1.课程设计简介 (1) 1.1简介 (1) 1.2设计总电路图 (2) 1.3实物图 (4) 2.设计题目 (4) 3.总体设计 (6) 3.1电梯运行模拟控制器的总体运作流程 (6) 3.2电梯运行模拟控制器各模块关系 (6) 4.详细设计 (7) 6.1基本的IO配置(输入/输出模式) (7) 输出模式配置 (7) 输入模式配置 (7) 6.2外部中断配置 (8) 定时器中断 (8) 外部按键输入中断 (8) 6.3电梯运行逻辑设计(软件编码) (9) 数据结构设计 (9) 功能接口设计 (9) 5.体会与总结 (10) 6.附录 (11) 源代码 (11) 参考文献 (26) 1.课程设计简介 1.1简介 本设计使用STM8S系列作为主控芯片,使用矩阵键盘、若干个LED和两位

数码管作为外设。其中矩阵键盘用来模拟电梯按键,若干个LED灯用来模拟电梯的运动方向、楼层的指示灯(电梯内部楼层对应的按钮),两位的数码管用于显示电梯目前所处楼层。 1.2设计总电路图(基于AD这个平台生成的PCB图与原理图) 原理图 原理图

PCB图 PCB图

1.3实物图 实物图 2.设计题目 设计一个电梯运行模拟控制器,其系统框图如下图所示:

电梯运行模拟控制器框图 功能要求:能够模拟控制一个8层楼梯的电梯的运行。具体要求如下: 1.电梯平时没有接到命令时候或者执行完命令后停在1楼,门关闭.。 2.电梯运行速度2秒一层楼 3.电梯门在开启的情况下没有收到命令10秒中后自动关闭。在运动中门必须关闭,(最后3秒可以设置音响警告信号) 4.一句话,电梯控制器满足实际电梯的运行要求,电梯在运行的时候可以最多记住8个命令。并且综合考虑公平性(先按键先执行)和有效性(完成任务的总的行走路径最短)来执行。 要求完成的内容: 1.完成硬件电路的设计与安装调试(可借助单片机实验电路板),并用CAD 软件画出原理电路图。 2.画出流程图,编写并调试驱动程序。 3.撰写设计报告。 2

数据结构模拟卷(含答案)经典习题培训讲学

数据结构模拟卷(含答案)经典习题

练习题 一、单项选择题 1. 若将数据结构形式定义为二元组(K,R),其中K是数据元素的有限集合,则R是K上( ) A. 操作的有限集合 B. 映象的有限集合 C. 类型的有限集合 D. 关系的有限集合 2. 在长度为n的顺序表中删除第i个元素(1≤i≤n)时,元素移动的次数为( ) A. n-i+1 B. i C. i+1 D. n-i 3. 若不带头结点的单链表的指针为head,则该链表为空的判定条件是( ) A. head==NULL B. head->next==NULL C. head!=NULL D. head->next==head 4. 引起循环队列队头位置发生变化的操作是( ) A. 出队 B. 入队 C. 取队头元素 D. 取队尾元素 5. 若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进行,则不.可能出现的出栈序列是( ) A. 2,4,3,1,5,6 B. 3,2,4,1,6,5 C. 4,3,2,1,5,6 D. 2,3,5,1,6,4

6. 字符串通常采用的两种存储方式是( ) A. 散列存储和索引存储 B. 索引存储和链式存储 C. 顺序存储和链式存储 D. 散列存储和顺序存储 7. 数据结构是() A.一种数据类型 B.数据的存储结构 C.一组性质相同的数据元素的集合 D.相互之间存在一种或多种特定关系的数据元素的集合 8. 算法分析的目的是() A.辨别数据结构的合理性 B.评价算法的效率 C.研究算法中输入与输出的关系 D.鉴别算法的可读性 9. 在线性表的下列运算中,不.改变数据元素之间结构关系的运算是 () A.插入B.删除 C.排序D.定位10. 下列图示的顺序存储结构表示的二叉树是( )

数据结构模拟题(开卷)

《数据结构》模拟题(开卷) 一、单项选择题 1.分析下列算法suanfa1(n): void suanfa1(int n) { int i,j,x=1; for(i=0;i

相关文档
最新文档