报告汇总之c语言数据结构报告篇(三)
家谱的查找
代码区
#include <stdio.h>
#include <stdlib.h>
//创建一个二叉链
typedef struct node
{
char data;
struct node* lchild;
struct node* rchild;
}tn;
//获取二叉树结构
void get (char s[100])
{
printf("请以括号表达法输入二叉树结构:");
scanf("%s",s);
}
//构建二叉树
tn* CreatBTnode (tn*b,char s[100])
{
tn*st[100],*p;
b=NULL;
int top=-1,j=0,k=0;
while (s[j]!='\0')
{
if (s[j]=='(')
{
top++;
st[top]=p;
k=1;
}
else if (s[j]==')')
{
top--;
}
else if (s[j]==',')
{
k=2;
}
else
{
p=(tn*)malloc(sizeof(tn));
p->data=s[j];
p->rchild=p->lchild=NULL;
if (b==NULL)
b=p;
else if (k==1)
st[top]->lchild=p;
else
st[top]->rchild=p;
}
j++;
}
return b;
}
//后序递归遍历二叉树
void PostOrder (tn*b)
{
if (b!=NULL)
{
PostOrder(b->lchild);
PostOrder(b->rchild);
printf("%c",b->data);
}
}
//先序非递归遍历二叉树
void PreOrder (tn*b)
{
printf("先序遍历非递归算法输出:");
tn*a[100],*p;
int i=-1;
if (b!=NULL)
{
i++;
a[i]=b;
while (i>-1)
{
p=a[i];
i--;
printf("%c",p->data);
if (p->rchild!=NULL)
{
i++;
a[i]=p->rchild;
}
if (p->lchild!=NULL)
{
i++;
a[i]=p->lchild;
}
}
printf("\n");
}
}
//查找所有长辈
void findfather (tn*b)
{
getchar();
printf("请输入指定人物代号,以查询其所有长辈:");
char c;
scanf("%c",&c);
printf("%c的所有长辈为:",c);
tn*a[100],*p;
if (b!=NULL)
{
int i=0;
a[i]=b;
p=b;
while (p->data!=c)
{
i++;
a[i]=p->lchild;
p=a[i];
if (p->lchild==NULL&&p->data!=c)
{
printf("您输入的指令有误\n");
break;
}
}
i=i-1;
while (i>=0)
{
p=a[i];
printf("%c",p->data);
while (p->rchild!=NULL)
{
p=p->rchild;
printf("%c",p->data);
}
i--;
}
}
printf("\n");
}
int main()
{
tn*b;
b=(tn*)malloc(sizeof(tn));
char s[100];
get(s);
b=CreatBTnode(b, s);
PreOrder(b);
printf("后序遍历递归算法输出:");
PostOrder(b);
printf("\n");
findfather(b);
return 0;
}
报告区
第一部分:实验分析与设计(可加页)
一、 实验内容描述(问题域描述)
采用一棵二叉树来表示一个家谱关系,一个家谱可表示为一颗树,首先将其转换成一颗二叉树表示,如下图为红楼梦家谱的一部分:
图1.1 家谱的树形表示 图1.2 家谱的二叉树表示
要求完成的功能如下:
(1) 输入一颗二叉树的括号表示法,完成树的构建
(2) 使用后序遍历递归算法遍历二叉树并输出
(3) 使用先序遍历非递归算法遍历二叉树并输出
(4) 指定家谱中的某一成员,输出其所有长辈
二、 实验基本原理与设计(数据结构设计与算法设计)
数据结构设计:利用链式结构存储树的信息;利用栈辅助创建二叉树
算法设计:
输入一颗二叉树的括号表示法,完成树的构建
(1):创建二叉树的时候碰到‘(’就指向左子树;碰到‘,’就指向右子树。
(2):再将数据输入到指定的树中;循环操作完成二叉树的创建
使用后序遍历递归算法遍历二叉树并输出
(1):利用递归先后序遍历根的左子树
(2):利用递归再后序遍历根的右子树
(3):将遍历出的结果依次输出
使用先序遍历非递归算法遍历二叉树并输出
(1):在非递归遍历的时候需要先创建一个栈来辅助运算
(2):将根节点进栈
(3):将栈顶元素出栈并用p指向该元素
(4):将p指向的元素的右子树压入栈中;将栈顶元素的左子树压于栈中
(5):重复(3)(4)步直到栈为空
指定家谱中的某一成员,输出其所有长辈
(1):通过遍历查找到该成员,并将查找过程中经过的元素压入辅助栈中
(2):将栈中的元素及其右子树全部输出
三、主要仪器设备及耗材
1.PC机
2.开发环境(比如:VC,Eclipse)
X-code
第二部分:实验调试与结果分析(可加页)
一、 调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
1.调试方法描述
① 输入c程序,并保存;
② 编译c程序,找出程序的语法错误并改正;
③ 输入测试数据,运行c程序;
④ 若有错利用断点一步步运行查错
⑤ 重复②-④步,直到得到正确的运行结果。
2.实验输入/输出数据记录
3.实验过程发现的问题
在先序非递归遍历的过程中;如果先将左子树压入栈中结果会完全不同;后来经过分析问题;发现要好好利用栈的存储特性解决问题,这样让问题变得更加简单;
在查找指定孩子的所有长辈的时候我觉得还是有一些bug;改进过后bug变少;但是我觉得还是存在一些,对其进行测试暂时未发现问题;
在使用指针时要注意越界的情况;
二、 实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
1.结果描述
建立二叉树,遍历二叉树,查找二叉树的过程均正确;结果准确
2.实验现象分析
可以通过遍历两次来完成对指定元素的查找,第一次遍历对整个二叉树进行赋值操作和查找指定元素,第二次遍历进行比较和输出,通过利用栈来比较辈分的大小
3.影响因素讨论
二叉树的结构的定义会影响输出结果;可能会让输出长辈的代码出现bug
4.算法分析(包括时间和空间)
T(n)=O(n2)
S(n)=O(n)
5.结论
满足题目所要求的所有要求,输出结果均正确
三、 实验小结、建议及体会
这一次的实验涉及到二叉树的运用并且混合栈的基本操作,让我对两个数据结构的知识有了更进一步的理解,这次实验我熟悉了很多树和栈的基本知识,学到了很多。学习C语音需要有很大的耐心与毅力,对我们的身体的脑力都是一项很大的挑战。敲了快整整一 周的代码,虽然很累,很烦琐,偶尔还会 被题目难倒,压力山大。可当自己将题目一题一题的解决时,心中更多的是成就感,多了一分慰藉。在接下来的日子里,要更加努力好好学专业基础,稳固提升。在课余时间更加注重劳逸结合,多运动,多锻炼,这样学习更有效率。希望在以后的学习中能够更进一步掌握这些内容。