提交 fb4cd594 创建 作者: 宋海霞's avatar 宋海霞

template

上级
流水线 #476 已失败 于阶段
/Debug
/Release
*.bak
image: "registry.cn-hangzhou.aliyuncs.com/engintime/ubuntu_16.04_cpp:latest"
stages:
- make
- case1
- teacher-check
variables:
TEMPLATE_REPO: "engintime/ds-lab/Project-Template/Lab011.git"
.codecode-runner: &codecode-runner
tags:
- ubuntu-16.04
- short-job
make:
stage: make
<<: *codecode-runner
script:
- make
- execscore.sh 40
only:
- master
case1:
stage: case1
<<: *codecode-runner
script:
- make
- ./app > user_output.txt
- diff output.txt user_output.txt -b -B -y -i --suppress-common-lines
- execscore.sh 100
only:
- master
teacher-check:
stage: teacher-check
<<: *codecode-runner
script:
- make
- ./app
- git clone ${CODECODE_PROTOCOL}gitlab-ci-token:${CI_JOB_TOKEN}@${CODECODE_DOMAIN}/${TEMPLATE_REPO} template
- diff template/.gitlab-ci.yml .gitlab-ci.yml -b -B -y -i --suppress-common-lines
- diff template/output.txt output.txt -b -B -y -i --suppress-common-lines
- fileidentity.sh
only:
- master
when: manual
allow_failure: false
#ifndef _BINARYTREE_H_
#define _BINARYTREE_H_
//
// 在此处包含 C 标准库头文件
//
#include <stdio.h>
//
// 在此处包含其他头文件
//
//
// 在此处定义数据结构
//
#define MAX_STACK_SIZE 20 // 栈存储空间的大小
#define MAX_STRING_SIZE 20 // 字符串存储空间的大小
typedef char ElemType;
typedef struct BiTNode{
ElemType data; // 二叉树节点的数据
struct BiTNode* lchild; // 左孩子指针
struct BiTNode* rchild; // 右孩子指针
}BiTNode, *BiTree;
typedef enum PushTimes{
FirstTime,
SecondTime
}PushTimes;
//
// 在此处声明函数
//
int PostOrder(BiTree pTree);
BiTNode* CreateNode(ElemType data);
BiTree InitTree();
void DeleteTree(BiTree pTree);
//
// 在此处声明全局变量
//
extern char g_string[MAX_STRING_SIZE];
extern int g_length;
#endif /* _BINARYTREE_H_ */
<?xml version="1.0" encoding="gb2312"?>
<OSLProject Version="1.00" Name="BinaryTree_PostOrder" SubjectID="cf4dda31-1275-49ef-9b0f-36a6eff372e4" ProjectTemplateID="e729d560-4558-4f53-87d0-b0669a72fd19">
<Configurations>
<Configuration Name="Debug">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool" PreprocessorDefinitions="_DEBUG" GenerateDebugInformation="-1"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool" AdditionalDependencies="&quot;$(DSLInstallDir)Dump\lib\BinaryTree_PostOrder_Demo.o&quot;"/>
<Tool Name="PostBuildEventTool"/>
<VisualContext>
<WatchPoints>
<WatchPoint FunctionName="PostOrder" ObserverID="E66ADC57-90A0-4933-AA14-2828C29CED5D">
</WatchPoint>
</WatchPoints>
</VisualContext>
</Configuration>
<Configuration Name="Release">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool" PreprocessorDefinitions="NDEBUG"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool"/>
<Tool Name="PostBuildEventTool"/>
</Configuration>
</Configurations>
<Files>
<Filter Name="ͷļ" Filter="h;hpp;hxx">
<File RelativePath=".\BinaryTree.h">
</File>
</Filter>
<Filter Name="Դļ" Filter="cpp;c;cc;cxx">
<File RelativePath=".\main.c">
</File>
</Filter>
<File RelativePath=".\makefile">
</File>
<File RelativePath=".\output.txt">
</File>
<File RelativePath=".\readme.md">
</File>
</Files>
</OSLProject>
#include "BinaryTree.h"
int main(int argc, char* argv[])
{
BiTree pTree; // 二叉树指针
int i;
//
// 创建二叉树
//
pTree = InitTree();
//
// 后序遍历二叉树
//
PostOrder(pTree);
for(i = 0; i < g_length - 1; i++)
{
printf("%c", g_string[i]);
}
printf("\n");
//
// 销毁二叉树
//
DeleteTree(pTree);
return 0;
}
/*
功能:
后序遍历二叉树。利用栈实现非递归算法。
参数:
BiTree -- 二叉树指针
返回值:
如果遍历成功返回 1
如果遍历失败返回 0
*/
char g_string[MAX_STRING_SIZE]; // 字符串。用于在遍历过程中保存二叉树的后序序列
int g_length = 0; // 字符串长度。0 表示空字符串
int PostOrder(BiTree pTree)
{
BiTNode* Stack[MAX_STACK_SIZE]; // 栈。用于存储父节点
enum PushTimes TimesStack[MAX_STACK_SIZE]; // 栈。用于存储父节点入栈的次数
int top = 0; // 两个栈使用相同的栈顶。0 表示空栈
BiTNode* pNode; // 二叉树节点指针
enum PushTimes Times; // 父节点入栈的次数
//
// TODO: 在此添加代码
//
return 0;
}
/*
功能:
创建二叉树的一个节点。
参数:
data -- 二叉树节点保存的数据
返回值:
返回节点指针
*/
BiTNode* CreateNode(ElemType data)
{
BiTNode* pNode = (BiTNode*)malloc(sizeof(BiTNode));
pNode->data = data;
pNode->lchild = NULL;
pNode->rchild = NULL;
return pNode;
}
/*
功能:
利用二叉树的先序序列创建一个二叉树。
返回值:
返回二叉树指针
*/
static const char* data = "-*a -b c /d e"; // 二叉树的先序序列字符串。
// 注意:只使用先序序列并不能确定唯一的二叉树。
// 所以,在叶子节点后面要紧跟两个空格,
// 并且,以字符串末尾的字符 '\0' 表示序列结束。
// 这样,先序序列就可以确定唯一的二叉树了。
static int nIndex = 0; // 二叉树先序序列的下标
BiTree InitTree()
{
BiTNode* pRootNode;
if('\0' == data[nIndex]) // 二叉树的先序序列字符串结束
pRootNode = NULL;
else
{
//
// 创建父节点
//
pRootNode = (' ' == data[nIndex] ? NULL : CreateNode(data[nIndex])); // 必须忽略空节点
nIndex++;
}
if(pRootNode != NULL)
{
//
// 利用递归实现先序遍历算法
//
pRootNode->lchild = InitTree();
pRootNode->rchild = InitTree();
}
return pRootNode;
}
/*
功能:
销毁二叉树。
参数:
pTree -- 二叉树指针。
返回值:
*/
void DeleteTree(BiTree pTree)
{
//
// 利用递归实现后序遍历算法
//
if(pTree != NULL)
{
DeleteTree(pTree->lchild);
DeleteTree(pTree->rchild);
free(pTree);
}
}
app:main.o
gcc -o app main.o
main.o:main.c BinaryTree.h
gcc -c -w -O3 -std=c99 -fsigned-char main.c -o main.o
abc-*de/-
\ No newline at end of file
# 阅读实验源代码
**main.c文件**
在main函数中首先创建了二叉树,然后调用PostOrder函数对二叉树进行后序遍历操作,并将产生的后序序列保存在全局变量g_string中,最后销毁了二叉树。
在main函数的后面,分别定义了二叉树的后序遍历函数PostOrder,以及二叉树的创建函数和销毁函数。其中,后序遍历函数PostOrder的函数体还不完整,留给读者完成。
**BinaryTree.h文件**
定义了与二叉树相关的数据结构并声明了相关的操作函数和全局变量。
# 在演示模式下调试项目
**按照下面的步骤调试项目:**
1. 按F7生成项目。
2. 在演示模式下,按F5启动调试项目。程序会在观察点函数的开始位置中断。
3. 重复按F5,直到调试过程结束。
在调试的过程中,每执行“演示流程”窗口中的一行后,仔细观察“可视化数据”窗口内容所发生的变化,理解后序遍历二叉树的执行过程。“可视化数据”窗口显示的数据信息(如下图),包括:
- 后序遍历二叉树时,由二叉树各个节点的值,按照其被访问的先后顺序所组成的后续遍历字符串。
- 二叉树的详细信息。包括:
a) 二叉树节点的值和地址。
b) 已访问过的结点的底色为灰色,并且在该结点中,用白色的字体标出了访问过的序号。
c) 在栈中的结点的底色为绿色。
d) 用红色带箭头的虚线表示出了访问节点的轨迹,在该条虚线的序号表示形成轨迹的先后次序。
e) 游标指向了当前的节点。
- 后序遍历二叉树时所使用的两个栈,一个栈用于存储父节点,另一个栈用于存储父节点入栈的次数。包括了二叉树父节点的地址、值、入栈次数,栈的底色为绿色。
![](./img/11.png)
# 编写源代码并通过验证
**按照下面的步骤继续实验:**
1. 为PostOrder函数编写源代码,要求利用栈实现非递归的后序遍历算法,并生成后序序列字符串。注意,尽量使用已定义的局部变量。
2. 按F7生成项目。如果生成失败,根据“输出”窗口中的提示信息修改源代码中的语法错误。
3. 按Alt+F5启动验证。如果验证失败,可以使用“输出”窗口中的“比较”功能,或者在“非演示模式”下按F5启动调试后重复按F10单步调试读者编写的源代码,从而定位错误的位置,然后回到步骤1。
提示:在验证过程中,主要是检测后序序列字符串生成的是否正确,所以,为了顺利通过验证,请读者在遍历二叉树的同时一定要在全局变量g_string中生成后序序列字符串。
# 教师参考答案
访问教师参考答案[domain relative url](engintime/ds-lab/teachers-packet/Lab011.git)
\ No newline at end of file
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论