北京理工大学数据结构实验3
北京理工大学数据结构编程练习答案
1.一元多项式相加(10分)成绩: 10 / 折扣: 0.8题目说明:编写一元多项式加法运算程序。
要求用线性链表存储一元多项式(参照课本)。
该程序有以下几个功能:1. 多项式求和输入:输入三个多项式,建立三个多项式链表Pa、Pb、Pc(提示:调用CreatePolyn(polynomial &P,int m)。
输出:显示三个输入多项式Pa、Pb、Pc、和多项式Pa+Pb、多项式Pa+Pb+Pc (提示:调用AddPolyn(polynomial &Pa, polynomial Pb), 调用PrintPolyn(polynomial P))。
0. 退出输入:根据所选功能的不同,输入格式要求如下所示(第一个数据是功能选择编号,参见测试用例):∙ 1多项式A包含的项数,以指数递增的顺序输入多项式A各项的系数(整数)、指数(整数)多项式B包含的项数,以指数递增的顺序输入多项式B各项的系数(整数)、指数(整数)多项式C包含的项数,以指数递增的顺序输入多项式C各项的系数(整数)、指数(整数)∙0 ---操作终止,退出。
输出:对应一组输入,输出一次操作的结果(参见测试用例)。
∙ 1 多项式输出格式:以指数递增的顺序输出: <系数,指数>,<系数,指数>,<系数,指数>,参见测试用例。
零多项式的输出格式为<0,0>∙0 无输出1.#include<iostream>#include<stdlib.h>using std::cin;using std::cout;using std::endl;struct date{int a;int b;struct date* pnext;};typedef struct date DATE;typedef struct date* PDATE;void output(PDATE p){int f=0;p=p->pnext;while(p!=NULL){if(p->a!=0){f=1;cout<<"<"<<p->a<<","<<p->b<<">";if(p->pnext==NULL)cout<<endl;elsecout<<",";}p=p->pnext;}if(f==0)cout<<"<0,0>"<<endl;}void add(PDATE a,PDATE b,PDATE c){PDATE p1,p2,p3;p1=a;p2=b;p3=c;if(p1!=NULL) p1=p1->pnext; //skip head if(p2!=NULL) p2=p2->pnext;while((p1!=NULL)&&(p2!=NULL)){if(p1->b>p2->b){p3->pnext=(PDATE)malloc(sizeof(DATE));p3=p3->pnext;p3->a=p2->a;p3->b=p2->b;p3->pnext=NULL;p2=p2->pnext;}else if(p1->b<p2->b){p3->pnext=(PDATE)malloc(sizeof(DATE));p3=p3->pnext;p3->a=p1->a;p3->b=p1->b;p3->pnext=NULL;p1=p1->pnext;}else{p3->pnext=(PDATE)malloc(sizeof(DATE));p3=p3->pnext;p3->a=p1->a+p2->a;p3->b=p1->b;p3->pnext=NULL;p1=p1->pnext;p2=p2->pnext;}}//end whileif(p1==NULL)p3->pnext=p2;if(p2==NULL)p3->pnext=p1;}int main(){int flag;int n;PDATE P[6]={NULL};PDATE p=NULL;for(int i=0;i<6;i++){P[i]=(PDATE)malloc(sizeof(DATE));P[i]->a=0;P[i]->b=0;P[i]->pnext=NULL;}cin>>flag;if(flag==1){for(int i=1;i<4;i++){p=P[i];cin>>n;while(n--!=0){p->pnext=(PDATE)malloc(sizeof(DATE));p=p->pnext;cin>>p->a>>p->b;p->pnext=NULL;}output(P[i]);}}add(P[1],P[2],P[4]);output(P[4]);add(P[4],P[3],P[5]);output(P[5]);}0 约瑟夫问题(10分)成绩: 10 / 折扣: 0.80 约瑟夫问题成绩10分折扣0.8(本题要求用循环链表实现)0 ,1, 2, 3题,只能选做三题.约瑟夫问题是一个经典的问题。
北京理工大学数据结构考研例题解析3
本资料由理硕教育整理,理硕教育是全国唯一专注于北理工考研辅导的学校,相对于其它机构理硕教育有得天独厚的优势。
丰富的理工内部资料资源与人力资源确保每个学员都受益匪浅,确保理硕教育的学员初试通过率89%以上,复试通过率接近100%,理硕教育现开设初试专业课VIP一对一,初试专业课网络小班,假期集训营,复试VIP一对一辅导,复试网络小班,考前专业课网络小班,满足学员不同的需求。
因为专一所以专业,理硕教育助您圆北理之梦。
详情请查阅理硕教育官网第 3 章特殊线性表——栈、队列和串课后习题讲解1. 填空⑴设有一个空栈,栈顶指针为1000H,现有输入序列为1、2、3、4、5,经过push,push,pop,push,pop,push,push后,输出序列是(),栈顶指针为()。
【解答】23,1003H⑵栈通常采用的两种存储结构是();其判定栈空的条件分别是(),判定栈满的条件分别是()。
【解答】顺序存储结构和链接存储结构(或顺序栈和链栈),栈顶指针top= -1和top=NULL,栈顶指针top等于数组的长度和内存无可用空间⑶()可作为实现递归函数调用的一种数据结构。
【解答】栈【分析】递归函数的调用和返回正好符合后进先出性。
⑷表达式a*(b+c)-d的后缀表达式是()。
【解答】abc+*d-【分析】将中缀表达式变为后缀表达式有一个技巧:将操作数依次写下来,再将算符插在它的两个操作数的后面。
⑸栈和队列是两种特殊的线性表,栈的操作特性是(),队列的操作特性是(),栈和队列的主要区别在于()。
【解答】后进先出,先进先出,对插入和删除操作限定的位置不同⑹循环队列的引入是为了克服()。
【解答】假溢出⑺数组Q[n]用来表示一个循环队列,front为队头元素的前一个位置,rear为队尾元素的位置,计算队列中元素个数的公式为()。
【解答】(rear-front+n)% n【分析】也可以是(rear-front)% n,但rear-front的结果可能是负整数,而对一个负整数求模,其结果在不同的编译器环境下可能会有所不同。
北京理工大学数据结构实验报告选作1
《数据结构与算法统计》实验报告学院:班级:学号:姓名:一、实验目的1.熟悉VC++6.0环境,学习使用C++实现链表的存储结构;2.通过编程,上机调试,进一步理解线性表、链表的基本概念。
二、实验内容归并顺序表(选作)。
请按以下要求编程实现:①从键盘输入两个升序排列的整数序列linka和linkb,每个序列以输入0为结束标记。
②将链表linka和linkb归并为linkc,linkc仍然为升序排列。
归并完成后,linka和linkb为空表。
输出linkc。
③对linkc进行处理,保持升序不变,删除其中重复的整数,对重复的整数只保留一个,输出删除重复整数后的链表。
例如:linka输入为:10 20 30 40 50 0linkb输入为:15 20 25 30 35 40 45 50 0归并后的linkc为:10 15 20 20 25 30 30 35 40 40 45 50 50删除重复后的linkc为:10 15 20 25 30 35 40 45 50三、程序设计1、概要设计说明程序的主要功能,主程序的流程以及各个程序模块之间的调用关系,给出主要流程图。
应用单链线性表寄存数字序列。
⑴单链线性表的抽象数据类型线性表的定义如下:ADT LinkList {数据对象:D = { ai | ai ∈ElemSet, i=1,…,n,n≥0 }数据关系:R1 = { <ai-1, ai> | ai-1,ai ∈D, i=2, …,n }基本操作:Creat(LinkList &L)操作结果:构造单链线性表L。
MergeList(LinkList &La,LinkList &Lb,LinkList &Lc)初始条件:单链线性表La,Lb,Lc已经存在。
操作结果:归并La,Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
Delete(LinkList &L)初始条件:链表L已经存在。
北京理工大学-数据结构实验报告-实验四--图书管理系统
实验四图书管理系统姓名:任子龙学号:1120140167 班级:05111451一。
需求分析(1)问题描述有一个小型书库保管了大量图书,关于图书有大量信息需要处理,这些信息包括图书的分类、书名、作者名、购买日期、价格等。
现要求编写一个程序以便于对图书的管理。
(2)基本要求:a.建立图书信息.b.提供查找功能,按照多种关键字查找需要的书籍。
例如按书名查找,输入书名后,将显示出该图书的所有信息,或显示指定信息。
c.提供排序功能,按照多种关键字对所有的书籍进行排序,例如按出版日期进行排序。
d.提供维护功能,可以对图书信息进行添加、修改、删除等功能。
(3)数据结构与算法分析将每一本书看作是一个基本单元。
由于涉及添加、修改操作,这里使用了链表作为数据存储结构;同时,考虑到排序功能,尝试使用双向链表。
其中,每本书作为一个结点,数据域包含char 型变量,指针域含有左右指针left和right。
二.概要设计1。
抽象数据类型的定义为实现上述功能,程序中使用了双向链表,只需要定义一种数据类型:typedef struct book{char number[10];char title[20];char author[10];char date[15];char price[10];struct book *right;struct book *left;}BK;注意结点的指针域有left和right两个。
2.本程序包含两个模块(1)主程序模块主函数只包含了Menu_select()函数。
目的是进入主菜单界面,进行功能选择;直到输入操作码0,退出系统;(2)双向链表单元模块——实现书籍信息的链式存储的抽象数据类型.各函数之间的调用关系:三。
详细设计1。
结点类型typedef struct book{char number[10];char title[20];char author[10];char date[15];char price[10];struct book *right;struct book *left;}BK;2.子函数(1)功能菜单调用函数Menu_select()使用户进入主菜单界面,进行功能选择;先进入无限循环,输入操作码进行系统管理工作,直到输入操作码0,退出系统;(2)各种功能函数Initialize()//初始化图书系统信息;Insert()//添加新的图书信息;Sort()//对图书进行排序,本程序可以实现按“图书编号”、“出版日期"、“图书价格”多种关键字进行排序;Search()//实现对图书的查找功能,本程序可以实现按“图书编号"、“出版日期”、“图书价格”多种关键字进行查找;deletebook()//删除无效的图书信息;Print_book()//打印全部图书信息。
北理工数据结构实验三
北理工数据结构实验三《数据结构与算法设计》实验报告——实验三学院:班级:学号:姓名:一、实验目的1.通过实验实践、巩固二叉树和队列的相关操作;2.熟悉VC环境,加强编程、调试的练习;3.用C语言实现二叉树和队列的抽象数据类型;4.用C语言编写递归函数,实现生成二叉树和遍历二叉树;5.用队列实现二叉树的层次遍历;6.理论知识与实际问题相结合,利用上述基本操作用多种方式遍历二叉树。
二、实验内容1、遍历二叉树。
请输入一棵二叉树的扩展的前序序列,经过处理后生成一棵二叉树,然后对于该二叉树输出前序、中序和后序遍历序列。
2、选做:按层次遍历二叉树。
三、程序设计1、概要设计为实现上述程序功能,需要建立抽象数据类型:二叉树和队列。
(1)、定义抽象数据类型二叉树的抽象数据类型定义为:ADT BinaryTree {数据对象D:D是具有相同特性的数据元素的集合。
数据关系R:若D=Φ,则R=Φ,称BinaryTree为空二叉树;若D≠Φ,则R={H},H是如下二元关系;(1)在D中存在惟一的称为根的数据元素root,它在关系H下无前驱;(2)若D-{root}≠Φ,则存在D-{root}={D1,Dr},且D1∩Dr =Φ;(3)若D1≠Φ,则D1中存在惟一的元素x1,∈H,且存在D1上的关系H1 ?H;若Dr≠Φ,则Dr中存在惟一的元素xr,∈H,且存在上的关系Hr ?H;H={,,H1,Hr};(4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树;(Dr,{Hr})是一棵符合本定义的二叉树,称为根的右子树。
基本操作:CreatBiTree(BiTree &T)操作结果:按先序次序建立二叉链表表示的二叉树TPreOrderTraverse(BiTree T)初始条件:二叉树T已经存在操作结果:先序遍历二叉树T ,对每个结点输出其数据元素InOrderTraverse(BiTree T)初始条件:二叉树T已经存在操作结果:中序遍历二叉树T ,对每个结点输出其数据元素PostOrderTraverse(BiTree T)初始条件:二叉树T已经存在操作结果:后序遍历二叉树T ,对每个结点输出其数据元素LevelOrderTraverse(BiTree T)初始条件:二叉树T已经存在操作结果:层次遍历二叉树T ,对每个结点输出其数据元素} ADT BinaryTree队列的抽象数据类型定义为:ADT Stack{数据对象:D={ai|ai∈ElemSet,i=1,2,3……,n,n≥0}数据关系:R1={ |ai∈D,i=1,2,……,n}约定其中a1端为队列头,an端为队列尾基本操作:InitQueue(&Q)功能:构造一个空队列Q。
院校资料-北理工数据结构实验报告
北理工数据结构实验报告《数据结构与算法设计》实验报告——实验二学院:自动化学院班级:____学号:__姓名:_____一、实验目的1、熟悉VC 环境,学习使用C 语言实现栈的存储结构。
2、通过编程、上机调试,进一步理解栈的基本概念。
3、锻炼动手编程,独立思考的能力。
二、实验内容实现简单计算器的功能,请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。
要求支持运算符:+、-、*、/、%、()和=:① 从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志;② 输入表达式中的数值均为大于等于零的整数,如果中间计算过程中出现小数也只取整进行计算。
例如,输入:4+2*5= 输出:14输入:(4+2)*(2-10)= 输出:-48三、程序设计1、概要设计为实现上述程序功能,应使用两个栈,分别寄存操作数与运算符。
为此,需要栈的抽象数据结构。
(1)、栈的抽象数据类型定义为:ADT Stack{数据对象:D={|,1,2,,,0}i i a a ElemSet i n n ∈=≥数据关系:R1=11{,|,,2,,}i i i i a a a a D i n --∈=约定n a 端为栈顶,1a 端为栈底。
基本操作:InitStack(&S)操作结果:创建一个空栈S。
GetTop(S,&e)初始条件:栈S已存在且非空。
操作结果:用e返回S的栈顶元素。
Push(&S,e)初始条件:栈S已存在。
操作结果:插入元素e为新的栈顶元素。
Pop(&S,&e)初始条件:栈S已存在且非空。
操作结果:删除S的栈顶元素,并用e返回其值。
In(m,a[])操作结果:若m是运算符,返回TRUE。
Precede(m, n)初始条件:m,n为运算符。
操作结果:若m优先级大于n,返回>,反之亦然。
Operation(a, theta,b)初始条件:a,b为整数,theta为运算符。
北京理工大学数据结构课程设计学生信息管理专题报告
专题设计(链表)报告题目:学生成绩管理系统小组成员:专题报告—————第十组问题描述设计一个“学生成绩管理系统”。
主要实现学生信息的录入、添加、修改、删除、排序和查看等基本功能。
设计要求编写一个学生成绩管理程序。
学生成绩以一个学生一条记录的形式存储,每个学生记录包含的信息有序号、学号、姓名及5门功课的成绩。
具体功能如下:a.获取学生成绩。
可以从文件中读取成绩,也可直接录入。
查询学生成绩,输入学生学号或姓名等信息后,显示学生在成绩单中的位置及所有信息。
b.添加学生成绩,在学生成绩单的指定位置添加学生成绩信息。
c.修改学生成绩,在学生成绩单中,修改指定学生的成绩信息。
d.删除学生成绩,在学生成绩单中,删除指定学生的成绩信息。
e.保存文件。
当学生成绩单发生添加、修改、删除等变化后,都要对最终结果进行保存。
数据结构学生成绩可以用单链表存储,方便随时插入和删除学生成绩记录,实现动态管理。
一个学生作为一个结点。
使用链表的基本算法实现学生成绩单的各项管理功能。
设计与实现成绩信息管理系统具体分为两个模块:数据类和功能类。
数据类包括学生的姓名、学号及成绩等信息。
通过对学生信息管理系统的功能分析,可以定义出系统的总体功能结构模块图,如上图所示。
当用户运行该系统后可以来进行学生信息信息(录入)插入管理、学生信息修改管理、学生信息删除管理、学生信息显示管理及学生信息显示等操作。
根据功能需求的结果分析,主界面应该由学生信息录入管理、学生信息插入管理、学生信息修改管理、学生信息删除管理、学生信息显示管理和学生信息信息查询管理组成,可以通过输入相应的数字进入相应的功能模块。
在本系统中需要编码实现的主要有学生信息录入、学生成绩信息插入、学生成绩信息查询、学生成绩信息修改、学生成绩信息删除和学生成绩信息输出等6个功能模块,以及学生信息的文件存储与读取功能。
学生成绩信息录入模块:添加的信息包括姓名、学号及各科成绩。
实际流程为开始→输入学生信息→调用类成员函数采用单链表保存数据→结束。
北理工数据结构作业3
第六章作业1、简述一棵度为2的树与一棵二叉树有何区别?答:1)度为2的树一定有度为2的结点,而二叉树节点的度只要满足小于等于2即可,因此不一定有度为2的结点;2)度为2的树结点的孩子的顺序是无序的,而二叉树结点的孩子是有序的。
2、假设一棵二叉树的层序序列为ABCDEFGHIJ和中序序列为DBGEHJACIF。
清画出该树。
答:3、假设二叉树如下,请分别写出先序、中序和后序遍历结果,并画出该二叉树对应的森林。
答:先序遍历:ABDGCEFH中序遍历:DGBAECHF后序遍历:GDBEHFCA该二叉树对应的森林:4、画出与下列已知序列对应的树T 。
树的先根次序访问的序列为:GFKDAIEBCHJ ;树的后根次序访问的序列为:DIAEKFCJHBG 。
5、请编写一个递归算法,将二叉树中所有结点的左、右子树相互交换。
typedef struct BiTNode {TelemType data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;void Exchange(BiTree &T){BiTree Temp;If(T->lchild||T->rchild){Temp=T->lchild;T->lchild=T->rchild;T->rchild=Temp;}if(T->lchild) Exchange(T->lchild);if(T->rchild) Exchange(T->rchild);}6、请设计按层次顺序(同一层自左向右)遍历二叉树的算法。
Status LevelTraverse(BiTree &T,Status (*Visit)(TelemType e)){ LinkQueue Q;BiTree b;InitQueue(Q);if(T){EnQueue(Q,T);while(!QueueEmpty(Q)){DeQueue(Q,b);Visit(b->data);if(b->lchild)EnQueue(Q,b->lchild);if(b->rchild)EnQueue(Q,b->rchild);}}return OK;}实验三1、遍历二叉树。
北京理工大学 数据结构 实验报告 实验二 简易计算器
实验二简易计算器姓名:任子龙学号:1120140167 班级:05111451一.需求分析1.程序要求可对一实数算术表达式进行简单的数学运算,可以识别带+、-、*、/、%、^(乘方)等等运算符及括号的中缀表达式,从键盘上输入一算术表达式(一般为中缀表达式),计算出表达式的值。
2.按照四则运算规则,求表达式的值。
一般规则如下:1)先括号内,再括号外。
2)先乘方,再乘除,后加减。
b.同级运算从左到右顺序执行。
3.有良好的提示信息,引导用户在键盘上输入规定的运算指令;如表达式有误,也应给出相应的提示信息。
4.建立两个工作栈,分别保存运算符,操作数或运算结果。
二.概要设计1.抽象数据类型的定义为实现上述功能,建立两个工作栈;算符为字符型变量,算数为单精度浮点型变量,则需要定义两种数据类型分别存储。
typedef struct StackChar{char c;struct StackChar*next;}SC;typedef struct StackFloat{float f;}SF;2.本程序包含两个模块(1)主程序模块主函数只包含了输入输出部分。
流程为:首先输入算式,然后调用算符优先算法函数EvaluateExpression(s)进行计算,结果输出;然后循环下去,直到输入OUT指令,退出程序;(2)链栈单元模块——实现栈的链式存储的抽象数据类型。
各函数之间的调用关系:三.详细设计1.结点类型typedef struct StackChar{char c;struct StackChar*next;}SC;float f;struct StackFloat*next;}SF;2.子函数(1)算符优先算法的主干函数float EvaluateExpression(char*e)实现算符优先算法主干的函数。
首先判断是算符还是算数,如果是算符,与算符栈栈顶元素进行优先级比较,如果该算符优先级比原栈顶元素优先级高,则进栈,否则进行运算;如果是算数,则入算数栈。
北京理工大学数据结构模拟题答案
本资料由理硕教育整理,理硕教育是全国唯一专注于北理工考研辅导的学校,相对于其它机构理硕教育有得天独厚的优势。
丰富的理工内部资料资源与人力资源确保每个学员都受益匪浅,确保理硕教育的学员初试通过率89%以上,复试通过率接近100%,理硕教育现开设初试专业课VIP一对一,初试专业课网络小班,假期集训营,复试VIP一对一辅导,复试网络小班,考前专业课网络小班,满足学员不同的需求。
因为专一所以专业,理硕教育助您圆北理之梦。
详情请查阅理硕教育官网数据结构试卷(一)参考答案一、选择题(每题2分,共20分)1.A2.D3.D4.C5.C6.D7.D8.C9.D 10.A二、填空题(每空1分,共26分)1.正确性易读性强壮性高效率2.O(n)3.9 3 34.-1 3 4 X * + 2 Y * 3 / -5.2n n-1 n+16.e 2e7.有向无回路8.n(n-1)/2 n(n-1)9.(12,40)()(74)(23,55,63)10.增加111.O(log2n) O(nlog2n)12.归并三、计算题(每题6分,共24分)1.线性表为:(78,50,40,60,34,90)2.邻接矩阵:邻接表如图11所示:图113. 用克鲁斯卡尔算法得到的最小生成树为: (1,2)3, (4,6)4, (1,3)5, (1,4)8, (2,5)10, (4,7)204. 见图12四、读算法(每题7分,共14分) 1. (1)查询链表的尾结点(2)将第一个结点链接到链表的尾部,作为新的尾结点(3)返回的线性表为(a 2,a 3,…,an ,a 1) 2. 递归地后序遍历链式存储的二叉树。
五、法填空(每空2分,共8 分) true BST->left BST->right 六、编写算法(8分)int CountX(LNode* HL,ElemType x) { int i=0; LNode* p=HL;//i 为计数器 while(p!=NULL) { if (P->data==x) i++; p=p->next;}//while, 出循环时i 中的值即为x 结点个数 return i; }//CountX数据结构试卷(二)参考答案一、选择题1.D2.B3.C4.A5.A6.C7.B8.C二、填空题1.构造一个好的HASH函数,确定解决冲突的方法2.stack.top++,stack.s[stack.top]=x3.有序4.O(n2),O(nlog2n)5.N0-1,2N0+N16.d/27.(31,38,54,56,75,80,55,63)8.(1,3,4,5,2),(1,3,2,4,5)三、应用题1.(22,40,45,48,80,78),(40,45,48,80,22,78)2.q->llink=p; q->rlink=p->rlink; p->rlink->llink=q; p->rlink=q;3.2,ASL=91*1+2*2+3*4+4*2)=25/94.树的链式存储结构略,二叉树略5.E={(1,3),(1,2),(3,5),(5,6),(6,4)}6.略四、算法设计题1.设有一组初始记录关键字序列(K1,K2,…,K n),要求设计一个算法能够在O(n)的时间复杂度内将线性表划分成两部分,其中左半部分的每个关键字均小于K i,右半部分的每个关键字均大于等于K i。
北理工数据结构实验报告4
《数据结构与算法统计》实验报告——实验四学院:班级:学号:姓名:一、实验目的1、熟悉VC 环境,学会使用C 语言利用顺序表解决实际问题。
2、通过上机、编程调试,加强对线性表的理解和运用的能力。
3、锻炼动手编程,独立思考的能力。
二、实验内容从键盘输入10个数,编程实现分别用插入排序、交换排序、选择排序算法进行排序,输出排序后的序列。
三、程序设计1、概要设计为了实现排序的功能,需要将输入的数字放入线性表中,进行进一步的排序操作。
(1)抽象数据类型:ADT SqList{数据对象:D={|,1,2,,,0}i i a a ElemSet i n n ∈=≥数据关系:R1=11{,|,,1,2,,}i i i i a a a a D i n --<>∈= 基本操作:Input(Sqlist & L)操作结果:构造一个线性表L 。
output(SqList L)初始条件:线性表L 已存在。
操作结果:按顺序在屏幕上输出L 的数据元素。
BiInsertionsort (Sqlist L)初始条件:线性表L 已存在。
操作结果:对L 的数据元素进行折半插入排序。
QuickSort (Sqlist L)初始条件:线性表L 已存在。
操作结果:对L 的数据元素进行交换排序。
SelectSort(SqList &L)初始条件:线性表L 已存在。
操作结果:对L 的数据元素进行选择排序。
}ADT SqList⑵ 宏定义#define KeyType int#define MAXSIZE 10#define ok 1#define error 0⑶主程序流程由主程序首先调用Input(L)函数创建顺序表,先调用BiInsertionsort (L)函数进行折半插入排序,调用output(L)函数显示排序结果。
再调用QuickSort (L)函数进行交换排序,调用output (L)函数显示排序结果。
北京理工大学数据结构实验三报告
} top++; stack[top]=ch; } else if(ch=='^'||ch=='%') { while(stack[top]=='^'||stack[top]=='%') { exp[t]=stack[top]; top--; t++; } top++; stack[top]=ch; } else if(ch=='*'||ch=='/') { while(stack[top]=='*'||stack[top]=='/') { exp[t]=stack[top]; top--; t++; } top++; stack[top]=ch; } else { // printf("第%d 个数开始出错!\n",i+1); judge=1; flag=0; break; } i++; ch=str[i]; } if(k!=l) { printf("括号不匹配!\n"); judge=1; flag=0; } else if (str[zs-1]=='+'||str[zs-1]=='-'||str[zs-1]=='*'||str[zs-1]== '/')
二叉树中不存在度大于 2 的结点) ,并且,二叉树的子树有左右之分, 其次序不能任意颠倒。 4. 二叉树的性质 (1)在二叉树的第 i 层上至多有 个结点(i≥1) 。
(2)深度为 k 的二ቤተ መጻሕፍቲ ባይዱ树至多有
个结点(k≥1) 。
北理工数据结构第三章实验报告
北理工数据结构第三章实验报告第三章作业1、写出下列程序段的输出结果。
viod main ( ){ Stack S;char x, y;InitStack (S);x=’c’; y=’k’;Push(S, x); Push(S, ’a’); Push(S, y);Pop(S, x); Push(S, ’t’); Push(S, x);Pop(S, x); Push(S, ’s’);while ( ! StackEmpty(S) ){ Pop(S, y);printf (y);}printf(x);}stac k2、简述下列算法的功能(栈的元素类型SElemType为int)。
(1)Ststus algo1(Stack S){ int I, n, A[255];n=0;while ( ! StackEmpty(S) ){ n++; Pop(S, A[n]);}for ( i=1; i<=n; i++ )Push(S, A[n]);}将栈S中的元素以出栈的顺序排在数组中,且出栈的先后和数组的序号从小到大一致。
栈S变成空栈。
然后再从前到后输出数组中的数。
(2)Status algo2(Stack S, int e){ Stack T; int d;InitStack (T);while ( ! StackEmpty(S) ){ Pop(S, d);if ( d!=e ) Push(T, d);}while ( ! StackEmpty(T) ){ Pop (T, d);Push (S, d);}}将和e一致的数排到栈底,其他元素前后顺序保持不变。
3、设有4个元素1、2、3、4依次进栈,而出栈操作可随时进行(进出栈可任意交错进行,但要保证进栈次序不破坏1、2、3、4的相对次序),请写出所有可能的出栈次序。
可能次序:(1243)(1234)(1324)(1342)(1432)(2143)(2134)(2341)(2431)(2314)(3214)(3421)(3241)(4321)4、写出下列程序段的输出结果(队列中的元素类型QelemType 为char)。
北理工数据结构实验报告1
《数据结构与算法设计》实验报告——实验一学院:自动化学院班级:__学号:__姓名:____ ____一、实验目的1、熟悉VC环境,学习使用C语言实现链表的存储结构。
2、通过编程、上机调试,进一步理解线性表、链表、环表的基本概念。
3、锻炼动手编程,独立思考的能力。
二、实验内容采用单向环表实现约瑟夫环。
请按以下要求编程实现:①从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表。
环表中的结点编号依次为1,2,……,m。
②从键盘输入整数s(1<=s<=m)和n,从环表的第s个结点开始计数为1,当计数到第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点的下一个结点开始重新计数到n,这样,不断进行计数,不断进行输出,直到输出了这个环表的全部结点为止。
例如,m=10,s=3,n=4。
则输出序列为:6,10,4,9,5,2,1,3,8,7。
三、程序设计1、概要设计为实现上述程序功能,应用单向环表寄存数字序列。
为此,需要单向环表的抽象数据结构。
(1)、单项环表的抽象数据类型定义为:ADT Joseph{数据对象:D={|,1,2,,,0}i i a a ElemSet i n n ∈=≥数据关系:R1=11{,|,,1,2,,}i i i i a a a a D i n --<>∈=基本操作:create(&J, n)操作结果:构造一个有n 个结点的单向环表J 。
show(J)初始条件:单向环表J 已存在。
操作结果:按顺序在屏幕上输出J 的数据元素。
calculate( J,s,n)初始条件:单向环表J 已存在,s>0,n>0,s<环表结点数。
操作结果:返回约瑟夫环的计算结果。
}ADT Joseph(2)、宏定义#define OK 1#define ERROR 0(3)、主程序流程主程序首先调用create(J,m)函数创建含有m 个结点的单向环表J ,随后调用show(J)函数显示创建的环表内容,最后调用calculate(J,s,n)函数计算结果并在屏幕上打印。
【免费下载】北京理工大学数据结构实验报告3
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根通保据过护生管高产线中工敷资艺设料高技试中术卷资,配料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高与中带资负料荷试下卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷错等调误,试高要方中求案资技,料术编试交写5、卷底重电保。要气护管设设装线备备置敷4高、调动设中电试作技资气高,术料课中并3中试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内 纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
数据结构实验三
数据结构实验三以下是为您起草的一份关于“数据结构实验三”的协议:合同主体:甲方:____________________________乙方:____________________________合同标的:1、本次协议的标的为“数据结构实验三”项目的相关合作事宜。
2、甲方和乙方将共同参与并完成“数据结构实验三”的任务,包括但不限于设计数据结构、编写代码、进行测试和优化等工作。
权利义务:11 甲方的权利义务111 甲方有权按照约定的分工和计划参与“数据结构实验三”的工作。
112 甲方有义务按时、按质量要求完成所承担的任务部分。
113 甲方应保守在实验过程中知悉的相关技术和业务秘密。
12 乙方的权利义务121 乙方有权对甲方的工作进行监督和检查。
122 乙方有义务向甲方提供必要的技术支持和协助。
123 乙方应按照约定的时间和方式与甲方进行沟通和协调。
违约责任:1、若甲方未能按时、按质量完成任务,应承担相应的责任,包括但不限于重新完成任务、采取补救措施,并可能承担因延误给乙方造成的损失。
2、若乙方未按约定提供技术支持和协助,导致实验任务受到影响,乙方应负责弥补损失,并采取措施改进。
3、若双方违反保密义务,泄露相关技术和业务秘密,应承担法律责任,并赔偿对方因此遭受的损失。
争议解决方式:1、本协议在履行过程中如发生争议,双方应首先友好协商解决。
2、若协商不成,任何一方均有权向有管辖权的人民法院提起诉讼。
本协议自双方签字(或盖章)之日起生效,有效期至“数据结构实验三”项目完成并验收合格之日止。
本协议一式两份,双方各执一份,具有同等法律效力。
北京理工大学数据结构编程练习答案
1.一元多项式相加(10分)成绩: 10 / 折扣: 0.8题目说明:编写一元多项式加法运算程序。
要求用线性链表存储一元多项式(参照课本)。
该程序有以下几个功能:1. 多项式求和输入:输入三个多项式,建立三个多项式链表Pa、Pb、Pc(提示:调用CreatePolyn(polynomial &P,int m)。
输出:显示三个输入多项式Pa、Pb、Pc、和多项式Pa+Pb、多项式Pa+Pb+Pc (提示:调用AddPolyn(polynomial &Pa, polynomial Pb), 调用PrintPolyn(polynomial P))。
0. 退出输入:根据所选功能的不同,输入格式要求如下所示(第一个数据是功能选择编号,参见测试用例):∙ 1多项式A包含的项数,以指数递增的顺序输入多项式A各项的系数(整数)、指数(整数)多项式B包含的项数,以指数递增的顺序输入多项式B各项的系数(整数)、指数(整数)多项式C包含的项数,以指数递增的顺序输入多项式C各项的系数(整数)、指数(整数)∙0 ---操作终止,退出。
输出:对应一组输入,输出一次操作的结果(参见测试用例)。
∙ 1 多项式输出格式:以指数递增的顺序输出: <系数,指数>,<系数,指数>,<系数,指数>,参见测试用例。
零多项式的输出格式为<0,0>∙0 无输出1.#include<iostream>#include<stdlib.h>using std::cin;using std::cout;using std::endl;struct date{int a;int b;struct date* pnext;};typedef struct date DATE;typedef struct date* PDATE;void output(PDATE p){int f=0;p=p->pnext;while(p!=NULL){if(p->a!=0){f=1;cout<<"<"<<p->a<<","<<p->b<<">";if(p->pnext==NULL)cout<<endl;elsecout<<",";}p=p->pnext;}if(f==0)cout<<"<0,0>"<<endl;}void add(PDATE a,PDATE b,PDATE c){PDATE p1,p2,p3;p1=a;p2=b;p3=c;if(p1!=NULL) p1=p1->pnext; //skip head if(p2!=NULL) p2=p2->pnext;while((p1!=NULL)&&(p2!=NULL)){if(p1->b>p2->b){p3->pnext=(PDATE)malloc(sizeof(DATE));p3=p3->pnext;p3->a=p2->a;p3->b=p2->b;p3->pnext=NULL;p2=p2->pnext;}else if(p1->b<p2->b){p3->pnext=(PDATE)malloc(sizeof(DATE));p3=p3->pnext;p3->a=p1->a;p3->b=p1->b;p3->pnext=NULL;p1=p1->pnext;}else{p3->pnext=(PDATE)malloc(sizeof(DATE));p3=p3->pnext;p3->a=p1->a+p2->a;p3->b=p1->b;p3->pnext=NULL;p1=p1->pnext;p2=p2->pnext;}}//end whileif(p1==NULL)p3->pnext=p2;if(p2==NULL)p3->pnext=p1;}int main(){int flag;int n;PDATE P[6]={NULL};PDATE p=NULL;for(int i=0;i<6;i++){P[i]=(PDATE)malloc(sizeof(DATE));P[i]->a=0;P[i]->b=0;P[i]->pnext=NULL;}cin>>flag;if(flag==1){for(int i=1;i<4;i++){p=P[i];cin>>n;while(n--!=0){p->pnext=(PDATE)malloc(sizeof(DATE));p=p->pnext;cin>>p->a>>p->b;p->pnext=NULL;}output(P[i]);}}add(P[1],P[2],P[4]);output(P[4]);add(P[4],P[3],P[5]);output(P[5]);}0 约瑟夫问题(10分)成绩: 10 / 折扣: 0.80 约瑟夫问题成绩10分折扣0.8(本题要求用循环链表实现)0 ,1, 2, 3题,只能选做三题.约瑟夫问题是一个经典的问题。
北京理工大学数据结构编程练习答案
1.一元多项式相加(10分)成绩: 10 / 折扣: 0.8题目说明:编写一元多项式加法运算程序。
要求用线性链表存储一元多项式(参照课本)。
该程序有以下几个功能:1. 多项式求和输入:输入三个多项式,建立三个多项式链表Pa、Pb、Pc(提示:调用CreatePolyn(polynomial &P,int m)。
输出:显示三个输入多项式Pa、Pb、Pc、和多项式Pa+Pb、多项式Pa+Pb+Pc (提示:调用AddPolyn(polynomial &Pa, polynomial Pb), 调用PrintPolyn(polynomial P))。
0. 退出输入:根据所选功能的不同,输入格式要求如下所示(第一个数据是功能选择编号,参见测试用例):∙ 1多项式A包含的项数,以指数递增的顺序输入多项式A各项的系数(整数)、指数(整数)多项式B包含的项数,以指数递增的顺序输入多项式B各项的系数(整数)、指数(整数)多项式C包含的项数,以指数递增的顺序输入多项式C各项的系数(整数)、指数(整数)∙0 ---操作终止,退出。
输出:对应一组输入,输出一次操作的结果(参见测试用例)。
∙ 1 多项式输出格式:以指数递增的顺序输出: <系数,指数>,<系数,指数>,<系数,指数>,参见测试用例。
零多项式的输出格式为<0,0>∙0 无输出1.#include<iostream>#include<stdlib.h>using std::cin;using std::cout;using std::endl;struct date{int a;int b;struct date* pnext;};typedef struct date DATE;typedef struct date* PDATE;void output(PDATE p){int f=0;p=p->pnext;while(p!=NULL){if(p->a!=0){f=1;cout<<"<"<<p->a<<","<<p->b<<">";if(p->pnext==NULL)cout<<endl;elsecout<<",";}p=p->pnext;}if(f==0)cout<<"<0,0>"<<endl;}void add(PDATE a,PDATE b,PDATE c){PDATE p1,p2,p3;p1=a;p2=b;p3=c;if(p1!=NULL) p1=p1->pnext; //skip head if(p2!=NULL) p2=p2->pnext;while((p1!=NULL)&&(p2!=NULL)){if(p1->b>p2->b){p3->pnext=(PDATE)malloc(sizeof(DATE));p3=p3->pnext;p3->a=p2->a;p3->b=p2->b;p3->pnext=NULL;p2=p2->pnext;}else if(p1->b<p2->b){p3->pnext=(PDATE)malloc(sizeof(DATE));p3=p3->pnext;p3->a=p1->a;p3->b=p1->b;p3->pnext=NULL;p1=p1->pnext;}else{p3->pnext=(PDATE)malloc(sizeof(DATE));p3=p3->pnext;p3->a=p1->a+p2->a;p3->b=p1->b;p3->pnext=NULL;p1=p1->pnext;p2=p2->pnext;}}//end whileif(p1==NULL)p3->pnext=p2;if(p2==NULL)p3->pnext=p1;}int main(){int flag;int n;PDATE P[6]={NULL};PDATE p=NULL;for(int i=0;i<6;i++){P[i]=(PDATE)malloc(sizeof(DATE));P[i]->a=0;P[i]->b=0;P[i]->pnext=NULL;}cin>>flag;if(flag==1){for(int i=1;i<4;i++){p=P[i];cin>>n;while(n--!=0){p->pnext=(PDATE)malloc(sizeof(DATE));p=p->pnext;cin>>p->a>>p->b;p->pnext=NULL;}output(P[i]);}}add(P[1],P[2],P[4]);output(P[4]);add(P[4],P[3],P[5]);output(P[5]);}0 约瑟夫问题(10分)成绩: 10 / 折扣: 0.80 约瑟夫问题成绩10分折扣0.8(本题要求用循环链表实现)0 ,1, 2, 3题,只能选做三题.约瑟夫问题是一个经典的问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、遍历二叉树。
请输入一棵二叉树的扩展的前序序列,经过处理后生成一棵二叉树,然后对于该二叉树输出前序、中序和后序遍历序列。
答:
示例:先序建树:依次输入二叉树的结点号,孩子为空的时候输入空格:
输入:abd f ce
输出:
先序遍历二叉树为:abdfce
中序遍历二叉树为:dfbaec
后序遍历二叉树为:fdbeca
代码如下:
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree create(BiTree T)
{
char ch;
scanf("%c",&ch);
if(ch==' ')
T=NULL;
else
{
T=(BiTree)malloc(sizeof(BiTNode)); if(!T)
exit(OVERFLOW);
T->data=ch;
T->lchild=create(T->lchild);
T->rchild=create(T->rchild);
}
return T;
}
void PreOrderTraverse(BiTree T)
{
if(T){
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T)
{
if(T){
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T)
{
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
}
void main()
{ BiTree T;
printf("先序建树:依次输入二叉树的结点号,孩子为空的时候输入空格:\n"); T=create(T);
printf("\n先序遍历二叉树为:");
PreOrderTraverse(T);
printf("\n中序遍历二叉树为:");
InOrderTraverse(T);
printf("\n后序遍历二叉树为:");
PostOrderTraverse(T);
}
2、按层次遍历二叉树。
答:
示例:先序建树:依次输入二叉树的结点号,孩子为空的时候输入空格: 输入:abd f ce
输出:层次遍历二叉树:abcdef
代码如下:(程序存为.cpp)
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
typedef struct QNode{
BiTree data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct {
QueuePtr front;//对头指针
QueuePtr rear;//队尾指针
}LinkQueue;
int InitQueue(LinkQueue &Q){
//构造一个空队列
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q.front)exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}
int EnQueue(LinkQueue &Q,BiTree e){
//插入元素e为Q的新的对位队尾元素
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)exit(OVERFLOW);//存储分配失败
p->data=e; p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
int DeQueue(LinkQueue &Q,BiTree &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;
free(p);
return OK;
}
int QueueEmpty(LinkQueue Q){
if(Q.front==Q.rear)return 1;
else return 0;
}
BiTree CreateBiTree(BiTree &T){
//按照先序次序输入二叉树中结点的值(一个字符),空格字符表示空树,//构造二叉链表表示的二叉树T。
char ch;
scanf("%c",&ch);
if(ch==' ') T=NULL;
else{
T=(BiTree)malloc(sizeof(BiTNode));
if(!T)exit(OVERFLOW);
T->data=ch;//生成根结点
T->lchild=CreateBiTree(T->lchild);//构造左子树
T->rchild=CreateBiTree(T->rchild);//构造右子树
}
return T;
}
void LevelTraverse(BiTree T){
LinkQueue Q;
BiTree b;
InitQueue(Q);
if(T){
EnQueue(Q,T);
while(!QueueEmpty(Q))
{
DeQueue(Q,b);
printf("%c",b->data);
if(b->lchild)EnQueue(Q,b->lchild);
if(b->rchild)EnQueue(Q,b->rchild);
}
}
}
main(){
BiTree T;
printf("先序建树:依次输入二叉树的结点号,孩子为空时输入空格:\n"); T=CreateBiTree(T);
printf("\n层次遍历二叉树:");
LevelTraverse(T);
}。