数据结构实验3:栈子系统
验证性实验3:栈子系统
班级学号 20 姓名施程程
1.实验目的
(1)掌握栈的特点及其描述方法。
(2)用链式存储结构实现一个栈。
(3)掌握建栈的各种基本操作。
(4)掌握栈的几个典型应用的算法。
2.实验内容
(1)设计一个字符型的链栈。
(2)编写进栈、出栈、显示栈中全部元素的程序。
(3)编写一个把十进制整数转换成二进制数的应用程序。
(4)编写一个把中缀表达式转换成后缀表达式(逆波兰式)的应用程序。
(5)设计一个选择式菜单,以菜单方式选择上述操作。
栈子系统
**********************************************
* 1---------进栈 *
* 2---------出栈 *
* 3---------显示 *
* 4---------数制转换 *
* 5---------逆波兰式 *
* 0---------返回 *
**********************************************
请选择菜单号(0--5):
3.实验程序(附zhan.cpp)
#include
#include
#define STACKMAX 100
typedef struct stacknode
{
int data;
struct stacknode *next;
}StackNode;
typedef struct
{
StackNode *top;
}LinkStack;
void Push (LinkStack &s,int x)
{
StackNode *p=new StackNode;
p->data=x;
p->next=s.top;
s.top=p;
}
int Pop(LinkStack &s,int &x)
{
StackNode *p;
if(s.top!=NULL)
{
p=s.top;
x=p->data;
s.top=p->next;
delete p;
return 1;
}
else
return 0;
}
void ShowStack (LinkStack s)
{
StackNode *p=s.top;
if (p==NULL)
printf("\n\t\t栈为空。 ");
else
{
printf("\n\t\t栈元素为: ");
while (p!=NULL)
{
printf("%6d",p->data);
p=p->next;
}
printf("\n");
}
}
void Conversion(int n)
{
LinkStack s;
int x;
s.top=NULL;
do
{
x=n%2;
n=n/2;
Push(s,x);
}while(n);
printf("\n\t\t转换后的二进制数值: ");
while (Pop(s,x))
printf("%d",x);
printf("\n");
}
void Suffix()
{
char str[STACKMAX];
char stack[STACKMAX];
char exp[STACKMAX];
char ch;
int sum,i,j,t,top=0;
printf("\n\t\t输入算术表达式(算术符只能包含+,-,*,/),以#结束:\n\t\t");
fflush(stdin);
i=0;
do
{
i++;
scanf("%c",&str[i]);
}while(str[i]!='#'&& i!=STACKMAX);
sum=i;
t=1;
i=1;
ch=str[i];
i++;
while (ch!='#')
{
switch (ch)
{
case '(':
top++;
stack[top]=ch;
break;
case ')':
while (stack[top]!='(')
{
exp[t++]=stack[top--];
exp[t++]=',';
}
top--;
break;
case '+':
case '-':
while (top!=0 && stack[top]!='(')
{
exp[t++]=stack[top--];
exp[t++]=',';
}
stack[++top]=ch;
break;
case '*':
case '/':
while(stack[top]=='*' || stack[top]=='/')
{
exp[t++]=stack[top--];
exp[t++]=',';
}
stack[++top]=ch;
break;
case ' ':
break;
default:
while (ch>='0'&&ch<='z')
{
exp[t++]=ch;
ch=str[i++];
}
i--;
exp[t++]=',';
}
ch=str[i++];
}
while (top!=0)
{
exp[t++]=stack[top--];
if(top!=0)
exp[t++]=',';
}
printf("\n\t\t输入的中缀表达式是: ");
for(j=1;j printf("%c",str[j]); printf("\n\n\t\t后缀表达式是: "); for(j=1;j printf("%c",exp[j]); printf("\n"); } void main() { LinkStack s; int i=1,j=1,val,n; char choice; s.top=NULL; while(1) { printf("\n"); printf("\n\t\t 栈子系统 "); printf("\n\t\t**********************"); printf("\n\t\t* 1--进栈 *"); printf("\n\t\t* 2--出栈 *"); printf("\n\t\t* 3--显示 *"); printf("\n\t\t* 4--数制转换 *"); printf("\n\t\t* 5--逆波兰式 *"); printf("\n\t\t* 0--退出程序 *"); printf("\n\t\t**********************"); printf("\n\t\t 请选择菜单号(0--5): "); fflush(stdin); choice=getchar(); switch (choice) { case '1': while (1) { printf("\n\t\t输入一个整数('0'表示结束)并按回车: "); scanf("%d",&val); if (val!=0) Push (s,val); else break; } break; case '2': if (Pop(s,val)) printf("\n\t\t出栈元素为: %6d",val); else printf("\n\t\t栈为空,没有元素可以出栈! \n"); break; case '3': ShowStack(s); break; case '4': printf("\n\t\t请输入一个十进制正整数: "); scanf("%d",&n); Conversion(n); break; case '5': Suffix(); break; case '0': exit(0); default: printf("\n\t\t输入的菜单错误,请重新输入! \n"); } } } 4. 运行结果 #include<> #include<> #include<> #define MAXSIZE 100 typedef int DataType; typedef struct stack { DataType data[MAXSIZE]; int top; }sqstack; sqstack *InitStack(sqstack *S)出* 1.顺序栈的初始化*┃\n"); printf("\t┃* * *┃\n"); printf("\t┃************************************************************┃\n"); printf("\t┃* * *┃\n"); printf("\t┃* 2.元素的入栈* 3.元素的出栈*┃\n"); printf("\t┃* * *┃\n"); printf("\t┃************************************************************┃\n"); printf("\t┃* * *┃\n"); printf("\t┃* 4.取栈顶元素* 5.判空*┃\n"); printf("\t┃* * *┃\n"); printf("\t┃************************************************************┃\n"); printf("\t┃* *┃\n"); printf("\t┃* 6.将十进制数转换为其他进制数*┃\n"); printf("\t┃* *┃\n"); printf("\t┃************************************************************┃\n"); printf("\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n"); while ((m='0')&&(m='1')&&(m='2')&&(m='3')&&(m='4')&&(m='5')&&(m='6')&&(m='7')) { printf("\n请选择你需要操作的步骤(0至7):"); fflush(stdin); scanf("%c",&m); switch(m) { case '0': { exit(0); break; } 实验二堆栈和队列 实验目的: 1.熟悉栈这种特殊线性结构的特性; 2.熟练并掌握栈在顺序存储结构和链表存储结构下的基本运算; 3.熟悉队列这种特殊线性结构的特性; 3.熟练掌握队列在链表存储结构下的基本运算。 实验原理: 堆栈顺序存储结构下的基本算法; 堆栈链式存储结构下的基本算法; 队列顺序存储结构下的基本算法;队列链式存储结构下的基本算法;实验内容: 3-18链式堆栈设计。要求 (1)用链式堆栈设计实现堆栈,堆栈的操作集合要求包括:初始化Stacklnitiate (S), 非空否StackNotEmpty(S),入栈StackiPush(S,x), 出栈StackPop (S,d),取栈顶数据元素StackTop(S,d); (2)设计一个主函数对链式堆栈进行测试。测试方法为:依次把数据元素1,2,3, 4,5 入栈,然后出栈并在屏幕上显示出栈的数据元素; (3)定义数据元素的数据类型为如下形式的结构体, Typedef struct { char taskName[10]; int taskNo; }DataType; 首先设计一个包含5个数据元素的测试数据,然后设计一个主函数对链式堆栈进行测试,测试方法为:依次吧5个数据元素入栈,然后出栈并在屏幕上显示出栈的数据元素。 3-19对顺序循环队列,常规的设计方法是使用対尾指针和对头指针,对尾指针用于指示当 前的対尾位置下标,对头指针用于指示当前的対头位置下标。现要求: (1)设计一个使用对头指针和计数器的顺序循环队列抽象数据类型,其中操作包括:初始化,入队列,出队列,取对头元素和判断队列是否为空; (2)编写一个主函数进行测试。 实验结果: 3-18 typedef struct snode { DataType data; struct snode *n ext; } LSNode; /* 初始化操作:*/ 图实验一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template #include 数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include (封面) 学生实验报告 学院:国际经贸学院 课程名称:数据结构 专业班级: 09电子商务 姓名: 学号: 学生实验报告 (经管类专业用) 一、实验目的及要求: 1、目的 通过实验,实现顺序栈的各种基本运算。 2、内容及要求 编写一个程序,实现顺序栈的各种基本运算,并在此基础上设计一个主程序完成下列功能: (1)初始化栈S。 (2)判断栈S是否非空。 (3)依次进栈元素a,b,c,d,e。 (4)判断栈S是否非空。 (5)输出栈的长度。 (6)输出从栈顶到栈底的元素。 (7)输出出栈序列; (8)判断链栈S是否为空; (9)释放链栈 二、仪器用具: 三、实验方法与步骤: 一、查阅顺序栈等相关资料,熟悉顺序栈基本概念和流程 二、“开展”顺序栈实验流程 三、整理实验数据和文档,总结实验的过程,编写实验报告 四、实验结果与数据处理: 1、顺序栈的代码: #include 数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 6.0上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>//头文件 #include nodetype *create()//建立单链表,由用户输入各结点data域之值,//以0表示输入结束 { elemtype d;//定义数据元素d nodetype *h=NULL,*s,*t;//定义结点指针 int i=1; cout<<"建立一个单链表"< 实验三的实验报告 学期: 2010 至_2011 第 2 学期 2011年 3月 27日课程名称: 数据结构专业:信息与计算科学 09 级5班实验编号: 03 实验项目:栈和队列实验指导教师 _冯山_姓名:朱群学号: 2009060548 实验成绩: 一实验目的: (1)熟练掌握栈和队列的抽象数据类型及其结构特点; (2)实现基本的栈和队列的基本操作算法程序。 二实验内容:(类C算法的程序实现,任选其一) (1) 设计与实现基本的堆栈和队列结构下的各种操作(如堆栈的PUSH、POP 等操作)(必做); (2)以表达式计算为例,完成一个可以进行算术表达式计算功能的算法设计 与实现(选做); (3)以迷宫问题为例,以堆栈结构完成迷宫问题的求解算法和程序(选做)。三实验准备: 1) 计算机设备;2)程序调试环境的准备,如TC环境;3)实验内容的算法分 析与代码设计与分析准备。 四实验步骤: 1.录入程序代码并进行调试和算法分析; 2.编写实验报告。 五实验过程 一设计与实现基本的堆栈结构下的各种操作(如堆栈的PUSH、POP等操作)(1)问题描述 实现堆栈各种基本操作,如Pop,Push,GetTop等操作,即输入数据,通过Push入栈,再通过Pop操作输出出栈的元素,即入栈a,b,c,d,出栈d,c,b,a (2)算法实现及基本思想 堆栈是后进先出的线性表,由Push输入元素,Pop输出元素,堆栈的Push 操作思想,即插入元素e为新的的栈顶元素,先判断栈满与否,追加存储空间,然后将e值赋给栈顶指针Top。输入数据时用for循环 堆栈的Pop操作思想,先判断栈是否为空,若栈不空,则删除栈的栈顶元素,用e返回其值, (3)数据结构 栈的顺序存储结构 Typedef struct { 《数据结构与算法》实验报告 实验03:栈 一、实验目的 1.掌握链式栈和顺序栈的特点; 2.掌握链式栈和顺序栈基本结构的定义及其基本运算; 3.掌握链式栈和顺序栈的创建和初始化、进栈、出栈、读取栈顶元素和显示栈中所有元素等基本操作。 二、实验内容 假设一个班有N个学生(N<20),每个学生有学号、姓名、性别、分数共4个成员。各个学生之间的逻辑关系是线性的,请采用链式栈和顺序栈作为存储结构编写程序。 程序所要实现的功能如下: ①输入一个学生并进栈; ②出栈一个学生并输出; ③读取栈顶元素并输出; ④输出栈中所有学生的相关信息。 顺序栈程序的主菜单如图3-1所示,链式栈的功能界面与其类似。 三、实验要求 1、学号为双号的同学:采用链式栈作为存储结构,补全程序LinkedStack-NoHead.cpp之中的代码;学号为单号的同学:采用顺序栈作为存储结构,补全SeqStack-Dynamic.cpp中的代码。 2、程序的界面及详细功能分别参见演示程序LinkedStackDemo.exe和SeqStackDemo.exe。 3、实验报告电子稿和打印稿及其它提交方面的要求同实验01。 四、运行结果(截图) 图3-1 显示栈中所有元素 图3-2进栈一个元素 图3-3出栈一个元素五、实验程序(源代码) #include"stdio.h" #include"stdlib.h" #include"string.h" // 学生结构体 typedef struct { char no[10]; char name[20]; char gender; float score; } STU; // 链式栈结点的结构体 typedef struct LNode { STU data; // 当前结点中存储的学生数据 struct LNode *next; // 下一个结点的地址 } StackNode; // 链式栈的结构体 typedef struct { StackNode *top; // 栈顶指针(相当于无头结点单链表的头指针)} LinkedStack; // 功能菜单 void menu() { printf("\n\t***************链式栈*****************\n"); printf("\t* 1 进栈一个学生 *\n"); printf("\t* 2 出栈一个学生 *\n"); printf("\t* 3 读取栈顶元素并输出 *\n"); printf("\t* 4 输出所有学生信息 *\n"); printf("\t* 0 保存数据并退出程序 *\n"); printf("\t******************************************\n"); printf("\t请选择菜单项:"); } /*检测当前目录下是否存在文件stu.dat,如果存在,则从其中读取数据构造链式栈; 否则,新建该数据文件。*/ void init(LinkedStack &LS) { FILE *fp; char flag='r'; STU stmp; StackNode *p, *rear; // 先设置链式栈的top指针为空,表示链式栈为空 LS.top = NULL; // 打开文件 if((fp=fopen("stu.dat","rb"))==NULL) { 云南大学 数据结构实验报告 第三次实验 学号: 姓名: 一、实验目的 1、复习结构体、指针; 2、掌握链表的创建、遍历等操作; 3、了解函数指针。 二、实验内容 1、(必做题)每个学生的成绩信息包括:学号、语文、数学、英语、总分、加权平均分;采用链表存储若干学生的成绩信息;输入学生的学号、语文、数学、英语成绩;计算学生的总分和加权平均分(语文占30%,数学占50%,英语占20%);输出学生的成绩信息。 三、算法描述 (采用自然语言描述) 首先创建链表存储n个学生的成绩信息,再通过键盘输入学生的信息,创建指针p所指结点存储学生的成绩信息,从键盘读入学生人数,求出学生的总分和加权平均分,输出结果。 四、详细设计 (画出程序流程图) 五、程序代码 (给出必要注释) #include 数据结构实验 实验项目名称:堆栈的基本操作 实验地点班级: 姓名:学号: 指导教师:成绩: 一、实验目的: 掌握堆栈的基本操作,考查数据的组织方式和函数的基本应用。 二、实验要求: 堆栈的入栈、出栈。 三、实验内容: 1、程序代码:(小五分两栏) ①顺序栈: #include "stdio.h" #include "stdlib.h" #define max 100 typedef struct wr { int data[max]; int top; }stack; void push(stack *s,int x) { if(s->top==max-1) { exit(0); } s->top++; s->data[s->top]=x; } int pop(stack *s) { int x; if(s->top==-1) { exit(0); } x=s->data[s->top]; s->top--; return x; } int main() { int e,i,x; stack s; s.top=-1; scanf("%d",&x); for(i=0;i { scanf("%d",&e); push(&s,e); } for(i=0;i 实验报告 学院(系)名称:计算机科学与工程学院 姓名赵振宇学号20175302 专业 计算机科学与技术 班级 2017级4班实验项目 实验三:图的遍历与应用 课程名称 数据结构与算法 课程代码 0661913 实验时间 2019年5月27日 第3、4节 实验地点 7-219 考核标准实验过程25分 程序运行20分 回答问题15分 实验报告30分 特色功能5分 考勤违纪情况5分 成绩 成绩栏 其它批改意见: 教师签字: 考核内容 评价在实验课堂中的表现,包括实验态度、编写程序过程等内容等。 □功能完善,□功能不全□有小错□无法运行 ○正确○基本正确○有提示○无法回答 ○完整○较完整 ○一般 ○内容极少○无报告 ○有 ○无 ○有 ○无一、实验目的 1、实验目的:通过实验使学生理解图的主要存储结构,掌握图的构造算法、图的深度优先和广度优先遍历算法,能运用图解决具体应用问题。 二、实验题目与要求 要求:第1题为必做题,2,3,4至少选一 1.输入指定的边数和顶点数建立图,并输出深度优先遍历和广度优先遍历的结果。 1)问题描述:在主程序中设计一个简单的菜单,分别调用相应的函数功能:1…图的建立2…深度优先遍历图3…广度优先遍历图0…结束 2)实验要求:在程序中定义下述函数,并实现要求的函数功能:CreateGraph():按从键盘的数据建立图 DFSGrahp():深度优先遍历图 BFSGrahp():广度优先遍历图 3)实验提示: 图的存储可采用邻接表或邻接矩阵; 图存储数据类型定义(邻接表存储) #define MAX_VERTEX_NUM8//顶点最大个数 typedef struct ArcNode {int adjvex; struct ArcNode*nextarc; int weight;//边的权 }ArcNode;//表结点 #define VertexType int//顶点元素类型 typedef struct VNode {int degree,indegree;//顶点的度,入度 VertexType data; ArcNode*firstarc; }Vnode/*头结点*/,AdjList[MAX_VERTEX_NUM]; typedef struct{ AdjList vertices; int vexnum,arcnum;//顶点的实际数,边的实际数}ALGraph; 4)注意问题: 注意理解各算法实现时所采用的存储结构。 注意区别正、逆邻接。 2.教学计划编制问题 南京工程学院实验报告 操作的函数程序清单,分别用顺序表和链表结构完成,并在首页上表明团队名称、成员及个人的工作(函数),未来的成绩评定时将包含这一部分的团队成绩及个人的工作成绩。 一、实验目的 1.熟悉上机环境,进一步掌握语言的结构特点。 2.掌握线性表的顺序存储结构的定义及实现。 3.掌握线性表的链式存储结构——单链表的定义及实现。 4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5.掌握线性表在链式存储结构——单链表中的各种基本操作。 二、实验内容 1.顺序线性表的建立、插入及删除。 2.链式线性表的建立、插入及删除。 三、实验步骤 1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。 2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。 3.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。 四、程序主要语句及作用(main函数程序清单) 程序1的主要代码(附简要注释) #include 宁波工程学院电信学院计算机教研室 实验报告 一、实验目的 1)熟悉串的定义和串的基本操作。 2 )掌握链串的基本运算。 3 )加深对串数据结构的理解,逐步培养解决实际问题的编程能力。 二、实验环境 装有Visual C ++ 6.0的计算机。 三、实验内容 编写一个程序,实现链串的各种基本运算,并在此基础上设计一个主程序。具体如下: 编写栈的基本操作函数 链串类型定义如下所示: typedef struct sno de{ char data; struct snode *n ext; }listri ng; (1)串赋值Assig n(s,t) 将一个字符串常量赋给串s, 即生成一个其值等于t 的串s ( 2 )串复制StrCopy(s,t) 将串t 赋给串s ( 3 )计算串长度StrLength(s) 返回串s 中字符个数 ( 4 )判断串相等StrEqual(s,t) 若两个串s 与t 相等则返回 1 ;否则返回0 。 ( 5 )串连接Concat(s,t) 返回由两个串s 和t 连接在一起形成的新串。 ( 6 )求子串SubStr(s,i,j) 返回串s中从第i(1 w i w StrLength(s))个字符开始的、由连续j 个字 符组成的子串。 ( 7)插入InsStr (s,i,t) 将串t 插入到串s 的第i(1 w i w StrLength(s)+1) 个字符中,即将t 的第一个字符作为s 的第i 个字符,并返回产生的新串( 8)串删除DelStr (s,i,j) 从串s 中删去从第i(1 w i w StrLength(s)) 个字符开始的长度为j 的 子串,并返回产生的新串。 (9)串替换RepStr (s,s1,s2) 在串s 中,将所有出现的子串s1 均替换成s2 。 (10)输出串DispStr(s) 输出串s 的所有元素值 (11 )判断串是否为空IsEmpty(s) 编写主函数 调用上述函数实现下列操作: (1) 建立串s= “ abcdefghijklmn ”,串s1= “xyz ”,串t =" hijk ” ( 2 ) 复制串t 到t1 ,并输出t1 的长度 ( 3) 在串s 的第9 个字符位置插入串s1 而产生串s2 ,并输出s2 ( 4) 删除s 第 2 个字符开始的 5 个字符而产生串s3 ,并输出s3 ( 5) 将串s 第 2 个字符开始的 3 个字符替换成串s1 而产生串s4 ,并输出s4 (6) 提取串s的第8个字符开始的4个字符而产生串S5,并输出S5 ( 7) 将串s1 和串t 连接起来而产生串s6 ,并输出s6 ( 8) 比较串s1 和s5 是否相等,输出结果 实验编号:3四川师大《数据结构》实验报告2016年10月29日 实验三栈与队列及其应用_ 一.实验目得及要求 (1)掌握栈与队列这两种特殊得线性表,熟悉它们得特性,在实际问题背景下灵活运用它们; (2)本实验训练得要点就是“栈”得观点及其典型用法; (3)掌握问题求解得状态表示及其递归算法,以及由递归程序到非递归程序得转化方法。 二.实验内容 (1)编程实现栈在两种存储结构中得基本操作(栈得初始化、判栈空、入栈、出栈等); (2)应用栈得基本操作,实现数制转换(任意进制); (3)编程实现队列在两种存储结构中得基本操作(队列得初始化、判队列空、入队列、出队列); (4)利用栈实现任一个表达式中得语法检查(括号得匹配)。 (5)利用栈实现表达式得求值。 注:(1)~(3)必做,(4)~(5)选做。 三.主要仪器设备及软件 (1)PC机 (2)Dev C++ ,Visual C++, VS2010等 四.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)(1)编程实现栈在两种存储结构中得基本操作(栈得初始化、判栈空、入栈、出栈等); A、顺序储存: ?代码部分: //Main、cpp: #include"SStack、h" int main() { SqStack S; SElemType e; int elect=1; InitStack(S); cout << "已经创建一个存放字符型得栈" << endl; while (elect) { Muse(); cin >> elect; cout << endl; switch (elect) { case 1: cout << "input data:"; cin >> e; Push(S, e); break; case 2: if(Pop(S, e)) {cout << e <<" is pop"<< endl; } else{cout<<"blank"< 实验目的 (1)学会用先序创建一棵二叉树。 (2)学会采用递归算法对二叉树进行先序、中序、后序遍历。 (3)学会打印输出二叉树的遍历结果。 实验内容 【问题描述】建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果。 【基本要求】 从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),并采用递归算法对其进行遍历(先序、中序、后序),将遍历结果打印输出。 【测试数据】 ABCффDEфGффFффф(其中ф表示空格字符) 则输出结果为先序:ABCDEGF 中序:CBEGDFA 后序:CGBFDBA 【选作内容】 采用非递归算法实现二叉树遍历。 实验步骤 (一)需求分析 1、在这个过程中,接受遍历的二叉树是从键盘接受输入(先序),以二叉链表作为存储结构,建立的二叉树。因此,首先要创建一棵二叉树,而这棵二叉树是先序二叉树。本演示程序中,集合的元素设定为大写字母ABCDEFG,输出的先序,中序,后序遍历分别为ABCDEGF,CBEGDFA,CGBFDBA。二叉树可以表示为: 接受的输入数据在进行递归的先序,中序,后序遍历后,分别将结果打印出来。 2、在程序运行的过程中可以看到,以计算机提示用户执行的方式进行下去,即在计算机终端上提示“输入二叉树的先序序列”后,由用户在键盘上输入ABC##DE#G##F###,之后相应的选择遍历及遍历结果显示出来。 3、程序执行的命令包括:首先是二叉树的先序序列被创建输入,其次是对输入进去的先序序列有次序的进行先序,中序,后序遍历。最后是打印出二叉树的遍历结果。 4、测试数据 (1)在键盘上输入的先序序列ABC##DE#G##F### (2)先序遍历结果ABCDEGF 数据结构实验3 《数据结构与算法》实验报告 实验序号:3 实验项目名称:链式表的操作学号1507112104 姓名陈忠表专业、班15商智实验地点指导教师林开标实验时间16.11.09 一、实验目的及要求 1. 通过实验理解单链表的逻辑结构; 2. 通过实验掌握单链表的基本操作和具体的函数实现。 二、实验设备(环境)及要求 微型计算机; windows 操作系统; Microsoft Visual Studio 6.0集成开发环境。 三、实验内容与步骤 链式表表示和实现线性表的如下: #include"stdio.h" #include"stdlib.h" typedef struct node //定义结点 { int data; //结点的数据域为整型 struct node *next; //结点的指针域 }ListNode; typedef ListNode * LinkList; // 自 定义LinkList单链表类型 LinkList CreatListR1(); //函数,用尾插入法建立带头结点的单链表 ListNode *LocateNode(LinkList head, int key); //函数,按值查找结点 void DeleteList(LinkList head,int key); //函数,删除指定值的结点 void printlist(LinkList head); //函数,打印链表中的所有值 void DeleteAll(LinkList head); //函数,删除所有结点,释放内存 //==========主函数============== void main() { int num; char ch; LinkList head; head=CreatListR1(); //用尾插入 法建立单链表,返回头指针 printlist(head); //遍历链表 输出其值 printf(" Delete node (y/n):"); //输入 实验难度: A □ B □ C □序号学号姓名成绩 指导教师(签名) 学期:2017秋季学期 任课教师: 实验题目: 组员及组长: 承担工作: 联系电话: 电子邮件: 完成提交时间:年月日 一、【实验构思(Conceive)】(10%) (本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计等相关知识,对问题进行概要性地分析) 魔王语言的解释规则: 大写字母表示魔王语言的词汇,小写字母表示人的词汇语言,魔王语言中可以包含括号,魔王语言的产生式规则在程序中给定,当接收用户输入的合法的魔王语言时,通过调用魔王语言翻译函数来实现翻译。 在 A 的基础上,(根据产生式)自定义规则,将一段魔王的话翻译为有意义的人类语言(中文):输入wasjg,则魔王语言解释为“我爱数据结构”。 运用了离散数学的一些基本知识及程序设计知识。 二、【实验设计(Design)】(20%) (本部分应包括:抽象数据类型的定义和基本操作说明,程序包含的模块以及各模块间的调用关系,关键算法伪码描述及程序流程图等,如有界面则需包括界面设计,功能说明等) //---------------抽象数据类型的定义------------------// #define STACK_INIT_SIZE 50 #define STACKINCREMENT 10 #define OVERLOW -2 #define ERROR -1 typedef struct { char *base; //顺序栈的栈底指针 int top; //顺序栈的栈顶 int size; //栈元素空间的大小 }SqStack; //结构体类型顺序栈 typedef struct { char *base; int front; int rear; }SqQueue; //结构体类型队列 //---------------各个模块功能的描述------------------// void Init_SqStack(SqStack &s) //初始化顺序桟 void Push_SqStack(SqStack &s, char c) //压入数据 int Pop_SqStack(SqStack &s, char &e) //出桟 char GetTop_SqStack(SqStack s)//或得栈顶 南京工程学院实验报告 1.熟悉上机环境,进一步掌握语言的结构特点。 2.掌握线性表的顺序存储结构的定义及实现。 3.掌握线性表的链式存储结构——单链表的定义及实现。 4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5.掌握线性表在链式存储结构——单链表中的各种基本操作。 二、实验内容 1.顺序线性表的建立、插入及删除。 2.链式线性表的建立、插入及删除。 三、实验步骤 1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。 2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素(学号)。 3.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。 四、程序主要语句及作用 程序1的主要代码(附简要注释) #include p->rchild=NULL; p->data=n; } else if(n>p->data) p->rchild=initBST(n,p->rchild); else p->lchild=initBST(n,p->lchild); return p; } void inorder(BSTNODE *BT){ if(BT!=NULL){ inorder(BT->lchild); printf("%d",BT->data); inorder(BT->rchild); } } BSTNODE *search_btree(BSTNODE *root,int key) { if(!root) {printf("Emptu btree\n"); return root;} while(root->data!=key) { if(key 《数据结构》实验报告 一、实验名称 实验三:排序 二、实验目的 通过本实验,加深对排序概念的理解,能够对三类不同排序方法进行复杂度分析。掌握简单排序方法、先进排序方法和基数排序方法的变化过程及算法设计与分析。 三、实验要求 (1)学生提前准备好实验报告,预习并熟悉实验步骤; (2)遵守实验室纪律,在规定的时间内完成要求的内容; (3)1~2人为1小组,实验过程中独立操作、相互学习; 四、实验内容及步骤 (一)选择排序算法的实现 1、正确设计程序,并编译、链接成可执行文件 (1)首先正确写出排序顺序表的结构体typedef struct SqList (2)正确写出选择排序算法SelectSort (3)写出主程序main ,提供输入与输出操作 本程序的特点是对于用户给定的一组关键字序列(49,38,65,49,76,13,27,52),采用选择排序将其变成一个有序表,并输出排序结果。详见附1。 2、进行程序测试 直接运行可执行文件,观察输出结果,结果正确,如图 1 所示。 图1 3、算法的时间复杂度分析 本算法为二重循环,基本操作为“比较”与“交换”,二者的时间复杂度均为O(n2),由于二者是顺序结构,因此算法的整体时间复杂度为T(n)= O(n2)。 (二)插入排序算法的实现 1、正确设计程序,并编译、链接成可执行文件 (1)首先正确写出排序顺序表的结构体typedef struct SqList (2)正确写出插入排序算法InsertSort (3)写出主程序main ,提供输入与输出操作 本程序的特点是对于用户给定的一组关键字序列(49,38,65,97,76,13,27,49),采用插入排序将其变成一个有序表,并输出排序结果。详见附2。数据结构实验三(顺序栈的基本操作)
数据结构-堆栈和队列实验报告
数据结构实验报告图实验
数据结构实验报告
数据结构-实验报告顺序栈
数据结构实验报告全集
数据结构 实验报告三
数据结构实验03-栈
数据结构实验报告[3]
数据结构实验-栈
数据结构实验三
数据结构实验报告
数据结构实验报告3链串
数据结构_实验三_栈和队列及其应用
数据结构实验报告.
数据结构实验3
(精选)云南大学软件学院数据结构实验3
《数据结构》实验3实验报告
数据结构实验报告三