数据结构综合实验示例
《数据结构》实验报告模板(附实例)--实验一线性表的基本操作实现

《数据结构》实验报告模板(附实例)---实验一线性表的基本操作实现实验一线性表的基本操作实现及其应用一、实验目的1、熟练掌握线性表的基本操作在两种存储结构上的实现,其中以熟悉各种链表的操作为重点。
2、巩固高级语言程序设计方法与技术,会用线性链表解决简单的实际问题。
二、实验内容√ 1、单链表的表示与操作实现 ( * )2、约瑟夫环问题3、Dr.Kong的艺术品三、实验要求1、按照数据结构实验任务书,提前做好实验预习与准备工作。
2、加“*”题目必做,其他题目任选;多选者并且保质保量完成适当加分。
3、严格按照数据结构实验报告模板和规范,及时完成实验报告。
四、实验步骤(说明:依据实验内容分别说明实验程序中用到的数据类型的定义、主程序的流程以及每个操作(成员函数)的伪码算法、函数实现、程序编码、调试与分析、总结、附流程图与主要代码)㈠、数据结构与核心算法的设计描述(程序中每个模块或函数应加注释,说明函数功能、入口及出口参数)1、单链表的结点类型定义/* 定义DataType为int类型 */typedef int DataType;/* 单链表的结点类型 */typedef struct LNode{ DataType data;struct LNode *next;}LNode,*LinkedList;2、初始化单链表LinkedList LinkedListInit( ){ // 每个模块或函数应加注释,说明函数功能、入口及出口参数 }3、清空单链表void LinkedListClear(LinkedList L){// 每个模块或函数应加注释,说明函数功能、入口及出口参数}4、检查单链表是否为空int LinkedListEmpty(LinkedList L){ …. }5、遍历单链表void LinkedListTraverse(LinkedList L){….}6、求单链表的长度int LinkedListLength(LinkedList L){ …. }7、从单链表表中查找元素LinkedList LinkedListGet(LinkedList L,int i){ //L是带头结点的链表的头指针,返回第 i 个元素 }8、从单链表表中查找与给定元素值相同的元素在链表中的位置LinkedList LinkedListLocate(LinkedList L, DataType x){ …… }9、向单链表中插入元素void LinkedListInsert(LinkedList L,int i,DataType x) { // L 为带头结点的单链表的头指针,本算法// 在链表中第i 个结点之前插入新的元素 x}10、从单链表中删除元素void LinkedListDel(LinkedList L,DataType x){ // 删除以 L 为头指针的单链表中第 i 个结点 }11、用尾插法建立单链表LinkedList LinkedListCreat( ){ …… }㈡、函数调用及主函数设计(可用函数的调用关系图说明)㈢程序调试及运行结果分析㈣实验总结五、主要算法流程图及程序清单1、主要算法流程图:2、程序清单(程序过长,可附主要部分)说明:以后每次实验报告均按此格式书写。
数据结构实验报告实验5

数据结构实验报告实验5一、实验目的本次实验的主要目的是深入理解和掌握常见的数据结构,如链表、栈、队列、树和图等,并通过实际编程实现,提高对数据结构的操作和应用能力。
同时,培养解决实际问题的思维和编程能力,提高代码的可读性、可维护性和效率。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容1、链表的基本操作创建链表插入节点删除节点遍历链表2、栈的实现与应用用数组实现栈用链表实现栈栈的应用:括号匹配3、队列的实现与应用用数组实现队列用链表实现队列队列的应用:排队模拟4、二叉树的遍历前序遍历中序遍历后序遍历5、图的表示与遍历邻接矩阵表示法邻接表表示法深度优先遍历广度优先遍历四、实验步骤1、链表的基本操作创建链表:首先定义一个链表节点结构体,包含数据域和指向下一个节点的指针域。
然后通过动态内存分配创建链表节点,并将节点逐个连接起来,形成链表。
插入节点:根据插入位置的不同,分为在表头插入、在表尾插入和在指定位置插入。
在指定位置插入时,需要先找到插入位置的前一个节点,然后进行节点的连接操作。
删除节点:同样需要根据删除位置的不同进行处理。
删除表头节点时,直接将头指针指向下一个节点;删除表尾节点时,找到倒数第二个节点,将其指针置为空;删除指定位置节点时,找到要删除节点的前一个节点,然后调整指针。
遍历链表:通过从链表头开始,依次访问每个节点,输出节点的数据。
2、栈的实现与应用用数组实现栈:定义一个固定大小的数组作为栈的存储空间,同时用一个变量记录栈顶位置。
入栈操作时,先判断栈是否已满,如果未满则将元素放入栈顶位置,并更新栈顶位置;出栈操作时,先判断栈是否为空,如果不空则取出栈顶元素,并更新栈顶位置。
用链表实现栈:与链表的操作类似,将新元素添加在链表头部作为栈顶。
括号匹配:输入一个包含括号的字符串,使用栈来判断括号是否匹配。
遇到左括号入栈,遇到右括号时与栈顶的左括号进行匹配,如果匹配成功则出栈,否则括号不匹配。
数据结构实验三实验报告

数据结构实验三实验报告数据结构实验三实验报告一、实验目的本次实验的目的是通过实践掌握树的基本操作和应用。
具体来说,我们需要实现一个树的数据结构,并对其进行插入、删除、查找等操作,同时还需要实现树的遍历算法,包括先序、中序和后序遍历。
二、实验原理树是一种非线性的数据结构,由结点和边组成。
树的每个结点都可以有多个子结点,但是每个结点只有一个父结点,除了根结点外。
树的基本操作包括插入、删除和查找。
在本次实验中,我们采用二叉树作为实现树的数据结构。
二叉树是一种特殊的树,每个结点最多只有两个子结点。
根据二叉树的特点,我们可以使用递归的方式实现树的插入、删除和查找操作。
三、实验过程1. 实现树的数据结构首先,我们需要定义树的结点类,包括结点值、左子结点和右子结点。
然后,我们可以定义树的类,包括根结点和相应的操作方法,如插入、删除和查找。
2. 实现插入操作插入操作是将一个新的结点添加到树中的过程。
我们可以通过递归的方式实现插入操作。
具体来说,如果要插入的值小于当前结点的值,则将其插入到左子树中;如果要插入的值大于当前结点的值,则将其插入到右子树中。
如果当前结点为空,则将新的结点作为当前结点。
3. 实现删除操作删除操作是将指定的结点从树中移除的过程。
我们同样可以通过递归的方式实现删除操作。
具体来说,如果要删除的值小于当前结点的值,则在左子树中继续查找;如果要删除的值大于当前结点的值,则在右子树中继续查找。
如果要删除的值等于当前结点的值,则有三种情况:- 当前结点没有子结点:直接将当前结点置为空。
- 当前结点只有一个子结点:将当前结点的子结点替代当前结点。
- 当前结点有两个子结点:找到当前结点右子树中的最小值,将其替代当前结点,并在右子树中删除该最小值。
4. 实现查找操作查找操作是在树中寻找指定值的过程。
同样可以通过递归的方式实现查找操作。
具体来说,如果要查找的值小于当前结点的值,则在左子树中继续查找;如果要查找的值大于当前结点的值,则在右子树中继续查找。
数据结构课程设计综合实验报告

数据结构课程设计开题报告表课程设计1 线性表课程设计一、组长:二、组员:三、实验日期:2010/4/10四、实验任务:集合操作(2分)基本功能要求:(1)从文件中读入集合数据建立单链表。
(2)分别求出集合的交、并、差。
五、实验原理:。
(具体思路看注释)(1)定义单链表结点类型;(2)建立函数,将数组元素以尾插法的方法插入到单链表中;(3)建立函数以指针移动的方式将单链表显示出来;(4)建立求并集的函数,以指针移动的方式将L1和L2中的元素放入L3中;(5)建立求交集的函数,以指针移动的方式将L1和L2中相同的元素放到L4中;(6)建立求差集的函数,以指针移动的方式将L1有而L2中无的元素放到L5中;(7)建立主函数,实现以上功能;六、实验源程序:#include <stdio.h>#include <stdlib.h>typedef struct LNode //定义单链表结点类型{char data;struct LNode *next;} LinkList;LinkList *CreatList(LinkList *L,char a[],int n) /*尾插法插入元素*/{LinkList *p,*r;int i;L=(LinkList*)malloc(sizeof(LinkList));L->next=NULL;r=L;for(i=0;i<n;i++){p=(LinkList*)malloc(sizeof(LinkList));p->data=a[i];r->next=p;r=p;}r->next=NULL;return (L);}void DispList(LinkList *L) /*显示链表*/{int i=0;LinkList *p;p=L->next;while(p!=NULL){printf("%c",p->data);p=p->next;}printf("\n");}LinkList *BingJi(LinkList *L1,LinkList *L2,LinkList *L3) /*求两个集合的并集*/{LinkList *p1=L1->next,*p2=L2->next,*s,*t;L3=(LinkList *)malloc(sizeof(LinkList));t=L3;while (p1!=NULL && p2!=NULL) /*当L1和L2都不为空的情况下比较各自数值的大小*/ {if (p1->data<p2->data) /*先记录较小的数值,并移动其指针*/{s=(LinkList *)malloc(sizeof(LinkList));s->data=p1->data;t->next=s;t=s;p1=p1->next;}else if (p1->data>p2->data){s=(LinkList *)malloc(sizeof(LinkList));s->data=p2->data;t->next=s;t=s;p2=p2->next;}else /*当两个数值相同时仅记录一个,并移动各自的指针*/{s=(LinkList *)malloc(sizeof(LinkList));s->data=p1->data;t->next=s;t=s;p1=p1->next;p2=p2->next;}}while(p1==NULL&&p2!=NULL) /*当有一个单链表已经比较完毕时,将另外一个单链表的剩余数值全部记录下来*/{s=(LinkList *)malloc(sizeof(LinkList));s->data=p2->data;t->next=s;t=s;p2=p2->next;}while (p2==NULL&&p1!=NULL){s=(LinkList *)malloc(sizeof(LinkList));s->data=p1->data;t->next=s;t=s;p1=p1->next;}t->next=NULL;return(L3);}LinkList *JiaoJi(LinkList *L1,LinkList *L2,LinkList *L4) /*求两集合的交集*/{LinkList *p1=L1->next,*p2,*s,*t;L4=(LinkList *)malloc(sizeof(LinkList));t=L4;while (p1!=NULL) /*在L1不为空时求交集,否则交集为空*/{p2=L2->next;while (p2!=NULL && p2->data<p1->data) /*按顺序比较各自数值的大小,若不相等就移动较小数值的指针*/{p2=p2->next;}if (p2!=NULL && p2->data==p1->data)/*若相等就记录下来*/{s=(LinkList *)malloc(sizeof(LinkList));s->data=p1->data;t->next=s;t=s;}p1=p1->next;}t->next=NULL;return(L4);}LinkList *ChaJi(LinkList *L1,LinkList *L2,LinkList *L5) /*求两集合的差集*/{LinkList *p1=L1->next,*p2,*s,*t;L5=(LinkList *)malloc(sizeof(LinkList));t=L5;while (p1!=NULL) /*仅在L1不为空的情况下求差集,否则差集为空*/{p2=L2->next;while (p2!=NULL && p2->data<p1->data) /*若L2的数值小于L1的数值就移动指针*/ {p2=p2->next;}if (!(p2!=NULL && p2->data==p1->data)) /*记录L1中有而L2中无的数值*/{s=(LinkList *)malloc(sizeof(LinkList));s->data=p1->data;t->next=s;t=s;}p1=p1->next;}t->next=NULL;return(L5);}void main() /*主函数,实现上述功能*/{char a[]={'2','4','5','8'};char b[]={'1','2','3','6','8','9'};LinkList *L1,*L2,*L3,*L4,*L5;L1=(LinkList *)malloc(sizeof(LinkList));L2=(LinkList *)malloc(sizeof(LinkList));L3=(LinkList *)malloc(sizeof(LinkList));printf("集合L1为:");L1=CreatList(L1,a,4);DispList(L1);printf("集合L2为:");L2=CreatList(L2,b,6);DispList(L2);L3=BingJi(L1,L2,L3);printf("两个集合的并集为:");DispList(L3);L4=(LinkList *)malloc(sizeof(LinkList));L4=JiaoJi(L1,L2,L4);printf("两个集合的交集为:");DispList(L4);L5=(LinkList *)malloc(sizeof(LinkList));L5=ChaJi(L1,L2,L5);printf("两个集合的差集为:");DispList(L5);}七、实验结果截图:八、实验任务分工:课程设计2 双栈共享空间一、组长:二、组员:三、实验日期:2010/4/20四、实验任务:设STACK[MAXSIZE]为n(n>2)个栈共享。
数据结构实验报告2篇

数据结构实验报告数据结构实验报告精选2篇(一)实验目的:1. 熟悉数据结构的基本概念和基本操作;2. 掌握线性表、栈、队列、链表等经典数据结构的实现方法;3. 掌握数据结构在实际问题中的应用。
实验内容:本次实验主要包括以下几个部分:1. 线性表的实现方法,包括顺序表和链表,分别使用数组和链表来实现线性表的基本操作;2. 栈的实现方法,包括顺序栈和链式栈,分别使用数组和链表来实现栈的基本操作;3. 队列的实现方法,包括顺序队列和链式队列,分别使用数组和链表来实现队列的基本操作;4. 链表的实现方法,包括单链表、双链表和循环链表,分别使用指针链、双向链和循环链来实现链表的基本操作;5. 综合应用,使用各种数据结构来解决实际问题,例如使用栈来实现括号匹配、使用队列来实现马铃薯游戏等。
实验步骤及结果:1. 线性表的实现方法:a) 顺序表的基本操作:创建表、插入元素、删除元素、查找元素等;b) 链表的基本操作:插入节点、删除节点、查找节点等;c) 比较顺序表和链表的优缺点,分析适用场景。
结果:通过实验,确认了顺序表适用于频繁查找元素的情况,而链表适用于频繁插入和删除节点的情况。
2. 栈的实现方法:a) 顺序栈的基本操作:进栈、出栈、判空、判满等;b) 链式栈的基本操作:进栈、出栈、判空、判满等。
结果:通过实验,掌握了栈的基本操作,并了解了栈的特性和应用场景,例如括号匹配。
3. 队列的实现方法:a) 顺序队列的基本操作:入队、出队、判空、判满等;b) 链式队列的基本操作:入队、出队、判空、判满等。
结果:通过实验,掌握了队列的基本操作,并了解了队列的特性和应用场景,例如马铃薯游戏。
4. 链表的实现方法:a) 单链表的基本操作:插入节点、删除节点、查找节点等;b) 双链表的基本操作:插入节点、删除节点、查找节点等;c) 循环链表的基本操作:插入节点、删除节点、查找节点等。
结果:通过实验,掌握了链表的基本操作,并了解了链表的特性和应用场景。
数据结构综合设计实验报告

数据结构综合设计实验报告好啦,今天咱们来聊聊“数据结构综合设计实验报告”这事儿。
首先得说,虽然这听上去像是一道艰深的题目,但其实也没想象的那么复杂。
你要知道,数据结构这个东西,说白了就是咱们用来存储和管理数据的各种方式。
就像你家里放东西的柜子,你得知道什么东西放哪个抽屉,啥该挂在墙上,啥放在桌子上。
这样生活起来才方便,对吧?数据结构就相当于是这座“数据大厦”的设计图。
你能想象吗?如果没有一个好的数据结构,处理数据就像是你在找个放杂物的地方找个特定的袜子,根本找不到!好了,说到实验报告,可能大家会想,实验报告嘛,就是写写写,写了半天就是总结总结,结论写个结尾啥的。
其实不然。
做这个实验报告,你得好好思考,得分析背后的每个数据结构为什么选择它,为什么这样设计。
就拿链表来说吧,这种结构可不是随便来的。
它就像是你手里那一串串的钥匙,每一把钥匙能开一个锁,但这些锁之间并不一定是顺序排列的,而是按需拼凑的。
链表的好处就是能根据需要灵活地增删节点,不需要像数组那样,一旦放进去就固定死了。
你说,谁不喜欢灵活性大一点的东西?然后再说说栈吧,这东西一听就让人联想到摞起来的盘子,或者你家的衣服堆成山,最上面的一件衣服总是最容易拿到。
栈的原则就是“先进后出”。
拿盘子来说,你最先放的盘子,是在最下面的,最后放的才是最上面的。
你每次取盘子,都是先拿最上面那一块,其他的都得等着。
这就有点类似我们的“先到先得”原则,但栈可不是那种随便排队的,谁在最上面就先来,其他的得排排队。
接下来聊聊队列。
说到队列,大家肯定就想起了超市的结账排队。
排队的人一个接一个,谁先来,谁就先走。
队列就是按照这个规则来操作的。
就像是排队买个冰淇淋,你不能插队,得等着自己的轮到。
这种“先进先出”的规则让队列变得非常简单有效。
当你需要按顺序处理数据时,队列是最靠谱的选择。
好啦,再讲讲哈希表。
哈希表有点像你家里放东西的那个抽屉柜,里面每个抽屉都有一个标签,可以快速找到你想要的东西。
数据结构实验一 实验报告

班级:姓名:学号:实验一线性表的基本操作一、实验目的1、掌握线性表的定义;2、掌握线性表的基本操作;如建立、查找、插入和删除等..二、实验内容定义一个包含学生信息学号;姓名;成绩的顺序表和链表二选一;使其具有如下功能:1 根据指定学生个数;逐个输入学生信息;2 逐个显示学生表中所有学生的相关信息;3 根据姓名进行查找;返回此学生的学号和成绩;4 根据指定的位置可返回相应的学生信息学号;姓名;成绩;5 给定一个学生信息;插入到表中指定的位置;6 删除指定位置的学生记录;7 统计表中学生个数..三、实验环境Visual C++四、程序分析与实验结果#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<string.h>#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status; // 定义函数返回值类型typedef struct{char num10; // 学号char name20; // 姓名double grade; // 成绩}student;typedef student ElemType;typedef struct LNode{ElemType data; // 数据域struct LNode *next; //指针域}LNode;*LinkList;Status InitListLinkList &L // 构造空链表L {L=struct LNode*mallocsizeofstruct LNode; L->next=NULL;return OK;}Status GetElemLinkList L;int i;ElemType &e // 访问链表;找到i位置的数据域;返回给 e{LinkList p;p=L->next;int j=1;whilep&&j<i{p=p->next;++j;}ifp||j>i return ERROR;e=p->data;return OK;}Status SearchLNode L;char str;LinkList &p // 根据名字查找{p=L.next;whilep{ifstrcmpp->;str==0return OK;p=p->next;}return ERROR;}Status ListInsertLinkList L;int i;ElemType e // 在i个位置插入某个学生的信息{LinkList p;s;p=L;int j=0;whilep&&j<i-1{p=p->next;++j;}ifp||j>i-1 return ERROR;s=struct LNode*mallocsizeofLNode;s->data=e;s->next=p->next;p->next=s;return OK;}Status ListDeleteLinkList p;int i // 删除i位置的学生信息{int j=0;whilep->next&&j<i-1{p=p->next;++j;}ifp->next||j>i-1 return ERROR;LinkList q;q=p->next;p->next=q->next;delete q;return OK;}void InputElemType *e{printf"姓名:"; scanf"%s";e->name;printf"学号:"; scanf"%s";e->num;printf"成绩:"; scanf"%lf";&e->grade;printf"输入完成\n\n";}void OutputElemType *e{printf"姓名:%-20s\n学号:%-10s\n成绩:%-10.2lf\n\n";e->name;e->num;e->grade;}int main{LNode L;LinkList p;ElemType a;b;c;d;printf"\n********************************\n\n";puts"1. 构造链表";puts"2. 录入学生信息";puts"3. 显示学生信息";puts"4. 输入姓名;查找该学生";puts"5. 显示某位置该学生信息";puts"6. 在指定位置插入学生信息";puts"7. 在指定位置删除学生信息";puts"8. 统计学生个数";puts"0. 退出";printf"\n********************************\n\n"; int x;choose=-1;whilechoose=0{puts"请选择:";scanf"%d";&choose;switchchoose{case 1:ifInitListpprintf"成功建立链表\n\n";elseprintf"链表建立失败\n\n";break;case 2:printf"请输入要录入学生信息的人数:";scanf"%d";&x;forint i=1;i<=x;i++{printf"第%d个学生:\n";i;Input&a;ListInsert&L;i;a;}break;case 3:forint i=1;i<=x;i++{GetElem&L;i;b;Output&b;}break;case 4:char s20;printf"请输入要查找的学生姓名:";scanf"%s";s;ifSearchL;s;pOutput&p->data;elseputs"对不起;查无此人";puts"";break;case 5:printf"请输入要查询的位置:";int id1;scanf"%d";&id1;GetElem&L;id1;c;Output&c;break;case 6:printf "请输入要插入的位置:";int id2;scanf"%d";&id2;printf"请输入学生信息:\n";Input&d;ifListInsert&L;id2;d{x++;puts"插入成功";puts"";}else{puts"插入失败";puts"";}break;case 7:printf"请输入要删除的位置:";int id3;scanf"%d";&id3;ifListDelete&L;id3{x--;puts"删除成功";puts"";}else{puts"删除失败";puts"";}break;case 8:printf"已录入的学生个数为:%d\n\n";x;break;}}printf"\n\n谢谢您的使用;请按任意键退出\n\n\n"; system"pause";return 0;}用户界面:(1)根据指定学生个数;逐个输入学生信息:(2)逐个显示学生表中所有学生的相关信息:(3)根据姓名进行查找;返回此学生的学号和成绩:(4)根据指定的位置可返回相应的学生信息学号;姓名;成绩:(5)给定一个学生信息;插入到表中指定的位置:(6)删除指定位置的学生记录:(7)统计表中学生个数:五、实验总结数据结构是一门专业技术基础课..它要求学会分析研究计算机加工的数据结构的特性;以便为应用涉及的数据选择适当的逻辑结构;存储结构及相应的算法;并初步掌握算法的时间分析和空间分析技术..不仅要考虑具体实现哪些功能;同时还要考虑如何布局;这次的实验题目是根据我们的课本学习进程出的;说实话;我并没有真正的读懂书本的知识;所以刚开始的时候;感到很棘手;于是又重新细读课本;这一方面又加强了对书本的理解;在这上面花费了一些心血;觉得它并不简单;是需要花大量时间来编写的....在本次实验中;在程序构思及设计方面有了较大的锻炼;能力得到了一定的提高..。
数据结构综合实验报告

一、实验目的和要求1理解串的一般线性表之间的差异。
2重点掌握在顺序串上和链串上实现串的基本运算算法。
3掌握串的简单匹配算法和KMP算法。
4灵活运用串这种数据结构解决一些综合应用问题。
二、实验环境、内容和方法实验内容:1实现顺序串的各种基本运算。
2实现链串的各种基本运算。
3实现顺序串的各种模式匹配运算。
4求一个串中出现的第一个最长重复串。
实验方法:通过上机操作完成各内容。
实验环境:实验用PC机一台,使用操作系统为Windows XP Professional,安装OFFICE 2003、VC++等软件。
三、实验过程描述实验题4.1实现顺序串各种基本运算的算法编写一个程序algo4-1.cpp,实现顺序串的各种基本运算,并在此基础上设计一个程序exp4-1.cpp 完成如下功能:1建立串谁“abcdefghefghefghijklmn”和串s1=”xyz”;2输出串s;3输出串s的长度;4在串s的第9个字符位置插入串s1而产生串s2;5输出串s2;6删除串s第2个字符开始的5个字符替换成串s1而产生串s2;7输出串s2;8将串s第2个字符开始的5个字符替换成串s1而产生串s2;s2;输出串9.10提取串s的第2个字符开始的10个字符而产生串s3;11输出串s3;12将串s1和串s2连接起来而产生串s4;13输出串s4.解:本工程Proj4_1组成结构如图4.1所示。
algo4-1.cpp文件,其中包含如下函数:StrAssign(SqString &str,char cstr[]):由串常量cstr创建串str. StrCopy(SqString &s,SqString t):将串t复制到串s.StrEqual(SqString s,SqString t):判断两个串s和t是否相同。
StrLength(SqString s):求串s的长度。
Concat(SqString s,SqString t):将串t连接到串s之后产生新串。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构综合实验
1 排队问题仿真
事件表数据类型定义
typedef struct { //数据域 //数据域 int occurTime; // 事件发生时刻 occurTime; char NType; NType; // 事件类型 } ElemType,Event; ElemType,Event; typedef struct Lnode { //链表结点 //链表结点 ElemType data; struct Lnode *next; }*Link,*Position;
数据结构综合实验
1 排队问题仿真
if (freeChair){ // 顾客即刻开始理发,freeChair 的初 顾客即刻开始理发, //值即为 chairNum。 //值即为 chairNum。 dT = en.occurTime + durtime; newDEvent = (dT, ‘D’); // 新的出门事件 MakeNode(newp, newDEvent); LocateElem(evL, newDEvent, compare);
1 排队问题仿真
else { //事件类型=1,处理顾客离开事件 //事件类型 , 事件类型=1 if(队列不空){ if(队列不空) 删除队头元素; 删除队头元素; 记录顾客离开的最晚时间; 记录顾客离开的最晚时间; 新出门事件插入事件表; 新出门事件插入事件表; 累计顾客逗留时间; 累计顾客逗留时间; }// if }// else }// while
数据结构综合实验
1 排队问题仿真
主算法详细描述 算法详细描述
BarberShop_Simulation { 设定事件表中的第一个元素 事件表中的第一个元素; 设定事件表中的第一个元素; 置空队列; 置空队列; while (当事件表不空){ 当事件表不空) 删除事件表中发生时刻最早的元素 事件表中发生时刻最早的元素; 删除事件表中发生时刻最早的元素; if(事件类型=0){ if(事件类型=0) //处理顾客进门事件 //处理顾客进门 处理顾客进门事件 累计顾客进门人数; 累计顾客进门人数; if(下一个到达时刻<关门时刻) if(下一个到达时刻<关门时刻) 进门事件插入事件表; 进门事件插入事件表;
需求分析
数据结构综合实验
1 排队问题仿真
建立数据模型建立数据模型-数据结构设计
本题目需要两种数据结构: 本题目需要两种数据结构: 链队列: 链队列:登录排队等候理发的顾客情 况,队列中的每个元素应包括顾客进门的 时刻和理发所需的时间。 时刻和理发所需的时间。 链表:登录顾客进门和出门的事件。 链表:登录顾客进门和出门的事件。 表中的元素应包括事件类型, 表中的元素应包括事件类型,还应按事件 发生的先后次序有序。 发生的先后次序有序。
数据结构综合实验
数据结构综合实验
1 银行排队事件模拟 2 迷宫问题
数据结构综合实验
1 排队问题仿真
例1 排队问题 用队列结构可以模拟现实生活中 的很多排队现象, 如车站候车、 的很多排队现象 , 如车站候车 、 医院 候诊、 候诊 、 银行排队等都可以通过程序进 行仿真模拟, 行仿真模拟 , 并由此预测客流等多种 经营指标。 下面以理发店为背景, 经营指标 。 下面以理发店为背景 , 讨 论排队类问题的系统仿真。 论排队类问题的系统仿真。
数据结构综合实验
1 排队问题仿真
问题描述
假设理发店内设有N把理发椅,可同 假设理发店内设有 把理发椅, 把理发椅 时为N位顾客进行理发 顾客进门, 位顾客进行理发。 时为 位顾客进行理发。顾客进门,可能 有两种情况。 有两种情况。 若当时理发店内尚有空闲理发椅, ①若当时理发店内尚有空闲理发椅, 则该顾客可立即入座理发, 则该顾客可立即入座理发,他在店内的逗 留时间即为他理发所需时间; 留时间即为他理发所需时间;
数据结构综合实验
1 排队问题仿真
if (nextAT<closeTime) { newAEvent = ( nextAT, ‘A’); // 新的进门事件 MakeNode(newp, newAEvent); LocateElem(evL, newAEvent, compare); Insafter(evL, newp); // 插入事件表 }
数据结构综合实验
1 排队问题仿真
② 否则需要排队候理 , 则他在店内的 否则需要排队候理, 逗留时间应为他理发所需时间和排队等候 的时间之和。 的时间之和。 一旦有顾客理完发离去时, 一旦有顾客理完发离去时 , 排在对头 的顾客便开始理发。 的顾客便开始理发 。 顾客的到达时间和理 发所需时间均可随机生成,并约定, 发所需时间均可随机生成 , 并约定 , 过了 营业时间顾客不再进门, 营业时间顾客不再进门 , 但仍需继续为已 进入店内的顾客理发, 进入店内的顾客理发 , 直至最后一名顾客 离开为止。 离开为止。
数据结构综合实验
1 排队问题仿真
事件链表结构定义
typedef struct { Link head,tail; // 头、尾指针 head,tail; int length; // 链表长度 Link current; //当前指针 //当前指针 } Link List; typedef LinkList EventList; //事件链表类型,定义为有序链表 事件链表类型, 事件链表类型
主算法设计
数据结构综合实验
1 排队问题仿真
生成“顾客理发所需时间 durtime” 生成“顾客理发所需时间 durtime” 和 “下一顾客到达的时间间隔 intertime” 两个 intertime” 随机数可从 语言的随机数函数得到。 可从C 随机数可从C语言的随机数函数得到。 occurtime, 假设当前事件发生的时刻为 occurtime, 则下一顾客进门事件发生的时刻则为 则下一顾客进门事件发生的时刻则为 occurtime + intertime。 intertime。 该顾客在当前时刻开始理发,经过 该顾客在当前时刻开始理发, durtime 时间之后便可离开理发馆,则应发 时间之后便可离开理发馆, 生时刻为 occurtime + durtime 。
数据结构综合实验
1 排队问题仿真
排队问题主算法描述
主算法是以处理顾客进门事件 主算法是以处理顾客进门事件和顾客离 顾客进门事件和 开事件为线索进行的 为线索进行的。 开事件为线索进行的。 void BarberShop_Simulation( int chairNum, BarberShop_Simulation( chairNum, int closeTime ) { // 理发店馆业务模拟 // chatrNum 为假设的理发馆的 //规模closeTime 为营业时间 //规模 规模closeTime OpenForDay; OpenForDay; // 初始化
数据结构综合实验
1 排队问题仿真
计算平均队列长度; 计算平均队列长度; 计算平均逗留时间; 计算平均逗留时间; }// BarberShop_Simulation
数据结构综合实验
1 排队问题仿真
void CustomerArrived(eventList evL, Queue CustomerArrived( evL, Q, Event en ) { // 处理顾客进门事件 Random(durtime, intertime); Random(durtime, intertime); nextAT = en.occurTime + intertime; intertime; // 下一顾客到达时刻, evL 为事件表,表 下一顾客到达时刻, 为事件表, //中的第1个事件为(0,‘A’)。durtime 为当 //中的第 个事件为(0,‘A’)。 中的第1 //前进门的顾客理发所需时间,intertime //前进门的顾客理发所需时间 前进门的顾客理发所需时间, //为下一个顾客即将进门的间隔时间。 //为下一个顾客即将进门的间隔时间 为下一个顾客即将进门的间隔时间。
数据结构综合实验
1 排队问题仿真
if(有空闲理发椅){ if(有空闲理发椅) 出门事件插入事件表; 新出门事件插入事件表; 累计顾客逗留时间 顾客逗留时间; 累计顾客逗留时间; } else{ 当前顾客插入队尾; 当前顾客插入队尾; 累计队列长度; 累计队列长度; } }// if
数据结构综合实验
数据结构综合实验
1 排队问题仿真
default : Invalid; }//switch }//while CloseForDay; CloseForDay; //计算平均逗留时间和排队的平均长度 //计算平均逗留时间和排队的平均长度 }//BarberShop_Simulation }//BarberShop_Simulation
数据结构综合实验
1 排队问题仿真
链队列结构定义 链队列结构定义
typedef struct { QueuePtr front; // 头指针 QueuePtr rear; // 尾指针 } LinkQueue; LinkQueue;
数据结构综合实验
1 排队问题仿真
假设进门事件类型 假设进门事件类型为’ A’,出门事件类型 进门事件类型为 ’D’。 为’D’。为便于按事件发生的先后次序顺序进 行处理,事件表应按发生的“时刻”有序。 行处理,事件表应按发生的“时刻”有序。 实际问题中,顾客进门的时刻和理发所 实际问题中, 需要的时间都是随机的。 需要的时间都是随机的。假设第一个顾客进 门的时刻为0 门的时刻为0。之后每个顾客进门的时刻在 前一个顾客进门时设定, 前一个顾客进门时设定,即以两个顾客之间 的时间间隔来确定下一个顾客的到达时间。 的时间间隔来确定下一个顾客的到达时间。
数据结构综合实验
ห้องสมุดไป่ตู้
1 排队问题仿真