09级软件学院数据结构实验报告模板@
数据结构表达式求值实验报告

竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告篇一:数据结构实验二——算术表达式求值实验报告《数据结构与数据库》实验报告实验题目算术表达式求值学院:化学与材料科学学院专业班级:09级材料科学与工程系pb0920603姓学邮名:李维谷号:pb09206285箱:指导教师:贾伯琪实验时间:20XX年10月10日一、需要分析问题描述:表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。
设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。
问题分析:在计算机中,算术表达式由常量、变量、运算符和括号组成。
由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。
因而在程序设计时,借助栈实现。
设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。
在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。
在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。
算法规定:输入形式:一个(:数据结构表达式求值实验报告)算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。
为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。
输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。
程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。
测试数据:正确输入:12*(3.6/3+4^2-1)#输出结果:194.4无定义运算:12*(3.6/(2^2-4)+1)#输出结果:表达式出错,除数为0,无意义错误输入:12+s#输出结果:eRRoR!二、概要设计拟采用两种类型的展分别对操作数和操作符进行操作。
数据结构实验报告模板(验证型)

学期:2010-2011学年第一学期指导教师:杨华莉成绩:实验一顺序表的基本操作一、实验目的1.掌握使用VC++6.0调试程序的基本方法;2.掌握线性表的顺序存储结构的类型定义;3.掌握顺序表的基本操作的实现,如:插入、删除、遍历、查找、排序、修改、合并等;4.掌握顺序表的应用。
二、实验要求1.认真阅读和掌握本实验的示例程序。
2.上机运行示例程序,打印出程序的运行结果,并作必要的说明。
3.对示例程序,按照对线性表的操作需要,在程序中至少添加2个顺序表的相关操作。
如:i.查找并显示分数在区间[a,b)的学生信息;ii.查找并显示最高分或最低分学生信息;iii.统计不及格或及格人数及所占比例;iv.将信息表按学号、姓名或分数升序或降序排列;v.按学号顺序进行数据元素的插入;vi.删除指定学号或姓名的学生信息;vii.修改某个学生的信息;viii.其它。
4.重新改写主函数(要求必需调用自己添加的操作),打印出文件清单(自己添加的函数、修改后的主函数和运行结果)。
5.对修改后的程序,分析每一个算法(函数)的时间复杂度。
6.根据上述要求撰写实验报告,并简要给出算法设计小结和心得。
三、实验环境1.台式计算机每人一台;2.软件:Visual C++6.0四、实验内容和实验结果一.示例程序运行结果及说明二.自己添加的新函数(至少2个),要求加必要的注释。
SqList Delete_SqList(SqList &L)//删除学生信息{Elemtype x;int i=0;int choice=DMenu();char name[25];int num,k;if(!L.length){printf("表为空,无法删除!");exit(0);}switch(choice){case 1: //按姓名删除printf("\n请输入要删除的学生的姓名\n");scanf("%s",&name);k=strcmp(name,L.data[i].name);//比较姓名if(k==0){x=L.data[i-1];for(int m=L.length-1;m>=i-1;--m)L.data[i-1]=L.data[i];--L.length;break;}case 2: //按学号删除printf("\n请输入要删除学生的学号\n");scanf("%d",&num);if(num==L.data[i].num){for(int m=L.length-1;m>=i-1;--m)L.data[i-1]=L.data[i];--L.length;break;}case 3:break;}return L;}void TongJi_SqList(SqList L)//统计信息表中学生的信息{int i;int choice=TMenu();//选择所要统计的方式的菜单switch(choice){case 1: for(i=0;i<L.length;i++)//统计男生信息if(L.data[i].sex=='m')PrintElem(L.data[i]);break;case 2: for(i=0;i<L.length;i++)//统计女生的信息if(L.data[i].sex=='f')PrintElem(L.data[i]);break;case 3: for(i=0;i<L.length;i++)//统计不及格的人if(L.data[i].score<60)printf(“不及格的为:”);PrintElem(L.data[i]);break;case 4: for(i=0;i<L.length;i++)//统计优秀的人if(L.data[i].score>90)printf(“分数在90分以上的为:”);PrintElem(L.data[i]);break;case 5: break;}}void PaiXu_SqList(SqList L)//排序{int i,j,k;int choice=PMenu();//选择菜单switch(choice){case 1: //按序号升序排列for(i=0;i<L.length;i++)for(j=0;j<L.length-i;j++)if(L.data[j].num>L.data[j+1].num){k=L.data[j].num;L.data[j].num=L.data[j+1].num; //冒泡法排序L.data[j+1].num=k;}for(j=0;j<L.length;j++)//输出排序结果PrintElem(L.data[j]);break;case 2: //按分数降序排列for(i=0;i<L.length;i++)for(j=0;j<L.length-i;j++)if(L.data[j].score<L.data[j+1].score){k=L.data[j].score;L.data[j].score=L.data[j+1].score;L.data[j+1].score=k;}for(j=0;j<L.length;j++)//输出结果PrintElem(L.data[j]);break;case 3: //按分数升序排列for(i=0;i<L.length;i++)for(j=0;j<L.length-i;j++)if(L.data[j].score>L.data[j].score){k=L.data[j].score;L.data[j].score=L.data[j+1].score;L.data[j+1].score=k;}for(j=0;j<L.length;j++)//输出排序结果PrintElem(L.data[j]);break;case 4: break;}}三.改写后的主函数(要求必需调用自己添加的操作)void main(){//通过文件input1.txt输入数据,结果输出到文件output1.txt //打开输入输出文件FILE *in,*out;if((in=fopen("input1.txt","r"))==NULL){ printf("cannot open infile\n");exit(0);}if((out=fopen("output1.txt","w"))==NULL){ printf("cannot open infile\n");exit(0);}int choice;SqList L;Init_SqList(L);//系统文件初始化,构造空表Lwhile(1){choice=Menu();switch(choice){case 1: Creat_SqList(L,in);//导入数据,根据文件input.txt读入的数据建立顺序表Lbreak;case 2: Traver_SqList(L);//查询,输出顺序表break;case 3: Insert_SqList(L);// 在顺序表L中插入一个新元素break;case 4: Delete_SqList(L);break;//删除元素case 5: TongJi_SqList(L);break;//统计case 6: PaiXu_SqList(L);break;//排序case 7: Cheng_SqList(L);break;//修改case 0: SaveList(L,out);fclose(in);fclose(out);exit(-1);break;//保存数据,并退出系统}getchar();}}四.改写后程序的运行结果。
《数据结构》实验报告模板(附实例)--实验一线性表的基本操作实现

《数据结构》实验报告模板(附实例)---实验一线性表的基本操作实现实验一线性表的基本操作实现及其应用一、实验目的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、程序清单(程序过长,可附主要部分)说明:以后每次实验报告均按此格式书写。
数据结构实验报告模板-09版 -v2

云南大学软件学院数据结构实验报告(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □学期:2012秋季学期任课教师: 秦江龙实验题目: 线性表及其应用小组长:联系电话:电子邮件:完成提交时间:年月日云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。
)云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。
)云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。
)(下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。
难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)基本思路:先写控制台程序,保证算法的正确性后,再将程序封装成界面程序;程序设计:用c++中文件的操作对要进行加密的明文来使之变为乱码,要求用户记住,文件加密密钥,只有记住密钥,然后通过志浩解密器才能转化为明文,从而起到加密的效果;编程知识:用到对文件的操作,对文件的打开,读写,关闭,删除,插入等操作。
对话框的打开以及对话框中的操作。
二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系)1、文件加密器包括加密以及解密:包括对文件的打开,密钥的输入,验证操作,对文件中字符的转化加密,;1、单击事件有四个:a.浏览…是为了用户能够打开要加密的文件,省去用户输入地址的麻烦,方便用户使用,使界面更加和谐,软件更加人性化;b.重置,是为了用户在输入密码时如果输入错误,可以点击清空后重置;c.加密文件,是用户在填完上面的信息之后可以开始加密就点击,点击完成后将会在相应的目录下生成加密文件,用户可以在原位置找到相应的加密文件;d.解密文件,是对已经用志浩加密器加密过的文件才能操作,在用户确认密钥后方可点击该按钮,点击完成当解密完成后将弹出提示,再到该目录下查找就可以看到加密的密文变为明文;三、【实现描述(Implement)】(30%)(本部分应包括:抽象数据类型具体实现的函数原型说明、关键操作实现的伪码算法、函数设计、函数间的调用关系,关键的程序流程图等,给出关键算法的时间复杂度分析。
数据结构实验报告模板

2009级数据结构实验报告实验名称:约瑟夫问题学生姓名:李凯班级:21班班内序号:06学号:09210609日期:2010年11月5日1.实验要求1)功能描述:有n个人围城一个圆圈,给任意一个正整数m,从第一个人开始依次报数,数到m时则第m个人出列,重复进行,直到所有人均出列为止。
请输出n个人的出列顺序。
2)输入描述:从源文件中读取。
输出描述:依次从显示屏上输出出列顺序。
2. 程序分析1)存储结构的选择单循环链表2)链表的ADT定义ADT List{数据对象:D={a i|a i∈ElemSet,i=1,2,3,…n,n≧0}数据关系:R={< a i-1, a i>| a i-1 ,a i∈D,i=1,2,3,4….,n}基本操作:ListInit(&L);//构造一个空的单链表表LListEmpty(L); //判断单链表L是否是空表,若是,则返回1,否则返回0.ListLength(L); //求单链表L的长度GetElem(L,i);//返回链表L中第i个数据元素的值;ListSort(LinkList<Type>&List) //单链表排序ListClear(&L); //将单链表L中的所有元素删除,使单链表变为空表ListDestroy(&L);//将单链表销毁}ADT List其他函数:主函数;结点类;约瑟夫函数2.1 存储结构[内容要求]1、存储结构:顺序表、单链表或其他存储结构,需要画示意图,可参考书上P59页图2-92.2 关键算法分析结点类:template<class Type> class CirList;//声明单链表类template<class Type> class ListNode{//结点类定义;friend class CirList<Type>;//声明链表类LinkList为友元类;Type data;//结点的数据域;ListNode<Type>*next;//结点的指针域;public:ListNode():next(NULL){}//默认构造函数;ListNode(const Type &e):data(e),next(NULL){}//构造函数Type & GetNodeData(){return data;}//返回结点的数据值;ListNode<Type>*GetNodePtr(){return next;}//返回结点的指针域的值;void SetNodeData(Type&e){data=e;}//设置结点的数据值;void SetNodePtr(ListNode<Type>*ptr){next=ptr;} //设置结点的指针值;};单循环链表类:template<class Type>class CirList{ListNode<Type>*head;//循环链表头指针public:CirList(){head=newListNode<Type>();head->next=head;}//构造函数,建立带头节点的空循环链表~CirList(){CirListClear();delete head;}//析构函数,删除循环链表void Clear();//将线性链表置为空表void AddElem(Type &e);//添加元素ListNode<Type> *GetElem(int i)const;//返回单链表第i个结点的地址void CirListClear();//将循环链表置为空表int Length()const;//求线性链表的长度ListNode<Type>*ListNextElem(ListNode<Type>*p=NULL);//返回循环链表p指针指向节点的直接后继,若不输入参数,则返回头指针ListNode<Type>*CirListRemove(ListNode<Type>*p);//在循环链表中删除p指针指向节点的直接后继,且将其地址通过函数值返回CirList<Type>&operator=(CirList<Type>&List);//重载赋值运算符};3. 程序运行结果源代码:#ifndef LISTNODE_H#define LISTNODE_Htemplate<class Type> class CirList;//声明单链表类template<class Type> class ListNode{//结点类定义;friend class CirList<Type>;//声明链表类LinkList为友元类;Type data;//结点的数据域;ListNode<Type>*next;//结点的指针域;public:ListNode():next(NULL){}//默认构造函数;ListNode(const Type &e):data(e),next(NULL){}//构造函数Type & GetNodeData(){return data;}//返回结点的数据值;ListNode<Type>*GetNodePtr(){return next;}//返回结点的指针域的值;void SetNodeData(Type&e){data=e;}//设置结点的数据值;void SetNodePtr(ListNode<Type>*ptr){next=ptr;} //设置结点的指针值;};#endif===================================================================== #ifndef CIRLIST_H#define CIRLIST_H#include<iostream>#include"ListNode.h"template<class Type>class CirList{ListNode<Type>*head;//循环链表头指针public:CirList(){head=new ListNode<Type>();head->next=head;}//构造函数,建立带头节点的空循环链表~CirList(){CirListClear();delete head;}//析构函数,删除循环链表void Clear();//将线性链表置为空表void AddElem(Type &e);//添加元素ListNode<Type> *GetElem(int i)const;//返回单链表第i个结点的地址void CirListClear();//将循环链表置为空表int Length()const;//求线性链表的长度ListNode<Type>*ListNextElem(ListNode<Type>*p=NULL);//返回循环链表p指针指向节点的直接后继,若不输入参数,则返回头指针ListNode<Type>*CirListRemove(ListNode<Type>*p);//在循环链表中删除p指针指向节点的直接后继,且将其地址通过函数值返回CirList<Type>&operator=(CirList<Type>&List);//重载赋值运算符};//=================================================================== //将循环链表置为空表template<class Type> void CirList<Type>::CirListClear(){ListNode<Type>*p;while(head->next!=head){p=head->next;head->next=p->next;delete p;}}//=================================================================== //返回循环链表p指针指向节点的直接后继,若不输入参数,则返回头指针template<classType>ListNode<Type>*CirList<Type>::ListNextElem(ListNode<Type>*p){if(p==NULL)return head;ListNode<Type>*q=p->next;if(q==head)q=q->next;return q;}//=================================================================== //将线性表置为空template<class Type>void CirList<Type>::Clear(){ListNode<Type>*p;while(head->next!=NULL){ p=head->next;head->next=p->next;delete p;}}//=================================================================== //在循环链表中删除p指针指向节点的直接后继,且将其地址通过函数值返回template<classType>ListNode<Type>*CirList<Type>::CirListRemove(ListNode<Type>*p){ListNode<Type>*q=p->next;if(q==head){q=q->next;head->next=q->next;}elsep->next=q->next;return q;}//=================================================================== //返回第i个结点的地址template<class Type>ListNode<Type>*CirList<Type>::GetElem(int i)const{ int j=0;ListNode<Type>*p=head;while(j<i&&p){j++;p=p->next;}if(!p||j>i) return NULL;return p;}//=================================================================== //添加元素template<class Type>void CirList<Type>::AddElem(Type&e){ListNode<Type>*p,*s=new ListNode<Type>(e);int i=Length();p=GetElem(i);p->next=s;s->next=head;}//=================================================================== //重载赋值运算符template<classType>CirList<Type>&CirList<Type>::operator=(CirList<Type>&List){if(this==&List)return *this;//赋值操作符重载,必须检查是否为自我赋值Clear();ListNode<Type>*p=List.head->next,*q=head,*s;while(p){s=new ListNode<Type>;s->data=p->data;q->next=s;q=s;p=p->next;}q->next=NULL;return *this;}//=================================================================== //求线性链表的长度template<class Type>int CirList<Type>::Length()const{int len=0;ListNode<Type>*p;for(p=head->next;p!=head;len++)p=p->next;return len;}#endif===================================================================== #include <iostream>#include "CirList.h"using namespace std;template<class Type>void Josephus(CirList<Type>&clist,int n,int m){ListNode<Type>*p,*current;for(int i=1;i<=n;i++)clist.AddElem(i);current=clist.ListNextElem();//得到循环链表的头指针for(int i=1;i<=n-1;i++)//删除过程循环n-1次{for(int j=1;j<=m-1;j++)//使current指针后移m-1次current=clist.ListNextElem(current);p=clist.CirListRemove(current);//删除满足要求的节点,且用 p 记录其地点cout<<"删除顺序:"<<p->GetNodeData()<<endl;delete p;//释放已删除结点占用的内存}current=clist.ListNextElem();//得到循环链表的头指针p=clist.ListNextElem(current);//获得最后剩下结点的地址cout<<"最后剩下:"<<p->GetNodeData()<<endl;}int main(int argc, char *argv[]){CirList<int> Jose;Josephus(Jose,14,17);system("PAUSE");return EXIT_SUCCESS;}4. 总结在课程设计中我更体会到:一个好的程序应该是一个所占空间小、运行时间短、其他性能也好的算法。
数据结构实验报告(类)参考模板

数据结构实验报告——模板类实现链表目录1.实验内容……………………………………………………………………PAGE.22.实验目的……………………………………………………………………PAGE.2 3预备知识……………………………………………………………………PAGE.24.技术难点……………………………………………………………………PAGE.25.设计思路……………………………………………………………………PAGE.36.成员函数实现举例…………………………………………………………PAGE.47.测试代码……………………………………………………………………PAGE.78.心得体会……………………………………………………………………PAGE.101.实验内容➢定义一个包含模板的结构。
➢定义一个链表类,能够增加元素、删除元素、查找元素、打印链表。
➢编写测试代码,验证链表类编写是否正确2.实验目的➢理解指针的定义➢理解类的结构➢学习使用类模板3.预备知识➢内存:计算机存储硬件。
为了区别内存的不同位置,内存被分成字节,内存的全部字节顺序地赋予一个称为地址的编号。
因此,内存地址是物理的,计算机设计好就给定了。
➢变量:在内存中占据一定的内存字节,在这些字节中存储的数据信息称为变量的内容。
因此,通过变量就可以操作内存,也就是说要操作某块内存,就必须先将这块内存的首地址和一个变量名绑定起来。
换句话说,当我们声明一个变量后,就意味着我们申请使用一块特定大小的内存,用于存储我们的数据。
➢指针变量:在变量中,有一类变量比较特殊,其形式为int *ptr。
其特殊性是指该变量不是直接存储数据,而是存储内存地址。
因此,通过该变量,我们可以得到另外一个内存空间所存储的信息。
➢数组:由于变量所申请的内存空间是非常有限的,很多情况下,我们需要更大的空间,例如存储字符串”C++ is difficult but interesting”。
数据结构实验二报告模板

数据结构实验2 回文判断班级:java092学号:200907092240姓名:赵冬冬实验一回文判断一、实验目的熟练栈和队列的各种操作。
二、实验内容1.同时建立一个栈和一个队列,即:每从键盘上输入一个字符,就把它作为一个新的栈和队列结点的数据域,插入到栈和队列。
这样就同时建立了一个栈和一个队列。
然后,让栈出栈的同时队列出队,比较它们是相等。
2.设计简单的程序实现回文判断的操作,加注释!//回文判断.cpp#include<stdio.h>#include<stdlib.h>typedef struct Node //定义队列结点类型{char data;struct Node *next;}Linkqueuenode;typedef struct {Linkqueuenode *front;//定义队列的对首指针Linkqueuenode *rear;//定义队列的对尾指针}Linkqueue;typedef struct node //定义栈结点类型{char data;struct node *next;}LinkStackNode,*LinkStack;void push( LinkStack top,char x) //进栈{LinkStackNode *temp; //创建新结点temp=(LinkStackNode *)malloc(sizeof(LinkStackNode));//分配空间temp->data=x;//接点赋值temp->next=top->next;top->next=temp;//数据进栈}void getinmain() //功能界面{printf("\t\t__________________________________________\n");printf("\t\t\t\t回文检测\t\t\n");printf("\n\n");printf("\t\t\t\t1. 输入字符串\n");printf("\t\t\t\t2. 检测是否为回文\n");printf("\t\t\t\t3. 退出\n");printf("\n请按指定的数字进行相应的操作:\n");}int queue(Linkqueue *q) //初始化队列{q->front=(Linkqueuenode *)malloc(sizeof(Linkqueuenode));//队列分配空间if(q->front!=NULL)//判断队是否为空{q->rear=q->front;//初始化队,使队为空q->front->next=NULL;return 1;}else return 0;}int enter(Linkqueue *q,char x) //入队操作{Linkqueuenode *newnode;//创建新结点newnode=(Linkqueuenode *)malloc(sizeof(Linkqueuenode));//队列分配空间if(newnode!=NULL){newnode->data=x;//结点赋值newnode->next=NULL;q->rear->next=newnode;//数据入队q->rear=newnode;return 1;}else return 0;}void pushenter(LinkStack top,Linkqueue *q) //一个元素同时进栈和入队{printf("请输入元素并以$结束\n");char x;//进栈和入队的元素scanf("%c",&x);while(x!='$')//输入$字符是停止循环{push(top,x);enter(q,x);scanf("%c",&x);//元素同时进栈和入队}printf("数据进栈入列成功!\n");}void check(LinkStack top,Linkqueue *p)//检测是否为回文数{char a,b;int c=0;Linkqueuenode *q;LinkStack w;w=top->next;q=p->front->next;while(q!=NULL&&w->next!=NULL)//判断队列和栈是否为空{a=w->data;//队列和栈不为空则进行出队和出栈操作b=q->next->data;q=q->next;w=w->next;printf("a=%c b=%c\n",a,b);if(a!=b)//检测是否为回文数{c=1;printf(">>>>>>>>>>>>>>>>不为回文<<<<<<<<<<<<<<<<<\n");break;}}if(c==0)printf("\n>>>>>>>>>>>>>>>>为回文<<<<<<<<<<<<<<<<<\n");}void main(){LinkStackNode top;//声明一个栈结点top.next=NULL;//将栈顶值为空Linkqueue q;queue(&q);//初始化队列system("pause");system("cls");s: getinmain();//进入功能选择界面int b;scanf("%d",&b);//选择功能switch(b){case 1:pushenter(&top,&q);system("pause");system("cls");goto s;case 2:check(&top,&q);system("pause");system("cls");goto s;case 3:exit(0);};}//实现各子函数并且加注释运行结果如下图:1、主菜单运行图2、输入数据2、检验是否为回文三、编程并上机调试运行四、时间、地点2011-4-8(星期五)软件学院机房五、指导教师邢莹(在书写过程中若出现错误,望老师指出,谢谢)。
数据结构实验报告范例参考模板

《数据结构与算法》实验报告专业班级姓名学号实验项目实验一二叉树的应用实验目的1、进一步掌握指针变量的含义及应用。
2、掌握二叉树的结构特征,以及各种存储结构的特点及使用范围。
3、掌握用指针类型描述、访问和处理二叉树的运算。
实验内容题目1:编写一个程序,采用一棵二叉树表示一个家谱关系。
要求程序具有如下功能:(1)用括号表示法输出家谱二叉树,(2)查找某人的所有儿子,(3)查找某人的所有祖先。
算法设计分析(一)数据结构的定义为了能够用二叉树表示配偶、子女、兄弟三种关系,特采用以下存储关系,则能在二叉树上实现家谱的各项运算。
二叉树型存储结构定义为:typedef struct SNODE{char name[MAX]; //人名struct SNODE *left; //指向配偶结点struct SNODE *right; //指向兄弟或子女结点}FNODE;(二)总体设计实验由主函数、家谱建立函数、家谱输出函数、儿子查找函数、祖先查找函数、结点定位函数、选择界面函数七个函数共同组成。
其功能描述如下:(1)主函数:统筹调用各个函数以实现相应功能void main()(2)家谱建立函数:与用户交互建立家族成员对应关系void InitialFamily(FNODE *&head) //家谱建立函数(3)家谱输出函数:用括号表示法输出家谱输出形式为:父和母(子1和子妻1(孙1),子2和子妻2(孙2))void PrintFamily(FNODE *head) //家谱输出函数(4)儿子查找函数:在家谱中查找到某人所有的子女并输出,同时也能辨别出其是否为家族成员与是否有子女void FindSon(FNODE *b,char p[]) //儿子查找函数(5)祖先查找函数:在家谱中查找到某人所有的祖先并输出,同时也能辨别出其是否为家族中成员。
int FindAncestor(FNODE *head,char son[ ]) //祖先查找函数(6)结点定位函数:在家谱中找到用户输入人名所对应的结点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
河南师范大学综合性、设计性实验报告学院名称(公章): 2010-2011学年第学期填表日期:年月日学号姓名年级实验课程名称数据结构实验项目名称银行业务模拟系统的设计与实现实验项目性质1、综合性√ 2、设计性主讲教师开课年级开课专业实验地点开课日期开课时间一、实验题目:银行业务模拟系统的设计与实现(该实验为综合性实验,共用6个学时)二、实验要求:1.问题描述:假设某银行有四个窗口对外接待客户,从早晨银行开门起不断有客户进入银行。
由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需在每个窗口前顺次排队,对于刚进入银行的客户,如果某个窗口的业务员正空闲,则可上前办理业务,反之,若四个窗口均有客户所占,他便会排在人数最少的队伍后面。
现在需要编制程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。
2.一个完整的系统应具有以下功能:1)初始化(OpenForDay),模拟银行开门时各数据结构的状态。
2)事件驱动(EventDrived), 对客户到达和离开事件做相应处理。
3)下班处理(CloseForDay), 模拟银行关门时的动作,统计客户平均逗留时间。
[备注]:假设银行开门的时刻(间)设为0 , 银行每天营业的时间在程序运行时输入(例如480分钟)。
每个客户办理业务的时间不超过30分钟,两个相邻客户到达银行的时间间隔不超过5分钟要求程序执行时,只要给出银行每天的营业时间即可输出客户平均逗留的时间。
三、总的设计思想、环境语言、工具等总的设计思想:为了计算这个平均的逗留时间,自然需要知道每个客户到达银行和离开银行这两个时刻,后者减去前者即为每个客户在银行的逗留时间。
所有客户逗留时间的总和被一天内进入银行的客户数除便是所求的平均时间。
称客户到达银行和离开银行这两个时间发生的事情为“事件”,则整个模拟程序将按事件的先后顺序进行处理。
这样一种程序称做事件驱动模拟。
下面是上述银行客户的离散事件驱动的模拟算法。
void Bank_Simulation( int CloseTime ){ //OpenForDay ( ); //初始化,模拟银行开门时各数据结构的状态。
while(有要处理的事件时) //有事件可处理{EventDrived ; //事件驱动,从事件表中取出事件en;//根据en的类型(客户到达事件或客户离开事件)做相应的处理if(en表示客户到达)CustomerArrived( );// 处理客户到达事件elseCustomerDeparture( ) ;// 处理客户离开事件}//whileCloseForDay( );//计算客户的平均逗留时间}// Bank_Simulation环境语言:Windows下的Microsoft VC++四、数据结构与模块说明下面是模拟程序中需要的数据结构及其操作。
1.模拟算法的主要处理对象是“事件”,事件的主要信息是事件的类型和事件的发生时刻。
算法中处理的事件有两类:一类是客户到达事件;另一类是客户离开事件。
前一类事件发生的时刻随客户的到来自然形成;后一类事件发生的时刻由客户办理业务所需时间和等待时间而定。
由于程序驱动是按事件发生时刻的先后顺序进行的,所以事件表应是有序表,其主要操作是插入和删除事件,用一个单链表表示!!2.模拟程序中需要的另一数据结构是表示客户排队的队列,由于假设银行有4个窗口,因此程序中需要4个队列,队列中有关客户的信息是客户到达的时刻和客户办理业务所需要的时间。
每个队列中的队头客户即为正在窗口办理事务的客户,他办完业务离开队列的时刻就是即将发生的客户离开事件的时刻,这就是说,对每个队头客户都存在一个将要驱动的客户离开事件。
因此在任何时刻即将发生的事伯只有5种可能:1)新的客户到达;2)1号窗口的客户离开;3)2号窗口的客户离开;4)3号窗口的客户离开;5)4号窗口的客户离开;注:为了使编写的程序具有通用性,在编程序时将银行的营业时间、开的窗口数、客户办业业务的最长时间及两个客户到达的时间间隔都设置成程序运行时动态输入,这样可以对程序以及银开设的窗口的合理性进行分析,实现真正的模拟。
从以上分析可知,在模拟程序中只需要两种数据结构:有序链表和队列。
程序中用到的头文件、类型定义及主要的函数原型如下:#include"stdio.h"#include"malloc.h"#include"math.h"#include"stdlib.h"int Cks=4; // 银行办理业务的窗口数,默认值为:4;最大值不超过20;int Qu ; // 客户队列数Qu=Cksint Khjg=5; // 两相邻到达客户的时间间隔最大值,默认值为:5int Blsj=30; // 每个客户办理业务的时间最大值,默认值为:30typedef struct // 定义事件的元素类型ElemType为结构体类型{int OccurTime; // 事件发生时刻int NType; // 事件类型,Qu表示到达事件,0至Qu-1表示Qu个窗口的离开事件}Event,ElemType; // 事件类型,有序链表LinkList的数据元素类型typedef struct LNode //定义事件表的结点类型{ElemType data ;struct LNode *next;} LNode, *LinkList;typedef LinkList EventList; // 事件链表类型,定义为有序链表typedef struct //定义客户队列的元素类型{int ArrivalTime; // 到达时刻int Duration; // 办理事务所需时间}QElemType; // 定义QElemType(队列的数据元素类型)为结构体类型;typedef struct QNode //定义客户队列的结点类型{QElemType data ;struct QNode *next;} QNode, *Queue;typedef struct { Queue head; Queue tail;} LinkQueue;LinkQueue q[Qu+1]; // Qu个客户队列void OpenForDay(); //模拟银行开门的动作,即初始化操作void CustomerArrived() // 处理客户到达事件void CustomerDeparture() // 处理客户离开事件五、主要算法的设计与实现void OpenForDay() //模拟银行开门的动作,即初始化操作{int i;InitList(ev); // 初始化事件链表为空en.OccurTime=0; // 设定第一个客户到达事件en.NType=0; // 客户到达事件Insert_EventList(ev, en);//插入事件q=(LinkQueue*)malloc((Qu+1)*sizeof(LinkQueue));//为队列申请Qu+1个队头指针,第0个不用for(i=1;i<Qu+1;++i) // 置空队列InitQueue(q[i]);}void CustomerArrived(){ // 处理客户到达事件QElemType f;int durtime,intertime,i;++CustomerNum;Random(durtime,intertime); // 生成随机数//printf("%d %d\n",durtime,intertime);et.OccurTime=en.OccurTime+intertime; // 下一客户到达时刻et.NType=0; // 队列中只有一个客户到达事件//printf("%d %d\n",et.NType,et.OccurTime);if(et.OccurTime<CloseTime) // 银行尚未关门,插入事件表Insert_EventList(ev,et);i=Minimum(q); // 求长度最短队列的序号,等长为最小的序号f.ArrivalTime=en.OccurTime;f.Duration=durtime;EnQueue(q[i],f);if(QueueLength(q[i])==1){et.OccurTime=en.OccurTime+durtime;et.NType=i;Insert_EventList(ev,et); // 设定第i队列的一个离开事件并插入事件表}}void CustomerDeparture(){ // 处理客户离开事件,en.NTyPe!=0int i;i=en.NType;DelQueue(q[i],customer); // 删除第i队列的排头客户TotalTime+=en.OccurTime-customer.ArrivalTime; // 累计客户逗留时间if(!QueueEmpty(q[i])){ // 设定第i队列的一个离开事件并插入事件表GetHead_q(q[i],customer);et.OccurTime=en.OccurTime+customer.Duration;et.NType=i;Insert_EventList(ev,et);}}void Bank_Simulation(){int i;OpenForDay( ); // 初始化while(!ListEmpty(ev)){//output_ev(ev);//for(i=1;i<QU+1;i++) output_q(q[i]);//getchar();//为观察执行结果用Gethead(ev,en); //printf("事件%d %d\n ",en.NType,en.OccurTime);if(en.NType==0)CustomerArrived(); // 处理客户到达事件elseCustomerDeparture(); // 处理客户离开事件} // 计算并输出平均逗留时间printf("顾客总数:%d, 所有顾客共耗时:%d分钟, 平均每人耗时: %d分钟\n",CustomerNum,TotalTime,TotalTime/CustomerNum);}六、源程序见电子稿(文件名为: .cpp ); //文件名由自己取七、运行结果请输入银行营业时间长度(单位:分)CloseTime=480请输入银行办理业务所开窗口数Cks=4请输入客户办理业务的最长时间Blsj=30请输入两个相邻客户到达银行的时间间隔的最大值Khjg=5顾客总数:154, 所有顾客共耗时:11303分钟, 平均每人耗时: 73分钟Press any key to continue请输入银行营业时间长度(单位:分)CloseTime=480请输入银行办理业务所开窗口数Cks=5请输入客户办理业务的最长时间Blsj=30请输入两个相邻客户到达银行的时间间隔的最大值Khjg=5顾客总数:154, 所有顾客共耗时:3854分钟, 平均每人耗时: 25分钟Press any key to continue请输入银行营业时间长度(单位:分)CloseTime=480请输入银行办理业务所开窗口数Cks=6请输入客户办理业务的最长时间Blsj=30请输入两个相邻客户到达银行的时间间隔的最大值Khjg=5顾客总数:154, 所有顾客共耗时:2705分钟, 平均每人耗时: 17分钟请输入银行营业时间长度(单位:分)CloseTime=480请输入银行办理业务所开窗口数Cks=4请输入客户办理业务的最长时间Blsj=15请输入两个相邻客户到达银行的时间间隔的最大值Khjg=5顾客总数:154, 所有顾客共耗时:1181分钟, 平均每人耗时: 7分钟从运行结果看,银行设置6个窗口比较合适!!八、自我评析与总结通过这次实验让我对我所学的数据结构只是有了更深的了解,知道学习知识不能只局限在课本知识这一层表面上,应该增强自己的动手能力。