精华内容
下载资源
问答
  • 数据结构实训心得
    千次阅读
    2021-05-21 16:39:32

    1 引言

    在最近几天,一直再用c语言来进行数据结构的实训,实训的内容是用一个多叉树来实现家谱图.在之前大一学习数据结构和这学期的数据结构课上的时候,只是单纯地学了学它的实现原理和算法,没有注重具体的代码实现.这对于学习计算机这类课程来说,是一种错误的方式.因为计算机一类的课程,本来就是很注重实践的.没有自己亲自动脑思考过写过,你说你学过数据结构,完全不现实.而且让你自己也觉得不踏实.

    2 过程

    在实训的过程中,因为学习过c++和java,渐渐的抛弃之前用c语言那样完全按照流程式的方式来完成方法功能,想想确实是不明智的.在高耦合状态下的代码,要是修改起来,可能会将整个方法重写,浪费时间.如果按照面向对象一类语言的方式来考虑写法,你就完全不会想刚学完c语言的人写的代码一样,按照功能来划分,按需返回.

    另一方面,在实训过程中,结构体的定义方面也有不少考虑的地方,对于这次的实训,我是将配偶节点和孩子节点放到了一块:

    typedef struct TreeNode

    {

    int Num; // 孩子数目

    char Name[20];// 名字

    char Sex; // 性别 男M女F

    struct TreeNode * NextNode[20]; //(孩子节点)

    struct TreeNode * Parent; // 祖先节点

    }TreeNode;

    其实刚开始没有这么想,因为按照一般的思路,肯定是将配偶节点类似于父母节点一样单独拿出来.但是这样的话,会在结构体又多出一个指针.不烦如此,在表示当前节点和配偶节点的孩子节点的时候,两个节点你都要进行关联,这杨做会让你有种很错乱的感觉.如果像这样将配偶节点放到孩子节点里面,作为孩子节点集合的第一个.在表示于孩子节点之间的关系的时候,尤其是通过配偶节点来查询和显示孩子节点的时候,我们可以通过查询的配偶节点的配偶(这样说可能有点绕口,见下图).这样做之前要注意的是,在树中配偶节点的创建时,别忘了将配偶节点也反向绑定在当前节点上,不然遍历和查询的时候会出错.

    举例:通过儿媳一节点查询孙子一节点就要通过儿子一节点来.

    56426cf8fe31b534bf9be765f3098bbd.png

    3 心得总结

    其实,在用代码写一个具体的东西的时候,不能是像当初学习时的那种心态–只是实现当前功能明白原理就可以的,必须自己新身经历一遍,具体细节思考,亲自动手写写.可以先从常规思路出发,期间不断寻求更加快捷高效的方式来改进.还有不管用的是面向对象的语言还是面向过程的语言,在考虑问题的大方向上是一致的,要根据具体语言的特点来对应进行变换.将代码的功能尽量细分,按照功能来区分.类比于面向借口的思想.在完成整个系统的框架之后,按功能来一步步实现.以上就是在实训过程中的体会.

    更多相关内容
  • 1.学生管理系统 2.数据的传输 3.药品销售统计问题 4.医院选址问题 5.数据的传输 (可能因能力问题有部分bug哦,介意勿扰)
  • 在网上看到许多数据结构实训的题目,内容及要求,和我这个差不多,可以提前看看,练习。
  • 纸牌游戏数据结构实训代码 实训要求 题目十三纸牌游戏 基本要求 一副没有花牌JQ K A大小王的扑克牌两个人进行纸牌游戏其中一 个人为用户另一个人为计算机 每轮每人各发 5 张牌各自以这 5张牌建立二叉排序树 由用户先...
  • 数据结构实训报告

    2022-02-16 19:38:16
    数据结构实训是计算机科学与技术专业集中实践环节之一。数据结构是本专业一门重要的专业基础课程,是一门关键性核心课程。该课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的...

    • 实训目的

    数据结构实训是计算机科学与技术专业集中实践环节之一。数据结构是本专业一门重要的专业基础课程,是一门关键性核心课程。该课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术。该课程将为整个专业的学习以及软件设计水平的提高打下良好的基础。

    数据结构是一门实践性较强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践,设置数据结构实训环节十分重要。

    • 实训项目要求

    本次实训我选择的题目是二叉树的遍历与应用算法设计与实现

    二叉树是树形结构的一个重要类型,许多实际问题抽象出来的数据结构往往是二叉树类型,应用极为广泛。本次课程设计使用二叉链表来建立二叉树的存储结构,利用栈和队列来实现二叉树的中序非递归遍历和层序遍历,并利用递归来实现二叉树的先序、中序、后序遍历。本次设计还实现了计算二叉树中的叶子结点个数、求二叉树的深度、将二叉树中所有结点的左右孩子互换以及判断二叉树是否为完全二叉树等二叉树的应用算法。

    本次设计使用的编程语言是C语言,使用的Microsoft Visual Studio2010编译实现。

    • 实训项目实现
    1. 功能分析:

           

        图1 系统模块结构图

    (1)建立二叉树:利用二叉链表建立二叉树的存储结构。利用链式存储结构来存储一颗二叉树,即用链来指示元素的逻辑关系,二叉树中的每个结点用链表中的一个链结点来存储。

    (2)实现二叉树的层序遍历:利用队列实现二叉树的层序遍历。队列是一种先进先出的存储结构,仅允许在表的前端进行删除操作而在表的后端进行插入操作,利用队列实现二叉树的层序遍历更加简洁和方便。

    (3)实现二叉树递归遍历:利用递归的算法来实现二叉树的先序、中序和后序遍历。

    (4)实现二叉树的中序非递归遍历:利用栈实现二叉树的中序非递归遍历。栈是一种后进先出的存储结构,仅限定在栈顶进行插入和删除操作,可以用栈来实现二叉树的中序非递归遍历。

    (5)实现二叉树的应用:二叉树在一些搜索引擎和路由器中应用广泛,这些应用都要用到二叉树的最基本的应用算法:计算二叉树的叶子结点个数、求二叉树的深度、将二叉树中所有结点的左右孩子互换以及判断二叉树是否为完全二叉树。

    (6)菜单功能:对二叉树的各种遍历和应用进行选择。

    (7)显示功能:将二叉树的遍历和应用结果显示出来。

    (8)退出功能:退出整个程序,结束运行。

    2、数据结构分析

    (1)顺序表是一种静态存储结构,需要预先知道数据大小来申请连续的存储空间,而且进行扩充时需要进行数据的搬迁。相对于顺序表,链表结构可以充分利用计算机的内存空间,实现灵活的内存动态管理且进行数据扩充是不需要数据的搬迁。在实际应用中,虽然顺序表的存取速度更高效,但是在一些搜素引擎中的大部分数据都是需要经常进行更新的,因此对于开发人员来说使用链表的删除和插入操作更有利于对引擎中的数据进行更新,动态分配存储空间,避免进行数据的搬迁。

    通过上述分析,我选择二叉链表存储结构,存储结构如下:

    typedef int Status;

    typedef char TElemType; //二叉树结点的值的类型

    typedef struct BiTNode {

    TElemType data;//二叉树的结点值

    struct BiTNode *lchild, *rchild; //左右孩子指针

    }BiTNode, *BiTree;  //定义二叉树的存储类型

    (2)在进行二叉树的层序遍历时,利用了队列的存储结构。

    (3)在二叉树的中序非递归遍历中利用了栈的顺序存储结构。

    (4)在二叉树的遍历与应用算法设计与实现中,所有的递归遍历、非递归遍历以及二叉树的应用算法都使用的是同一颗二叉树,即整个程序中只创建了一次二叉树的存储结构,为了方便用户对二叉树的各种算法进行选择,加入了菜单功能,主要算法如下:

    printf("请输入数字1-9或者0结束程序:\n");

    scanf("%d",&n);

    switch(n){

        case 1:

               ……

    case 0: exit(0);

    break;

    }

    (5)显示功能,将程序的运行结果输出。

    //输出遍历的结点的存储数据值

    void PrintElement(TElemType e) {

    printf("%c", e);

    }

    3、关键算法

      二叉树的遍历:首先利用二叉链表先序建立二叉树的存储结构,输入一颗二叉树,利用菜单功能依次选择调用PreOrder函数、InOrder函数、PostOrder函数实现二叉树的先序、中序、后序递归遍历,调用LevelOrderTraversal函数利用队列实现二叉树的层序遍历,调用InOrderTraverse函数利用栈实现二叉树的中序非递归遍历。

    二叉树的应用算法:构造函数实现二叉树的各种应用算法,再通过调用函数的方式计算一颗二叉树的叶子结点的个数、求二叉树的深度、将二叉树的左右孩子互换、判断二叉树是否为完全二叉树

    (1)利用二叉链表先序建立二叉树的存储结构。算法流程图如图2所示。

    (2)二叉树的先序、中序、后序递归遍历。算法流程图如下图3所示。

    (3)二叉树的层序遍历。算法流程图如下图4所示。

    (4)二叉树的中序非递归遍历。算法流程如图5所示。

    (5)二叉树的应用算法—计算叶子结点的个数。算法流程图如图6所示。

    (6)二叉树的应用算法—求二叉树的深度。算法流程如图7所示。

    算法描述:

    输入一颗二叉树,如果有#则二叉树的结点为空,如果没有#则建立根节点,再依次递归调用当前函数构造左子树和右子树。

     

    算法描述:

    利用队列层序遍历二叉树,首先初始化队列让根节点进队,判断队列是否为空,若不为空则让根节点出队并输出根结点值,依次让左右孩子进队再次进入循环并依次输出结点值。

    算法描述:

    初始化栈,构建一个新的指针P,栈不为空,判断指针不为空则进栈,指针指向左孩子,所有的左孩子进栈。如果指针为空则栈内所有元素出站栈,指针再指向根节点的右孩子,重复上述过程,中序非递归遍历二叉树。

    算法描述:

    判断指针是否为空,若为空则程序结束,若不为空,如果左右孩子都不为空,执行count++,指针指向左孩子递归调用本函数,指针指向右孩子递归调用本函数。返回count的值。

    算法描述:

    定义int类型a、b两个元素,如果指针为空则返回0,如果左右孩子指针都为空则返回1,指针指向左孩子递归调用本函数,指针指向右孩子递归调用本函数。如果a>b输出1+a,如果a<b输出1+b,结束。

    4、运行测试

    1. 运行程序,先序输入一颗二叉树:ABC####。注意在先序输入二叉树时一定要把左右孩子为空的情况考虑到,用“#”来代表空。

      出现的问题1:若直接输入ABC,则程序运行过程中发生错误导致程序中断。

       

      解决方法:输入ABC####。

     

    1. 出现的问题2:字符#和字母ABC不能分开写,否则程序中断,将会一直处于输入状态,无法正常运行。

       

      解决方法:连续且正确的输入ABC####

      1. 进入菜单模式,选择输入1—9或者数字0。注意在菜单中加入新的代码时要记得吧菜单的数字编号也改了。避免数字对应的算法不一,导致错误的发生。

       

      1. 输入数字1,先序遍历二叉树。

       

      1. 输入数字2,中序遍历二叉树。

       

      1. 输入数字3,后序遍历二叉树。

       

      1. 输入数字4,非递归中序遍历二叉树。  

      1. 输入数字5,层序遍历二叉树。

      1. 输入数字6,计算叶子结点的个数。

      1. 输入数字7,计算二叉树的深度。

       

      1. 输入数字8,交换二叉树的左右孩子并输出先序遍历序列。

      1. 输入数字9,判断二叉树是否为完全二叉树,若为完全二叉树则输出1,否则输出0。

       

      1. 输入数字0,退出程序,结束运行。

       

      四、实训总结

      经过本次实训,对于上机操作有了更加深入的了解和认识。实践和理论知识相比还是有很大的难度的,实训考察的不仅仅是我们的理论知识,更多的是考察我们处理问题的能力和对理论知识的应用能力。丰富的理论知识并不能保证我们能顺利的应用到实践中去,当然,如果我们没有理论知识依然无法实践。实训过程中,我遇到的问题更多的是一些硬件问题,对计算机没有熟悉的认识,不能在电脑出问题时冷静的处理问题。对于实训报告,最大的问题就是我不能熟悉的在电脑上画出流程图。这些问题都充分的说明了无论我们的专业是什么,我们都要全方位的发展,不断充实和完善自己。

      此次实训让我认识到了我的很多不足知识之处,也让我对于我的职业生涯规划有了更加清晰的认识。对于计算机这个专业,我有足够的热爱,无论将来会遇到多大的困难,我都要坚持自己的初心,保持良好的心态。今后,我会更加认真的学习理论知识,多进行上机操作,保持一颗向上的心,不断充实自己。

      数据结构是一门相当有意思的学科,只要用心就能领悟其中的精华,这是我大学期间的数据结构实训报告,很开心能拿下90+班级第一的好成绩,当然它也耗费了我许多的心血,熬夜掉头发对于现在依然热爱IT行业的我来说仍是家常便饭,但是我不会忘记的初心。大家一起加油吧,哦耶!!!

      仅供参考,千万不要抄袭哦哦哦!

    展开全文
  • 数据结构实训范文数据结构实习报告 数据结构实习报告规范 实习报告的开头应给出题目班级姓名学号和完成日期并包括以下七个内容 1需求分析 以无歧义的陈述说明程序设计的任务强调的是程序要做什么明确规定 1输入的...
  • 题目一停车场模拟程序 题目二杂货店排队模拟程序 如果有朋友正在排队则可以插队 题目三哈希表存储的电话号码查询 基本要求 设每个记录有以下数据项用户名电话地址 从键盘输入各记录以电话号码为关键字建立哈希表 ...
  • 数据结构实训选题数数据结构实训选题据结构实训选题数据结构实训选题数据结构实训选题
  • 数据结构实训报告舞伴配对实训
  • 数据结构实训

    2012-08-25 17:22:43
    冒泡 快排 数据结构淘汰游戏 等 反正都是自己写的
  • c++数据结构实训 病人就诊系统 本系统主要实现对病人就医进行管理。程序流程如下: 系统按照优先级和病历号进行排队,优先级高的排一个队,优先级低的排一个队,同等优先级则是先排队先就诊。只有优先级高的病人...
  • 数据结构实训总结(900字) 这次课程设计的心得体会通过实习我的收获如下1巩固和加深了对数据结构的理解提高综合运用本课程所学知识的能力2培养了我选用参考书查阅手册及文献资料的能力培养独立思考深入研究分析问题...
  • 数据结构实训报告.doc

    2022-03-27 18:35:38
    数据结构实训报告
  • 自己花了好多精力写的,包括详细的注释还有代码
  • 数据结构实训》教学大纲 专业核心课程 数据结构(Data Structure)
  • 08电信数据结构实训指导书.doc
  • 个人账簿管理系统记录某人每月的全部收入及各项开支情况,包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等。进入系统后可以输入和修改某月的收支情况,可以对每月的开支从小到大进行排序,可以根据输入的...
  • 迪杰斯特拉算法计算城市与城市间时间最短,距离最短的路线,并用百度地图进行可视化
  • 数据结构实习,数据结构实训,C,C++源码.rar
  • 数据结构实习,数据结构实训,C,C++源码.zip
  • 数据结构用c语言实现停车场的功能,在机房32位电脑Linux下完成
  • 数据结构实验报告 PAGE PAGE 15 实验一 线性表 实验要求 掌握数据结构中线性表的基本概念 熟练掌握线性表的基本操作创建插入删除查找输出求长度及合并并运算在顺序存储结构上的实验 熟练掌握链表的各种操作和应用 ...
  • 15 个题目同一个班上做同一个题目的人数最多 3 个每人必须独立完成 题目一停车场模拟程序 题目二杂货店排队模拟程序 如果有朋友正在排队则可以插队 题目三哈希表存储的电话号码查询 基本要求 设每个记录有以下数据项...
  • 数据结构实训学生分配问题.doc
  • 这次的程序设计主要是校园导游系统,可以查看校园全景图,可以查看景点的信息,道路也分为人行道和车行道,还可以查找两景点间的最短路径和所有路径,还可以根据想去看的所有景点推荐一个最佳路径。...
  • 数据结构实训-学生分配问题.doc

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,600
精华内容 17,840
关键字:

数据结构实训

数据结构 订阅
友情链接: DM6467_RS485_R.rar