报告汇总之c语言数据结构报告篇(三)基于二叉树的家谱系统

报告汇总之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语音需要有很大的耐心与毅力,对我们的身体的脑力都是一项很大的挑战。敲了快整整一 周的代码,虽然很累,很烦琐,偶尔还会 被题目难倒,压力山大。可当自己将题目一题一题的解决时,心中更多的是成就感,多了一分慰藉。在接下来的日子里,要更加努力好好学专业基础,稳固提升。在课余时间更加注重劳逸结合,多运动,多锻炼,这样学习更有效率。希望在以后的学习中能够更进一步掌握这些内容。

发布了10 篇原创文章 · 获赞 9 · 访问量 241

猜你喜欢

转载自blog.csdn.net/qq_45621040/article/details/104112830
今日推荐