东北大学数据结构上机实验报告3

合集下载

数据结构上机实验报告

数据结构上机实验报告
{if(i%2==0) insert(lb,i/2,la.list[i]); //奇数位次元诩插入lb
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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;}。

相关文档
最新文档