第三次数据结构课程实验

合集下载

哈尔滨理工大学数据结构第3次实践课内容

哈尔滨理工大学数据结构第3次实践课内容

必做●SubString (&Sub, S, pos, len)求子串●Index (S, T, pos)字符串查找#include <stdio.h>#include <stdlib.h>#define INTERLENGTH 100#define INCREASE 10#define OK 1#define ERROR -1#define overflow -2typedef struct{char *data;int length;int size;}Sqlist;int cj(Sqlist &L){L.data=(char *)malloc(INTERLENGTH*sizeof(char));if(L.data==NULL)exit(overflow);L.length=0;L.size=INTERLENGTH;return OK;}int AgainMalloc(Sqlist &L){char *newbase;newbase=(char *)realloc(L.data,(INCREASE+L.size)*sizeof(char)); if(newbase==NULL)exit(overflow);L.data=newbase;L.size+=INCREASE;return OK;}int insert(Sqlist &L,char a){if(L.length==L.size){AgainMalloc(L);}L.data[L.length]=a;L.length++;return OK;int travel(Sqlist &L){for(int i=0;i<L.length;i++)printf("%c",L.data[i]);printf("\n");return OK;}int clear(Sqlist &L){L.length=0;return OK;}int SubString(Sqlist &L,int pos,int len,Sqlist &sub) {if(pos<1||pos>L.length||len<0||len>L.length-pos+1) {printf("²»ºÏ·¨ ");exit(overflow);}cj(sub);clear(sub);int i;for(i=pos-1;i<pos+len-1;i++){insert(sub,L.data[i]);}return OK;}int index(Sqlist &L,Sqlist &sub){int i=0;int j=0;while(i<L.length&&j<sub.length){if(L.data[i]==sub.data[j]){i++;j++;}else{i=i-j+1;j=0;}}if(j>=sub.length)return i-sub.length+1;elsereturn ERROR;}int main(){Sqlist L,sub;cj(L);char c;printf("请输入字符串:\n");while((c=getchar())!='\n'){insert(L,c);}printf("求得从2位置开始4位自串如下:\n"); SubString(L,2,4,sub);travel(sub);clear(sub);printf("请输入待查找字符串;\n");while((c=getchar())!='\n'){insert(sub,c);}int a= index(L,sub);printf("%d",a);}。

数据结构实验报告三

数据结构实验报告三

数据结构实验报告三数据结构实验报告三引言:数据结构是计算机科学中的重要内容之一,它研究的是如何组织和存储数据以便高效地访问和操作。

本实验报告将介绍我在数据结构实验三中的实验过程和结果。

实验目的:本次实验的主要目的是熟悉并掌握树这种数据结构的基本概念和操作方法,包括二叉树、二叉搜索树和平衡二叉树等。

实验内容:1. 实现二叉树的创建和遍历在本次实验中,我首先实现了二叉树的创建和遍历。

通过递归的方式,我能够方便地创建一个二叉树,并且可以使用前序、中序和后序遍历方法对二叉树进行遍历。

这些遍历方法的实现过程相对简单,但能够帮助我们更好地理解树这种数据结构的特点。

2. 实现二叉搜索树的插入和查找接下来,我实现了二叉搜索树的插入和查找操作。

二叉搜索树是一种特殊的二叉树,它的左子树上的节点的值都小于根节点的值,右子树上的节点的值都大于根节点的值。

通过这种特性,我们可以很方便地进行插入和查找操作。

在实现过程中,我使用了递归的方法,通过比较节点的值来确定插入的位置或者进行查找操作。

3. 实现平衡二叉树的插入和查找平衡二叉树是为了解决二叉搜索树在某些情况下可能会退化成链表的问题而提出的。

它通过在插入节点的过程中对树进行旋转操作来保持树的平衡。

在本次实验中,我实现了平衡二叉树的插入和查找操作。

通过对树进行左旋、右旋等操作,我能够保持树的平衡,并且能够在O(log n)的时间复杂度内进行插入和查找操作。

实验结果:通过本次实验,我成功地实现了二叉树、二叉搜索树和平衡二叉树的相关操作。

我编写了测试代码,并对代码进行了测试,结果表明我的实现是正确的。

我能够正确地创建二叉树,并且能够使用前序、中序和后序遍历方法进行遍历。

对于二叉搜索树和平衡二叉树,我能够正确地进行插入和查找操作,并且能够保持树的平衡。

实验总结:通过本次实验,我深入了解了树这种数据结构的特点和操作方法。

二叉树、二叉搜索树和平衡二叉树是树的重要应用,它们在实际开发中有着广泛的应用。

数据结构实验-第3次试验-图的应用

数据结构实验-第3次试验-图的应用
第三次实验 图的应用
[问题描述] 给定一个图,设计一个程序,找出一条从某一顶点A到另一顶点B边数最少的一条路径。 [输入] 图的顶点个数N,图中顶点之间的边的关系及要找的路径的起点A和终点B。 [输出] 若A到B无路径,则输出“There is no path”,否则输出A到B路径上各顶点。 [存储结构] 图采用邻接矩阵或邻接表的方式存储。
实现时采用队列记录被访问过的顶点。每次访问与队头顶点
相邻接的顶点,然后将队头顶点从队列中删去。若队空,则说明到
不存在通路。在访问顶点过程中,每次把当前顶点的序号作为与其 邻接的未访问的顶点的前驱顶点记录下来,以便输出时回溯。
Байду номын сангаас
[算法的基本思想] 采用广度优先搜索的方法,从顶点A开始,依次访问与A邻接的顶 点VA1,VA2,...,VAK, 访问遍之后,若没有访问B,则继续访问与VA1邻 接的顶点VA11,VA12,...,VA1M,再访问与VA2邻接顶点...,如此下去 ,直至找到B,最先到达B点的路径,一定是边数最少的路径。

数据结构实验三实验报告

数据结构实验三实验报告

数据结构实验三实验报告数据结构实验三实验报告一、实验目的本次实验的目的是通过实践掌握树的基本操作和应用。

具体来说,我们需要实现一个树的数据结构,并对其进行插入、删除、查找等操作,同时还需要实现树的遍历算法,包括先序、中序和后序遍历。

二、实验原理树是一种非线性的数据结构,由结点和边组成。

树的每个结点都可以有多个子结点,但是每个结点只有一个父结点,除了根结点外。

树的基本操作包括插入、删除和查找。

在本次实验中,我们采用二叉树作为实现树的数据结构。

二叉树是一种特殊的树,每个结点最多只有两个子结点。

根据二叉树的特点,我们可以使用递归的方式实现树的插入、删除和查找操作。

三、实验过程1. 实现树的数据结构首先,我们需要定义树的结点类,包括结点值、左子结点和右子结点。

然后,我们可以定义树的类,包括根结点和相应的操作方法,如插入、删除和查找。

2. 实现插入操作插入操作是将一个新的结点添加到树中的过程。

我们可以通过递归的方式实现插入操作。

具体来说,如果要插入的值小于当前结点的值,则将其插入到左子树中;如果要插入的值大于当前结点的值,则将其插入到右子树中。

如果当前结点为空,则将新的结点作为当前结点。

3. 实现删除操作删除操作是将指定的结点从树中移除的过程。

我们同样可以通过递归的方式实现删除操作。

具体来说,如果要删除的值小于当前结点的值,则在左子树中继续查找;如果要删除的值大于当前结点的值,则在右子树中继续查找。

如果要删除的值等于当前结点的值,则有三种情况:- 当前结点没有子结点:直接将当前结点置为空。

- 当前结点只有一个子结点:将当前结点的子结点替代当前结点。

- 当前结点有两个子结点:找到当前结点右子树中的最小值,将其替代当前结点,并在右子树中删除该最小值。

4. 实现查找操作查找操作是在树中寻找指定值的过程。

同样可以通过递归的方式实现查找操作。

具体来说,如果要查找的值小于当前结点的值,则在左子树中继续查找;如果要查找的值大于当前结点的值,则在右子树中继续查找。

国家开放大学《数据结构》课程实验报告(实验3 ——栈、队列、递归设计)参考答案

国家开放大学《数据结构》课程实验报告(实验3 ——栈、队列、递归设计)参考答案
{
x=Pop(s); /*出栈*/
printf("%d ",x);
InQueue(sq,x); /*入队*/
}
printf("\n");
printf("(10)栈为%s,",(StackEmpty(s)?"空":"非空"));
printf("队列为%s\n",(QueueEmpty(sq)?"空":"非空"));
ElemType Pop(SeqStack *s); /*出栈*/
ElemType GetTop(SeqStack *s); /*取栈顶元素*/
void DispStack(SeqStack *s); /*依次输出从栈顶到栈底的元素*/
void DispBottom(SeqStack *s); /*输出栈底元素*/
} SeqQueue; /*定义顺序队列*/
void InitStack(SeqStack *s); /*初始化栈*/
int StackEmpty(SeqStack *s); /*判栈空*/
int StackFull(SeqStack *s); /*判栈满*/
void Push(SeqStack *s,ElemType x); /*进栈*/
sq=(SeqQueue *)malloc(sizeof(SeqQueue));
InitQueue(sq);
printf("(8)队列为%s\n",(QueueEmpty(sq)?"空":"非空"));
printf("(9)出栈/入队的元素依次为:");

北邮数据结构第三次实验-实验报告

北邮数据结构第三次实验-实验报告

数据结构实验报告实验名称:实验三——栈和队列学生姓名:班级:班内序号:学号:日期:1.实验要求1.1 实验目的通过选择下面两个题目之一进行实现,掌握如下内容:➢掌握二叉树基本操作的实现方法➢了解赫夫曼树的思想和相关概念➢学习使用二叉树解决实际问题的能力1.2 实验内容根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树。

二叉树的基本功能:1、二叉树的建立2、前序遍历二叉树3、中序遍历二叉树4、后序遍历二叉树5、按层序遍历二叉树6、求二叉树的深度7、求指定结点到根的路径8、二叉树的销毁9、其他:自定义操作编写测试main()函数测试线性表的正确性2. 程序分析2.1 二叉链表2.2 二叉树的二叉链表存储示意图2.3 关键算法分析2.3.1算法1:void create(Binode<T> *&R, T data[], int i);[1] 算法功能:创建一个二叉树[2] 算法基本思想:通过构造函数创建一个二叉树,构造函数通过调用函数create()创建二叉树,关于函数create()的伪代码:1.定义根指针,输入节点储存的data,若输入“#”,则该节点为空;2.申请一个新节点,判断它的父结点是否不为空,如果不为空在判断其为左或者右孩子,并把地址付给父结点,把data写入。

[3] 算法空间、时间复杂度:O(n)[4] 代码逻辑(可用伪代码描述):if(data[i-1]!=0){R = new Binode<T>;R->data= data[i-1];R->lch = R->rch = NULL;create(R->lch, data,2*i);create(R->rch, data, 2*i+1);}2.3.2算法2:void Destroy(Binode<T> *R);[1] 算法功能:二叉树的销毁[2] 算法基本思想:采用后序遍历的方法,释放节点。

福师大计算机系数据结构实验三

福师大计算机系数据结构实验三

实验报告(三):栈及其应用专业:计算机科学与技术班级:计本班姓名:学号:日期: 2012-10-11 1实验目的1)掌握顺序栈的类型定义方法。

2)掌握在顺序栈上实现的六种基本操作。

3)掌握顺序栈的简单应用。

4)掌握链栈的实现、并能够清楚对比栈的两种实现方法的优劣。

2实验内容1)设计和实现一个栈数据结构(可以是顺序栈,链栈)。

2)实现栈数据结构的各种操作,包括栈的初始化、出入栈、清空和释放栈等。

3)在上述实现的栈的基础上,实现栈的应用:写一个算法,完成表达式的求值。

4)上述栈的实现和应用不限制顺序栈或者链式栈,两者皆可。

3实验要求1)提前预习该实验相关的内容,包括栈的两种实现方法,以及具体存储结构上的各类栈操作。

2)选择其中一种存储方法加以实现,并完成相关操作实现。

3)设计并实现算法完成实验内容中表达式的求值。

4)编写完整的程序完成实验内容,并上机调试和运行。

5)整理并上交实验报告。

6)本次实验要求在4学时内完成。

4数据结构设计4.1栈结构设计(采取单链表的结构)类图的设计:字段4.2基本操作所要实现的基本操作:1)完成表达式的求值。

5实现5.1设计实现//"public.h"#pragma once#pragma region声明#include<string.h>#include<ctype.h>//malloc() 等函数#include<malloc.h>//INT_MAX#include<limits.h>//EOF (=^Z或F6),NULL#include<stdio.h>//atoi()#include<stdlib.h>//eof()#include<io.h>#include<math.h>//exit()#include<process.h>//cout,cin#include<iostream>using namespace std;//函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1typedef int Status;typedef int Boolean;typedef char SElemType;#pragma endregion//"DefinitionForSqStack.h"栈的定义#pragma once#include"public.h"#define STACK_INIT_SIZE 10#define STACKINCREMENT 2//顺序栈struct SqStack{//在栈构造之前和销毁之后,base的值为NULLSElemType *base;//栈顶指针SElemType *top;//当前已经分配的存储空间,以元素为单位int stacksize;};5.2操作实现5.2.1顺序栈的操作实现//"DefinitionForSqStack.h"#pragma once#include"public.h"#define STACK_INIT_SIZE 10#define STACKINCREMENT 2Status InitStack(SqStack & s){if(!(s.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)))){//存储分配失败exit(OVERFLOW);}s.top = s.base;s.stacksize = STACK_INIT_SIZE;return OK;}Status DestroyStack(SqStack & s){//销毁栈s,s不再存在free(s.base);s.base = NULL;s.top = NULL;s.stacksize = 0;return 0;}Status ClearStack(SqStack & s){//把s置为空栈s.top = s.base;return OK;}Status StackEmpty(SqStack & s){//若栈s为空栈,则返回TRUE,否则返回FALSEif(s.top == s.base){return TRUE;}else{return FALSE;}}Status StackLength(SqStack & s){//返回s的元素个数,即栈的长度return s.top - s.base;}Status GetTop(SqStack & s,SElemType & e){//若栈不空,则用e返回s的栈顶元素,并返回OK;否则返回ERROR if(s.top > s.base){e = *(s.top - 1);return OK;}else{return ERROR;}}Status Push(SqStack & s,SElemType & e){//插入元素e为新的栈顶元素if(s.top - s.base >= s.stacksize){//栈满,新申请存储空间s.base = (SElemType *)realloc(s.base,(s.stacksize + STACKINCREMENT)*sizeof(SElemType));if(!s.base){//存储空间分配失败exit(OVERFLOW);}s.top = s.base + s.stacksize;s.stacksize += STACKINCREMENT;}*(s.top) ++= e;return OK;}Status Pop(SqStack & s,SElemType & e){//若栈不空。

数据结构第三次实验报告概况

数据结构第三次实验报告概况
实验报告
2013-2014 学年第 1 学期 任课老师: 刘安丰 课程名称 实验名称 实验环境 C++ 实验目的和内容要求 数据结构 班级 学号 实验时间 姓名 12 月 5 号
实验三
图的操作算法
作算法
实现图的常用操作算法:包括建立图的存储结构、深度优先搜索和广度优先搜索,求图 的最小生成树、拓扑排序、最短路径等。 二、实验目的 1.掌握图的基本存储方法。 2.掌握有关图的操作算法并用高级语言实现。 3.熟练掌握图的两种搜索路径的遍历方法。 4. 掌握图的有关应用。
G.arcs[j][i].adj = G.arcs[i][j].adj; } return OK; } int LocateVex(MGraph G,char ch) //确定节点 ch 在图 G.vexs 中的位置 { int a ; for(int i=0; i<G.vexnum; i++) { if(G.vexs[i] == ch) a=i; } return a; } //typedef struct Pnode //用于普利姆算法 //{ // char adjvex; //节点 // double lowcost; //权值 //}Pnode,Closedge[MAX_VERTEX_NUM]; //记录顶点集 U 到 V-U 的代价最小的边的辅助数组定义 void MiniSpanTree_PRIM(MGraph G,char u)//普利姆算法求最小生成树 { int i,j,k; Closedge closedge; k = LocateVex(G,u); for(j=0; j<G.vexnum; j++) { if(j != k) { closedge[j].adjvex = u; closedge[j].lowcost = G.arcs[k][j].adj; } } closedge[k].lowcost = 0; for(i=1; i<G.vexnum; i++) { k = Minimum(G,closedge); cout<<"("<<closedge[k].adjvex<<","<<G.vexs[k]<<","<<closedge[k].lowcost<<")"<<endl; closedge[k].lowcost = 0; for(j=0; j<G.vexnum; ++j) { if(G.arcs[k][j].adj < closedge[j].lowcost) { closedge[j].adjvex = G.vexs[k]; closedge[j].lowcost= G.arcs[k][j].adj; } } }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第三次数据结构课程实验
注意>>>
1. 第三次作业的提交截止时间为:11月23日晚20:00。

一、编写一个程序,实现由先序遍历序列和中序遍历序列构造一棵二叉树,要求用凹入表示法输出该二叉树。

二叉树用二叉链表结构存储。

用后序遍历对此二叉树各结点进行访问,用1、2、3、顺序替换相应结点中的字符,并输出相关的字符和数字。

先序序列:A B D F G E H I C J L N K N O
中序序列:F D G B H E I A L J M C N K O
根据这两个序列构造二叉树来验证程序,后面的题目用到的二叉树均用这个二叉树来验证。

凹入表示法输出, 比如给定一棵二叉树
a
/ \
b c
/ \ / \
d e f g
凹入表示法输出结果为:
a
b
d
e
c
f
g
第二个输出要求后序遍历二叉树,并将结果顺序输出,
例如:
如果后序遍历的结果为:ABCDEFG
则输出1A 2B 3C 4D 5E 6F 7G
二、设计将二叉链表存储的二叉树转换为一维数组结构的算法,并输出这个数组,空值则用NULL代替。

并以第一题中实验数据来验证。

例如给定一棵二叉树
a
/ \
b c
/ \
d f
输出: a b c d null null f。

相关文档
最新文档