东北大学数据结构上机实验报告3
数据结构上机实验报告
else insert(lc,i/2,la.list[i]); //偶数位次元素插入lc
}
printf("\n您输入的线性表元素为:\n\n");
print(la);
printf("线性表的奇数位次的元素为:\n\n");
print(lb);
printf("线性表的偶数位次的元素为:\n\n");
print(lc);
}
void initial(sqlist &v)
{printf(" ****本程序可以实现线性表奇偶位序的元素分别输出****\n\n\n");
int i,a;
printf("请输入一个偶数作为线性表的长度:\n\n");
void initlist(sqlist &);
void print(sqlist); //输出线性表
void main()
{printf(" *****************本程序可以实现线性表的复制******************\n");
sqlist la,lb; //声明线性表
initial(la);
【程序设计细想】:
建立三个线性表la,lb,lc,对线性表la进行输入,然后利用循环结构对la中奇数位序的元素对lb进行插入操作,对偶数位序的元素对lc进行插入操作,从而得到线性表lb和lc。
【程序代码】:
#include<stdio.h>
#include<malloc.h>
数据结构上机操作实验报告
实验一单链表的基本操作(必做)一、实验目的1.掌握单链表的存储、初始化、插入、删除等操作的程序实现。
2.加深对单链表基本概念,基本理论及相应算法的掌握与理解。
3.了解链表的处理方式,学习体会简单的单链表程序实现相关知识。
二、实验内容1.建立一个链表、设计链表的基本操作实现算法、输出一个链表表,调试并输出结果。
2.编写一个程序实现如下功能:让计算机产生出50个0~9之间的随机数并依次保存到单链表中;输出遍历单链表;从单链表中删除与给定值相等的所有结点;输出遍历单链表;输出单链表长度,调试并输出结果。
三、实验步骤1.定义一个链表结构体。
2.利用插入功能插入一个结点。
3.利用删除功能删除一个结点。
四、程序运行测试1.利用插入功能插入一个结点。
2.利用删除功能删除一个结点。
五、实验报告要求1.绘制链表操作实现的流程图。
2.详细给出程序运行测试结果(包括测试数据和测试结果)。
3.选试验步骤2-3中的任意一个,给出程序的详细注释。
4.参考程序中某一部分功能的改进(选做)5.实验心得与体会6.附录,实验用源程序六、参考源代码#include <iostream.h>#include <malloc.h>typedef struct LNode{int data;struct LNode *next;}Lnode, *LinkList;//假设下面的单链表均为带头结点。
void CreatLinkList(LinkList &L,int j){//建立一个单链表L,数据为整数,数据由键盘随机输入。
LinkList p,q;L=(LinkList )malloc(sizeof(Lnode));L->next=NULL;q=L;cout<<"在单链表内输入整数:"<<endl;for(int i=0;i<j;i++) p=(LinkList)malloc(sizeof(Lnode)); cin>>p->data;p->next=q->next;q->next=p;q=p; }int PrintLinkList(LinkList &L){//输出单链表L的数据元素LinkList p;p=L->next;if(L->next==NULL){cout<<"链表没有元素!"<<endl;return 0;}cout<<"单链表的数据元素为:";while(p){cout<<p->data<<" ";p=p->next;}cout<<endl;return 1;}void LinkListLengh(LinkList &L){//计算单链表L的数据元素个数。
数据结构实验三实验报告
数据结构实验三实验报告数据结构实验三实验报告一、实验目的本次实验的目的是通过实践掌握树的基本操作和应用。
具体来说,我们需要实现一个树的数据结构,并对其进行插入、删除、查找等操作,同时还需要实现树的遍历算法,包括先序、中序和后序遍历。
二、实验原理树是一种非线性的数据结构,由结点和边组成。
树的每个结点都可以有多个子结点,但是每个结点只有一个父结点,除了根结点外。
树的基本操作包括插入、删除和查找。
在本次实验中,我们采用二叉树作为实现树的数据结构。
二叉树是一种特殊的树,每个结点最多只有两个子结点。
根据二叉树的特点,我们可以使用递归的方式实现树的插入、删除和查找操作。
三、实验过程1. 实现树的数据结构首先,我们需要定义树的结点类,包括结点值、左子结点和右子结点。
然后,我们可以定义树的类,包括根结点和相应的操作方法,如插入、删除和查找。
2. 实现插入操作插入操作是将一个新的结点添加到树中的过程。
我们可以通过递归的方式实现插入操作。
具体来说,如果要插入的值小于当前结点的值,则将其插入到左子树中;如果要插入的值大于当前结点的值,则将其插入到右子树中。
如果当前结点为空,则将新的结点作为当前结点。
3. 实现删除操作删除操作是将指定的结点从树中移除的过程。
我们同样可以通过递归的方式实现删除操作。
具体来说,如果要删除的值小于当前结点的值,则在左子树中继续查找;如果要删除的值大于当前结点的值,则在右子树中继续查找。
如果要删除的值等于当前结点的值,则有三种情况:- 当前结点没有子结点:直接将当前结点置为空。
- 当前结点只有一个子结点:将当前结点的子结点替代当前结点。
- 当前结点有两个子结点:找到当前结点右子树中的最小值,将其替代当前结点,并在右子树中删除该最小值。
4. 实现查找操作查找操作是在树中寻找指定值的过程。
同样可以通过递归的方式实现查找操作。
具体来说,如果要查找的值小于当前结点的值,则在左子树中继续查找;如果要查找的值大于当前结点的值,则在右子树中继续查找。
东北大学数据结构实验分析
课程编号:B0801010501.实验目的实验一:1.理解队列的概念以及用法2.掌握queue类的使用3.熟练运用队列先进先岀,模拟打印机的工作过程实验二:1.理解图的概念2.理解并掌握图的存储,并利用邻接表来存储图的信息3.理解并掌握Dijkstra算法4.运用Dijkstra算法解决最短路径的问题针对每次实验,写岀你认为比较重要的实验目的2.实验内容与实验步骤2.1打印机模拟程序的内容与步骤(1)简短明确地写岀实验的内容模拟打印机打印的过程,以先来先服务的策略来完成打印工作。
先从一个文件中读取所有任务的大小与到达时间,并将其存储在workload队列中。
使用一个计数器来模拟时间的流逝,当当前时间与workload队列中的一个任务的到达时间相等的时候,该任务被弹岀,并被压入到另一个等待执行的队列中。
该等待执行的队列以先入先出的准则依次弹出任务并执行。
最后计算出任务总数与,总等待时间,平均等待时间。
(2)简短描述抽象数据类型或设计的函数描述,说明为什么要使用这种抽象数据类型,并说明你的解决设想①一个simulator的抽闲类和它的实现类fifo类。
该类的simulate函数用来实现先进先岀策略的打印算法。
②两个队列,一个workload队列,一个是等待执行队列。
Workload队列中存放的是所有的打印任务,通过文件读取并保存。
而等待执行队列则是为了实现FIFO功能的队列,即时间小的就先被压入等待执行队列,自然也就先被pop并执行。
解决设想:利用一个int型变量模拟时间的流逝,然后当等待执行队列为空的时候,就不断循环检查workload队列中是否有任务到达,若有则将其弹岀并push进等待执行队列。
而当等待执行队列中有任务时则执行它,并且同时判断workload队列中是否有任务到达。
若workload和等待执行队列同时为空了,则程序结束。
-1 -⑶简短明确地写岀你实验所采用的存储结构及其用途,详细说明其中的属性的含义。
东北大学操作系统实验三报告
东北大学操作系统实验三报告SANY标准化小组 #QS8QHH-HHGX8Q8-GNHHJ8-HHMHGN#操作系统实验报告班级物联网1302班学号姓名实验3 进程同步和通信-生产者和消费者问题模拟1. 目的:调试、修改、运行模拟程序,通过形象化的状态显示,使学生理解进程的概念,了解同步和通信的过程,掌握进程通信和同步的机制,特别是利用缓冲区进行同步和通信的过程。
通过补充新功能,使学生能灵活运用相关知识,培养创新能力。
2. 内容及要求:1) 调试、运行模拟程序。
2) 发现并修改程序中不完善的地方。
3) 修改程序,使用随机数控制创建生产者和消费者的过程。
4) 在原来程序的基础上,加入缓冲区的写互斥控制功能,模拟多个进程存取一个公共缓冲区,当有进程正在写缓冲区时,其他要访问该缓冲区的进程必须等待,当有进程正在读取缓冲区时,其他要求读取的进程可以访问,而要求写的进程应该等待。
5) 完成1)、2)、3)功能的,得基本分,完成4)功能的加2分,有其它功能改进的再加2分3. 程序说明:本程序是模拟两个进程,生产者(producer)和消费者(Consumer)工作。
生产者每次产生一个数据,送入缓冲区中。
消费者每次从缓冲区中取走一个数据。
缓冲区可以容纳8个数据。
因为缓冲区是有限的,因此当其满了时生产者进程应该等待,而空时,消费者进程应该等待;当生产者向缓冲区放入了一个数据,应唤醒正在等待的消费者进程,同样,当消费者取走一个数据后,应唤醒正在等待的生产者进程。
就是生产者和消费者之间的同步。
每次写入和读出数据时,都将读和写指针加一。
当读写指针同样时,又一起退回起点。
当写指针指向最后时,生产者就等待。
当读指针为零时,再次要读取的消费者也应该等待。
为简单起见,每次产生的数据为0-99的整数,从0开始,顺序递增。
两个进程的调度是通过运行者使用键盘来实现的。
4. 程序使用的数据结构进程控制块:包括进程名,进程状态和执行次数。
东北大学数据结构实验报告
.. ... ... 实 验 报 告一、实验目的(1) 掌握线性表的基本操作(插入、删除、查找)以及线性表合并等运算在顺序存储结构、链式存储结构上的实现。
重点掌握链式存储结构实现的各种操作。
(2) 掌握线性表的链式存储结构的应用。
二、实验内容与实验步骤(1)实验内容:实现约瑟夫环,约瑟夫环(Joseph )问题的一种描述是:编号为1、2、3……n 的n 个人按照顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数的上限值m ,从第一个人开始按照顺时针的方向自1开始顺序报数,报到m 时停止报数。
报m 的人出列,将他的密码作为新的m 值,从他的顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
设计一个程序求出出列顺序。
(2)抽象数据类型和设计的函数描述,说明解决设想。
首先定义一个链表,用其中的data 项存储每个人的编号,用password 项存储每个人所持有的密码,并且声明一个指针。
之后使用CreatList_CL 函数来创建一个循环链表,在其中的data 和password 中存入编号和密码,最后使最后一个节点的next 指向L ,使其能够形成循环队列。
定义了函数Display 来显示链表当中的内容,以确定存储的数据没有错误。
定义了函数Delete_L 来实现约瑟夫环中依次删除的功能,依次比较,如果某个人所持的密码和m 值相等,则删除这个结点,并且输出此时该结点的编号和密码,实现出列的功能。
(3) 简短明确地写出实验所采用的存储结构,并加以说明。
该实验我主要采用的是线性表的链式存储结构,首先定义了链表的结构,其中包括data 项和password 项,分别存储每个人的编号和所持密码,还声明了指向下一个结点的指针,该指针可以连接各个结点,并且将最后一个结点的指针指向第一个结点使之成为一个循环链表。
三、实验环境操作系统:Windows 7调试软件名称:Visio Studio2017 上机地点:信息楼B405 四、实验过程与分析(1)主要的函数或操作内部的主要算法,分析这个算法的时、空复杂度,并说明设计的巧妙之处。
数据结构上机实验报告
数据结构上机实验报告学院:电子工程学院专业:信息对抗技术姓名:学号:教师:饶鲜日期:目录实验一线性表 ........................................................................................................ - 4 -一、实验目的.................................................................................................... - 4 -二、实验代码.................................................................................................... - 4 -三、实验结果.................................................................................................. - 14 -四、个人思路.................................................................................................. - 15 - 实验二栈和队列 .................................................................................................. - 15 -一、实验目的.................................................................................................. - 15 -二、实验代码.................................................................................................. - 16 -三、实验结果.................................................................................................. - 24 -四、个人思路.................................................................................................. - 25 - 实验三数组 .......................................................................................................... - 26 -一、实验目的.................................................................................................. - 26 -二、实验代码.................................................................................................. - 26 -三、实验结果.................................................................................................. - 28 -四、个人思路.................................................................................................. - 28 - 实验四树 .............................................................................................................. - 29 -一、实验目的.................................................................................................. - 29 -二、实验代码.................................................................................................. - 29 -三、实验结果.................................................................................................. - 39 -四、个人思路.................................................................................................. - 39 -实验一线性表一、实验目的1.熟悉线性表的顺序和链式存储结构2.掌握线性表的基本运算3.能够利用线性表的基本运算完成线性表应用的运算二、实验代码1.设有一个线性表E={e1, e2, … , e n-1, e n},设计一个算法,将线性表逆置,即使元素排列次序颠倒过来,成为逆线性表E’={ e n, e n-1 , … , e2 , e1 },要求逆线性表占用原线性表空间,并且用顺序表和单链表两种方法表示,分别用两个程序来完成。
数据结构上机实习报告
上机实习报告班号:116112姓名:**学号:***********实习报告【实习一】线性表及其应用n(n>20)的阶乘【问题描述】大数运算——计算n的阶乘(n>=20)。
【基本要求】(1)数据的表示和存储:(1.1)累积运算的中间结果和最终的计算结果的数据类型要求是整型——这是问题本身的要求;(1.2)试设计合适的存储结构,要求每个元素或结点最多存储数据的3位数值。
(2)数据的操作及其实现:基于设计的存储结构实现乘法操作,要求从键盘上输入n值,在屏幕上显示最终计算结果。
【问题分析】(1)设计数据的存储结构:介于乘运算的精确性以及实型数据表示的不精确性,本题不能采用实型表示累积运算的中间结果和最终的计算结果,而只能用整型。
然而由于普通整型和长整型所能表述数的范围受其字长的限制,不能表示大数阶乘的累积结果,故必须设计一个合适的数据结构实现对数据的存储,例如可以让每个元素或结点存储数据的若干位数值。
从问题描述不难看出n值为任意值,故为使程序尽量不受限制,应采用动态存储结构。
累积运算的特点是当前的计算结果是下次乘法运算的乘数。
实现两个数的乘法运算须考虑:(1)乘数的各位数都要与被乘数进行乘法运算;(2)乘法过程中的进位问题及其实现;(3)因每个元素或结点最多存储数据的3位数值,故当元素或结点中的数值大于999,需向前一个元素或结点进位。
综合以上几点,我采用了单链表的储存结构形式。
(2)阶乘算法的实现:1. 链表型数据乘法的具体实现描述:(1)初始算法顺序访问对每个节点上的数据乘以要乘的数后在顺序访问查看是否需要进位,大于999则向前进位,如果前面没有节点则添加新节点储存进位的数(2)改进算法将原始算法的乘操作和进位操作合在一起进行,提高程序效率.2. 数据输出算法具体实现描述从高位向低位顺序输出节点上储存的数据,注意补零,最高位的节点不补,其它节点要补。
对于最后的结果,因为我采用的是普通的单链表算法,因此我添加了一个逆置的算法。
数据结构上机实验报告
数据结构上机实验报告数据结构上机实验报告1. 实验目的数据结构是计算机科学中非常重要的一门课程,通过本次上机实验,旨在帮助学生巩固和应用所学的数据结构知识,培养学生分析和解决实际问题的能力。
2. 实验背景本次实验涉及到两个常用的数据结构:栈和队列。
栈是一种后进先出(Last In First Out,LIFO)的数据结构,而队列是一种先进先出(First In First Out,FIFO)的数据结构。
通过实验,我们将学习如何使用这两种数据结构来解决实际问题。
3. 实验内容本次实验分为两个部分:栈的应用和队列的应用。
3.1 栈的应用在栈的应用部分,我们将实现一个简单的括号匹配算法。
该算法可以判断一个字符串中的括号是否匹配。
具体实现步骤如下:3.1.1 创建一个栈来存储括号字符;3.1.2 遍历字符串中的每个字符;3.1.3 如果遇到左括号,则将其入栈;3.1.4 如果遇到右括号,则判断栈顶元素是否是对应的左括号;3.1.5 如果栈为空或栈顶元素不是对应的左括号,则括号不匹配;3.1.6 如果栈顶元素是对应的左括号,则将其出栈;3.1.7 遍历完字符串后,如果栈为空,则括号匹配,否则括号不匹配。
通过实现这个算法,我们可以学习到如何使用栈来解决实际问题,并且理解栈的后进先出的特性。
3.2 队列的应用在队列的应用部分,我们将实现一个简单的任务调度算法。
该算法可以模拟多个任务按照一定的优先级进行调度的过程。
具体实现步骤如下:3.2.1 创建一个队列来存储任务;3.2.2 每个任务包含两个属性:任务名称和优先级;3.2.3 向队列中添加任务,并按照优先级进行排序;3.2.4 从队列中取出优先级最高的任务,并执行;3.2.5 执行完任务后,继续从队列中取出下一个优先级最高的任务,并执行,直到队列为空。
通过实现这个算法,我们可以学习到如何使用队列来实现任务调度,并且理解队列的先进先出的特性。
4. 实验结果与分析通过实验,我们成功实现了括号匹配算法和任务调度算法,并得到了正确的结果。
数据结构上机实验报告
实验名称:数据结构实验实验时间:2021年X月X日实验地点:计算机实验室实验目的:1. 理解并掌握基本数据结构(线性表、栈、队列、链表、树、图)的概念和操作。
2. 能够运用C语言实现基本数据结构的各种操作。
3. 培养编程能力和问题解决能力。
实验内容:1. 线性表2. 栈3. 队列4. 链表5. 树6. 图实验环境:1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 2019实验步骤:一、线性表1. 实现线性表的创建、插入、删除、查找和遍历等基本操作。
2. 编写代码,实现以下功能:- 创建一个线性表,包含10个元素。
- 在第3个位置插入一个新元素。
- 删除第5个位置的元素。
- 查找线性表中的第7个元素。
- 遍历线性表,并打印所有元素。
二、栈1. 实现栈的创建、入栈、出栈、判空和求栈顶元素等基本操作。
2. 编写代码,实现以下功能:- 创建一个栈。
- 向栈中依次入栈元素1、2、3、4、5。
- 判断栈是否为空。
- 求栈顶元素。
- 出栈元素,并打印出栈的元素。
三、队列1. 实现队列的创建、入队、出队、判空和求队头元素等基本操作。
2. 编写代码,实现以下功能:- 创建一个队列。
- 向队列中依次入队元素1、2、3、4、5。
- 判断队列是否为空。
- 求队头元素。
- 出队元素,并打印出队的元素。
四、链表1. 实现单链表、双向链表和循环链表的创建、插入、删除、查找和遍历等基本操作。
2. 编写代码,实现以下功能:- 创建一个单链表,包含元素1、2、3、4、5。
- 在第2个位置插入一个新元素。
- 删除第3个位置的元素。
- 查找链表中的第4个元素。
- 遍历链表,并打印所有元素。
五、树1. 实现二叉树的创建、插入、删除、查找和遍历等基本操作。
2. 编写代码,实现以下功能:- 创建一个二叉树,包含元素1、2、3、4、5。
- 在第2个位置插入一个新元素。
- 删除第3个位置的元素。
数据结构上机实验报告
数据结构上机实验报告一、实验目的本次数据结构上机实验的主要目的是通过实际编程操作,深入理解和掌握常见的数据结构及其基本操作,提高解决实际问题的能力和编程技能。
具体目标包括:1、熟练掌握线性表、栈、队列、树、图等数据结构的基本概念和存储方式。
2、学会运用数据结构的相关算法进行数据的插入、删除、查找、排序等操作。
3、培养分析问题、设计算法、编写代码和调试程序的综合能力。
4、增强对数据结构在实际应用中的认识,提高解决复杂问题的思维能力。
二、实验环境1、操作系统:Windows 102、编程环境:Visual Studio 20193、编程语言:C++三、实验内容本次实验共包括以下几个部分:1、线性表的操作实现顺序表和链表的创建、插入、删除、查找和遍历操作。
比较顺序表和链表在不同操作下的性能差异。
2、栈和队列的应用利用栈实现表达式求值。
用队列模拟银行排队系统。
3、树的遍历实现二叉树的先序、中序和后序遍历算法,并输出遍历结果。
构建哈夫曼树,并进行编码和解码操作。
4、图的基本操作用邻接矩阵和邻接表存储图,并实现图的深度优先搜索和广度优先搜索算法。
四、实验步骤及结果1、线性表的操作顺序表的实现:```cppinclude <iostream>using namespace std;define MAXSIZE 100 //顺序表的最大长度class SeqList {private:int dataMAXSIZE; //存储顺序表元素的数组int length; //顺序表的当前长度public:SeqList(){//构造函数,初始化顺序表length = 0;}//插入元素bool insert(int pos, int element) {if (pos < 0 || pos > length || length == MAXSIZE) {return false;}for (int i = length; i > pos; i) {datai = datai 1;}datapos = element;length++;return true;}//删除元素bool remove(int pos) {if (pos < 0 || pos >= length) {return false;}for (int i = pos; i < length 1; i++){datai = datai + 1;}length;return true;}//查找元素int search(int element) {for (int i = 0; i < length; i++){if (datai == element) {return i;}}return -1;}//遍历输出顺序表void traverse(){for (int i = 0; i < length; i++){cout << datai <<"";}cout << endl;}};int main(){SeqList list;listinsert(0, 10);listinsert(1, 20);listinsert(2, 30);listtraverse();listremove(1);listtraverse();int position = listsearch(30);if (position!=-1) {cout <<"元素 30 在位置"<< position << endl;} else {cout <<"未找到元素 30" << endl;}return 0;}```链表的实现:```cppinclude <iostream>using namespace std;class Node {public:int data;Node next;Node(int element) {data = element;next = NULL;}};class LinkedList {private:Node head;public:LinkedList(){head = NULL;}//插入元素void insert(int element) {Node newNode = new Node(element);if (head == NULL) {head = newNode;} else {Node current = head;while (current>next!= NULL) {current = current>next;}current>next = newNode;}}//删除元素void remove(int element) {if (head == NULL) {return;}if (head>data == element) {Node temp = head;head = head>next;delete temp;return;}Node current = head;Node prev = NULL;while (current!= NULL && current>data!= element) {prev = current;current = current>next;}if (current!= NULL) {prev>next = current>next;delete current;}}//查找元素bool search(int element) {Node current = head;while (current!= NULL) {if (current>data == element) {return true;}current = current>next;}return false;}//遍历输出链表void traverse(){Node current = head;while (current!= NULL) {cout << current>data <<"";current = current>next;}cout << endl;}};int main(){LinkedList list;listinsert(10);listinsert(20);listinsert(30);listtraverse();listremove(20);listtraverse();if (listsearch(30)){cout <<"找到元素 30" << endl;} else {cout <<"未找到元素 30" << endl;}return 0;}```性能比较:在插入和删除操作中,顺序表在表头或中间位置操作时需要移动大量元素,时间复杂度较高;而链表只需要修改指针,时间复杂度较低。
数据结构上机实验报告
{ while (i<S.size() && j<P.size())//当找到或者找到头时循环结束 { if (S[i] == P[j]) { i++; j++;} else{ i = i - j + 1; j = 0; }//失配时从下一位继续找 } if (j == P.size()){//找到就输出这一行 cout << "第" << linenumb << "行" << S << endl; }
}
3. 主程序的伪码 :
void main(){ cout << "请输入文件名" << endl; cin >> filename;
ifstream infile(filename.c_str()); cout << "请输入待查找的字符串" << endl; cin >> P; while (getline(infile, S))//读完所有行结束 {
linenumb++; Find(S, P, linenumb); } infile.close(); } int Find(string S, string P, int linenumb) { int i = 0, j = 0; while (i<S.size() && j<P.size())//当找到或者找到头时循环结束 { if (S[i] == P[j]) {
东北大学汇编上机实验3
实验三顺序结构程序设计实验一、实验目的1.掌握顺序结构程序的基本设计方法;2.掌握数据传送指令和算术运算指令的用法;3.掌握逻辑操作指令和移位操作指令的用法;4.掌握状态标志位操作指令的用法;5.掌握简单的I/O功能调用。
二、实验要求1.熟练掌握DEBUG中的各命令的使用方法;2.学会利用系统功能调用,来实现键盘输入字符、显示字符的方法;3.学会十进制数字与其对应的ASCII码相互转换的方法;4.学会十六进制数字与其对应的ASCII码相互转换的方法;5.学会利用查表的方法实现代码的转换。
三、实验内容1.编写十六进制数的乘法程序。
要求从键盘上输入两个一位十六进制数据,乘积存入SUM单元。
2.编写程序,求表达式5X+Y的值,要求:X、Y值从键盘输入,X、Y均为一位十六进制数据,将计算结果存入SUM单元。
四、解题思路利用INT 21H的1号功能可以从键盘上输入数据, 通过通用寄存器保存中间结果,完成各项计算功能。
将结果的ASCII码保存在内存单元和DL寄存器中,然后利用INT 21H的2号功能将其输出到屏幕上。
输出到屏幕上一次只能显示4位二进制数,所以一个字节需要分两次才能显示出来。
五、编程实现5.1 内容1DSEG SEGMENTHTAB DB '0123456789ABCDEF'SUM DW 0,0DSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEGSTART: MOV AX,DSEG ;初始化DS寄存器MOV DS,AXMOV AH,01H ;从键盘上输入一个数X(默认放入AL)INT 21HSUB AL,30H ;输入的数据ASIIC码翻译成十六进制MOV BL,AL ;X放入到BL中MOV DL,'*' ;规定要显示的符号必须在DL中MOV AH,02H ;显示’*’INT 21HMOV AH,01H ;从键盘输入第二个数Y(默认放入AL)INT 21HSUB AL,30H ;输入的数据ASIIC码翻译成十六进制MUL BL ;AL*BLMOV SUM,AX ;保存数据到SUM中MOV CH,AL ;利用CH和DH存放MOV DH,ALMOV DL,'=' ;规定要显示的符号必须在DL中MOV AH,02H ;显示‘=’INT 21HMOV CL,4SHR DH,CL ;DH中保存了之前AL中的高四位MOV AL,DH ;查表规定数据必须在AL中LEA BX,HTAB ;利用查表方法显示XLATMOV DL,AL ;显示AL中的高四位MOV AH,02HINT 21HAND CH,0FH ;CH中保存了之前AL中的低四位MOV AL,CH ;查表规定数据必须在AL中XLAT ;查表方法显示MOV DL,ALMOV AH,02HINT 21HMOV AH,4CHINT 21HCSEG ENDSEND START运行结果如下如图3-1图3-15.2 内容2DSEG SEGMENTHTAB DB '0123456789ABCDEF'SUM DW 0,0DSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEGSTART: MOV AX,DSEGMOV DS,AXMOV AH,01H ;从键盘上输入X,默认保存到AL中INT 21HSUB AL,30HMOV BL,5 ;BL中保存数据5MUL BL ;X*5默认保存到AX中MOV CX,AX ;X*5保存在CX中MOV DL,'*' ;屏幕上显示'*'前规定需要保存到DL中MOV AH,02H ;显示’*’INT 21HMOV AL,05H ;利用查表法输出5,之前必须放入到AL中LEA BX,HTAB ;查表获取地址XLAT ;查表转换MOV DL,AL ;屏幕显示数据5之前规定需要放到DL中MOV AH,02H ;显示5INT 21HMOV DL,'+' ;屏幕显示’+’之前规定需要放到DL中MOV AH,02H ;屏幕显示’+’INT 21HMOV AH,01H ;从键盘上输入数据YINT 21HSUB AL,30HMOV BL,AL ;Y保存到BL寄存器中MOV BH,00HADC CX,BX ;实现5X+YMOV SUM,CX ;保存结果MOV DL,'=' ;屏幕显示‘=’之前规定需放入到DL寄存器中MOV AH,02H ;显示’=’INT 21HMOV BH,CL ;保存CL,因为下面指令SHR需用到CL寄存器MOV CH,CL ;保存CL,因为下面指令SHR需用到CL寄存器MOV CL,4SHR BH,CL ;右移4位,即为原来结果的高4位MOV AL,BH ;放到AL中,便于查表转换后显示出来LEA BX,HTAB ;查表XLATMOV DL,AL ;显示结果的高4位MOV AH,02HINT 21HAND CH,0FH ;原来结果低4位处理MOV AL,CH ;查表转换XLATMOV DL,AL ;显示结果低4位MOV AH,02HINT 21HMOV AH,4CHINT 21HCSEG ENDSEND START运行结果如图3-2图3-2六、实验总结6.1 心得体会6.2 遇到的问题实验过程中遇到的问题很多,我就挑典型的几个错误分享一下。
数据结构上机实验报告3
一.实验目的魔王语言可以按以下三条规则翻译成人听懂得话:(1)(θδ1δ2…δn)→θδnθδn-1…θδ1θ(2)B->tAdA(3)A->sae要求设计者设计一个魔王语言解释程序二.实验内容有一个魔王总是使用自己的一种非常精炼而抽象的语言讲话,没有人能听懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的,设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。
魔王语言可含人的词汇。
三.实验步骤(可选)详细设计代码:#include <iostream>#include<string.h>#include<stdlib.h>#define FALSE 0#define TRUE 1#define size 300using namespace std;typedef struct{char elem[size];int top;}Stack,Queue;void InitStack(Stack *S ){S->top=-1;}int Push(Stack *S, char x){if(S->top==size-1) return 0;S->top++;S->elem[S->top]=x;return 1;}void Translation2(char e){switch(e){case'B':cout<<"天上一只鹅地上一只鹅" ;break;case'A':cout<<"上一只鹅" ;break;case't':cout<<"天";case's':cout<<"上";break;case'a':cout<<"一只";break;case'e':cout<<"鹅";break;case'h':cout<<"恨";break;case'n':cout<<"蛋";break;case'x':cout<<"下";break;case'g':cout<<"赶";break;case'z':cout<<"追";break;case'd':cout<<"地";break;}}void Translation1(Stack *S ){cout<<"魔王语言解释成人能听懂的语言:"; char e;while(S->top!=-1){e=S->elem[S->top];S->top--;Translation2(e);}}void main (){Stack S;InitStack(&S );cout<<"魔王请说话:\n";char str[100];while (scanf("%s",str)!=EOF){int flag=0,j,m=0,n=0;for(j=strlen(str)-1;j>=0;j--){if(str[j]==')'){flag++;n=j;if(str[j]=='('){flag++;m=j;}}if(flag==0){for(j=strlen(str)-1;j>=0;j--){Push(&S, str[j]);}Translation1(&S);cout<<"\n";}if(flag==2){for(j=strlen(str)-1;j>n;j--){Push(&S,str[j]);}Push(&S,str[m+1]);for(j=m+2;j<n;j++){Push(&S,str[j]);Push(&S,str[m+1]);}for(j=m-1;j>=0;j--){Push(&S,str[j]);}Translation1(&S);cout<<"\n";}if(flag>2||flag==1){cout<<"input wrong\n";}}}四.实验的结果及分析。
数据结构上机实验报告
数据结构上机实验报告1. 实验目的本次实验旨在通过编写程序,掌握和理解常见的数据结构及其应用。
2. 实验环境与工具- 操作系统:Windows 10- 开发语言:C++- 集成开发环境(IDE):Visual Studio Code3. 实验内容及步骤3.1 线性表操作演示程序设计与分析步骤:a) 设计一个线性表类,并包含以下基本功能:i) 初始化线性表;ii) 插入元素到指定位置;iii) 删除指定位置的元素;iv) 获取指定位置处的元素值。
b)使用该线性表类进行一系列测试,验证各个功能是否正常运行。
记录并分析每个函数调用所消耗时间以评估算法效率。
3.2 栈和队列综合应用设计与模拟步骤:a)根据给出问题需求,在已有栈、队列等相关代码基础上完成如下任务:i)利用两个堆栈来模拟浏览器前进后退功能;ii)使用循环链式存储结构表示双向链队, 并对其进行初始化、入队、出队等操作。
b). 运行以上代码片段,并输出相应结果。
同时分析算法的时间复杂度和空间复杂度。
4. 实验结果与讨论a) 线性表操作演示程序设计与分析实验结果:- 初始化线性表所需时间为X秒;- 插入元素到指定位置平均耗时Y毫秒;- 删除指定位置的元素平均耗时Z毫秒。
b)栈和队列综合应用设计与模拟实验结果:i) 浏览器前进后退功能测试:共浏览N个网页,前进M 次、后退K次。
运行总体消耗时间T1;ii) 双向链队初始化、入队、出对等操作测试: 共进行P 组数据处理, 运行总体消耗时间T2.5. 结论通过本次上机实验,我们掌握了线性表及其相关基本操作,并且成功完成了栈和队列在特定场景下的应用。
同时,在代码编写过程中也深刻理解并评估了各种算法效率。
6. 致谢感谢老师们给予我宝贵意见以及同学们之间相互交流合作提供支持。
7. 附件8. 法律名词及注释在此处添加涉及到的法律名词或术语,并提供简要注释。
东北大学数据结构上机实验报告
实验一线性表应用一、实验目的对图书馆的图书信息管理作一个简单的模拟。
二、实验要求设计图书信息管理的模拟程序。
1)采用顺序表登录图书成绩。
2)可以登记、查询、插入、删除图书成绩。
3)将图书信息按类别存储到链表中。
输入形式图书信息输出形式图书信息程序功能登记、查询、插入、删除图书成绩三、设计概要流程图抽象数据类型的定义图书类型typedef struct {int num; //书号char name[20]; //书名char author[20]; //作者char press[20]; //出版社名称int count; //存馆数量char price[10]; //定价} ElemType;单链表结点类型typedef struct LNode{ElemType data;struct LNode *next;} LinkList;各程序模块之间的调用关系四、详细设计初始化创建头结点实现线性表的初始化L = (LinkList *) malloc(sizeof(LinkList));L->next = NULL;用户界面运用printf函数录入int i, n;LinkList *s, *q, *p; //创建单链表p = L;while (p->next != NULL )p = p->next;printf("请输入需要录入的图书信息的个数:n=");scanf("%d", &n);for (i = 1; i < n + 1; i++) { //创建图书信息s = (LinkList *) malloc(sizeof(LinkList));printf("书号书名作者出版社名称存馆数量定价\n");scanf("%d%s%s%s%d%s", &s->data.num, s->, s->data.author,s->data.press, &s->data.count, s->data.price);q = L->next;if (q == NULL ) { //下一个节点为空即此节点为尾节点p->next = s;p = s;p->next = NULL;printf("录入成功!\n");continue;}while (q != NULL ) {if (strcmp(s->, q->) == 0) {printf("此图书已存在!");printf("请重新输入:\n");scanf("%d%s%s%s%d%s", &p->data.num, p->,p->data.author, p->data.press, &p->data.count,p->data.price);}q = q->next;}p->next = s;p = s;p->next = NULL;printf("录入成功!\n");Sleep(1000);}system("cls");menu();return 0;查询LinkList *p = L->next; //p指向第一个数据结点int c;int x = 0;char name1[10], author1[10], press1[10];printf(" 1 按书名查询:\n");printf(" 2 按作者名查询:\n");printf(" 3 按出版社名称:\n");printf(" 4 返回\n");printf(" 请选择1--4进行操作:\n");scanf("%d", &c);if (c > 4 || c < 1) {printf("您的输入有误!\n");scanf("%d", &c);}switch (c) {case 1:printf("请输入图书书名: \n");scanf("%s", name1);while (p != NULL ) {if (strcmp(name1, p->) != 0) //查找图书书名p = p->next;else {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d\t%s\t%s\t%s\t%d\t%s", p->data.num, p->,p->data.author, p->data.press, p->data.count,p->data.price);printf("\n");p = p->next;x++;Sleep(2000);system("cls");menu();}}if (p == NULL && x == 0)printf("对不起,不存在此图书!\n");break;case 2:printf("请输入图书作者:\n");scanf("%s", author1);while (p != NULL ) {if (strcmp(author1, p->data.author) != 0) //查找图书作者p = p->next;else {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d\t%s\t%s\t%s\t%d\t%s", p->data.num, p->,p->data.author, p->data.press, p->data.count,p->data.price);printf("\n");p = p->next;x++;Sleep(2000);system("cls");menu();}}if (p == NULL && x == 0)printf("对不起,不存在此图书!\n");break;case 3:printf("请输入图书的出版社名称: \n");scanf("%s", press1);while (p != NULL ) {if (strcmp(press1, p->data.press) != 0) //查找图书出版社名称p = p->next;else {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d %s %s %s %d %s",p->data.num, p->, p->data.author,p->data.press, p->data.count, p->data.price);printf("\n");p = p->next;x++;Sleep(2000);system("cls");menu();}}if (p == NULL && x == 0)printf("对不起!不存在此图书\n");break;case 4:break;}五、调试分析所遇问题的解决方法及分析当我编写录入函数时,对如何将数据储存到链表中无从下手。
数据结构实验报告三
数据结构实验报告三数据结构实验报告三引言:数据结构作为计算机科学的重要基础,对于计算机程序的设计和性能优化起着至关重要的作用。
在本次实验中,我们将深入研究和实践数据结构的应用,通过实验来验证和巩固我们在课堂上所学到的知识。
一、实验目的本次实验的主要目的是通过实践操作,进一步掌握和理解数据结构的基本概念和操作。
具体来说,我们将学习并实现以下几个数据结构:栈、队列、链表和二叉树。
通过对这些数据结构的实现和应用,我们将更好地理解它们的特点和优势,并能够灵活运用于实际问题的解决中。
二、实验内容1. 栈的实现与应用栈是一种后进先出(LIFO)的数据结构,我们将学习如何使用数组和链表两种方式来实现栈,并通过实例来演示栈的应用场景,如括号匹配、表达式求值等。
2. 队列的实现与应用队列是一种先进先出(FIFO)的数据结构,我们将学习如何使用数组和链表两种方式来实现队列,并通过实例来演示队列的应用场景,如任务调度、消息传递等。
3. 链表的实现与应用链表是一种动态数据结构,相比数组具有更好的灵活性和扩展性。
我们将学习如何使用指针来实现链表,并通过实例来演示链表的应用场景,如链表的插入、删除、反转等操作。
4. 二叉树的实现与应用二叉树是一种常见的树形结构,我们将学习如何使用指针来实现二叉树,并通过实例来演示二叉树的应用场景,如二叉树的遍历、搜索等操作。
三、实验过程1. 栈的实现与应用我们首先使用数组来实现栈,并编写相关的入栈、出栈、判空、获取栈顶元素等操作。
然后,我们通过括号匹配和表达式求值两个实例来验证栈的正确性和应用性。
2. 队列的实现与应用我们使用数组来实现队列,并编写相关的入队、出队、判空、获取队头元素等操作。
然后,我们通过任务调度和消息传递两个实例来验证队列的正确性和应用性。
3. 链表的实现与应用我们使用指针来实现链表,并编写相关的插入、删除、反转等操作。
然后,我们通过链表的插入和删除操作来验证链表的正确性和应用性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三树和图应用一、实验目的光纤管道铺设施工问题问题描述设计校园内有N个教学楼及办公楼,要铺设校园光纤网,如何设计施工方案使得工程总的造价为最省。
二、实验要求设计校园光纤网铺设的最小生成树模拟程序。
1)采用邻接表或邻接矩阵存储结构。
2)分别采用普利姆算法和克鲁斯卡尔算法实现。
输入形式对应的教学楼、办公楼数目n,各边权值即每栋楼之间的距离输出形式最小生成树,即总路程最小的路程序功能设计校园光纤网铺设的最小生成树模拟程序三、设计概要流程图抽象数据类型的定义class prims{private:int n; //节点的个数int graph_edge[99][4]; //图的边int g; //图中边的个数int tree_edge[99][4]; //树的边int t; //树的边的个数int s; //源节点int T1[50],t1; // 第一部分int T2[50],t2; //第二部分public:void input();int findset(int);void algorithm();void output();};各程序模块之间的调用关系四、详细设计定义prims类private中进行对图的创建public:void input();int findset(int);void algorithm();void output();开始界面实现prims类中图的初始化分别输入图中的顶点个数、图的边及其权值算法构造t=0;//初始化边的个数为0t1=1;T1[1]=1; //资源节点t2=n-1;int i;for(i=1;i<=n-1;i++)T2[i]=i+1;cout<<"\n\n*****运算开始*****\n\n\n";while(g!=0 && t!=n-1){int min=99;int p;int u,v,w;for(i=1;i<=g;i++){if(findset(graph_edge[i][1])!=findset(graph_edge[i][2])) //如果u和v在不同的部分{if(min>graph_edge[i][3]){min=graph_edge[i][3];u=graph_edge[i][1];v=graph_edge[i][2];w=graph_edge[i][3];p=i;}}}for(int l=p;l<g;l++){graph_edge[l][1]=graph_edge[l+1][1];graph_edge[l][2]=graph_edge[l+1][2];graph_edge[l][3]=graph_edge[l+1][3];}t++;tree_edge[t][1]=u;tree_edge[t][2]=v;tree_edge[t][3]=w;}运算结果的输出cout<<"挑选出的边及其对应的权值::\n";for(int i=1;i<=t;i++)cout<<"<"<<tree_edge[i][1]<<","<<tree_edge[i][2]<<"> ::"<<tree_edge[i][3]<<endl;五、调试分析所遇问题的解决方法及分析开始时,我并不知道应该要怎样建立图和最小生成树之间的关系,而这个问题如若无法解决,那么普利姆算法就无从提起了。
因此,在查阅了资料后,我将图和最小生成树放在一个类中,这样,通过函数操作就会容易很多。
算法的时空分析及改进设想O(n^2)经验和体会通过此次程序的编译过程,我更深刻的了解到有一个清晰的思路对于编程的重要性。
在编程之前需要经过充分的构思,就像写作先列提纲一样,只有拥有一个清晰的思路,编程序时才能一气呵成,否则只能是编到哪里是哪里,很容易卡壳,耽误时间是一方面,而且会使编出的程序没有连贯性。
六、使用说明1、输入图的边数2、输入各边的权值3、程序打印出图中顶点可建立的关系网4、程序开始运算5、程序打印出最小生成树及其各边的权值七、测试结果(截屏)八、附录#include<iostream>using namespace std;class prims{private:int n; //节点的个数int graph_edge[99][4]; //图的边int g; //图中边的个数int tree_edge[99][4]; //树的边int t; //树的边的个数int s; //源节点//把图分成两个部分int T1[50],t1; // 第一部分int T2[50],t2; //第二部分public:void input();int findset(int);void algorithm();void output();};void prims::input(){cout<<"***********************************\n"<<endl;cout<<"************欢迎使用****************"<<endl;cout<<"********普里姆算法运算*********\n";cout<<"****************************************\n";cout<<"输入顶点的个数::";cin>>n;g=0;//图中边的个数初始值为0cout<<"输入边的权值::\n";for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){cout<<"<"<<i<<" , "<<j<<"> ::";int w;cin>>w;if(w!=0){g++;graph_edge[g][1]=i;//定义图的顶点igraph_edge[g][2]=j;//定义图的顶点jgraph_edge[g][3]=w;//定义边的权值w}}}//输出图的边cout<<"\n\n图中顶点可以建立的关系网::\n";for(int i=1;i<=g;i++)cout<<"<"<<graph_edge[i][1]<<" , "<<graph_edge[i][2]<<">"<<endl; }int prims::findset(int x)for(int i=1;i<=t1;i++)if(x==T1[i])return 1;for(int i=1;i<t2;i++)if(x==T2[i])return 2;return -1;}void prims::algorithm()//构造算法{t=0;//初始化边的个数为0t1=1;T1[1]=1; //资源节点t2=n-1;int i;for(i=1;i<=n-1;i++)T2[i]=i+1;cout<<"\n\n*****运算开始*****\n\n\n";while(g!=0 && t!=n-1){// 找出最短路径int min=99;int p;int u,v,w;for(i=1;i<=g;i++){if(findset(graph_edge[i][1])!=findset(graph_edge[i][2]))//如果u和v在不同的部分{if(min>graph_edge[i][3]){min=graph_edge[i][3];u=graph_edge[i][1];v=graph_edge[i][2];w=graph_edge[i][3];p=i;}}//删除图的边for(int l=p;l<g;l++){graph_edge[l][1]=graph_edge[l+1][1];graph_edge[l][2]=graph_edge[l+1][2];graph_edge[l][3]=graph_edge[l+1][3];}//增加树的边t++;tree_edge[t][1]=u;tree_edge[t][2]=v;tree_edge[t][3]=w;}}void prims::output(){cout<<"挑选出的边及其对应的权值::\n";for(int i=1;i<=t;i++)cout<<"<"<<tree_edge[i][1]<<","<<tree_edge[i][2]<<"> ::"<<tree_edge[i][3]<<endl; }int main(){prims obj;obj.input();obj.algorithm();obj.output();return 0;}。