上海应用技术学院-数据结构与算法-课程设计报告.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《上海应用技术学院-数据结构与算法-课程设计报告.doc》由会员分享,可在线阅读,更多相关《上海应用技术学院-数据结构与算法-课程设计报告.doc(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、上海应用技术学院数据结构与算法课程设计报告院 系: *学院 专 业: * 班 级: 091*11 姓 名: 公孙胜天 学 号: 091* 指导老师: 何* 一、 课程设计目的培养学生用学到的书本知识解决实际问题的能力;培养实际工作所需要的动手能力;培养学生以科学理论和工程上能力的技术,规范地开发大型、复杂、高质量的应用软件和系统软件具有关键性作用;通过课程设计的实践,学生可以在程序设计方法、上机操作等基本技能和科学作风方面受到比较系统和严格的训练。二、 课程设计要求1)学生必须仔细阅读数据结构与算法课程设计方案,认真主动完成课程设计的要求。有问题及时主动通过各种方式与教师联系沟通。2)学生要发
2、挥自主学习能力,充分利用时间,安排好课程设计的时间计划,并在课程设计过程中不断检测自己的计划完成情况,及时向教师汇报。3)课程设计按照教学计划需要两周时间完成,两周中每天至少要上六小时的上机来调试C或C+语言设计的程序,总共至少要上机调试程序30小时。属教师安排上机时间学生不得缺席。三、 课程设计内容1、 建立二叉树,层序、先序、中序、后序遍历( 用递归或非递归的方法都可以)*任务:要求能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列;分别建立二叉树存储结构的的输入函数、输出层序遍历序列的函数、输出先序遍历序列的函数、输出中序遍历序列的函数、输出后序遍历序列的函数; 2、 各种排序任务
3、:用程序实现插入法排序、选择法排序、起泡法改进算法排序;利用插入排序、选择法排序和冒泡法的改进算法,将用户随机输入的一列数按递增的顺序排好。输入的数据形式为任何一个正整数,大小不限。输出的形式:数字大小逐个递增的数列。四、 课程设计细节(一)第一题设计:a)需求分析:本程序是用链式存储结构来存储二叉树并进行一系列的算法,且结点内容的数据类型为字符型。本程序用C-Free 5编写,可以实现各种二叉树的遍历。包括层序遍历、先序遍历、中序遍历、后序遍历的非递归算法。根据题目知,程序主要是根据给定二叉树的四种遍历结果:(1)先创建二叉树:按括号表示法输入二叉树字符串,然后构造二叉链表表示的二叉树。(2
4、)设计算法:层序遍历、先序遍历、中序遍历、后序遍历. 在做到层序遍历时,应注意算法如下:根结点入队,队头元素出队,左孩子不为空入队右孩子不为空入队的顺序进行。(3)设计main()函数调用以上步骤实现相关功能。根据题目要求,我们主要设计了以下几个函数:(1)typedef struct node定义一个用链式存储结构存储的二叉树,其中包括左孩子和右孩子以及数据元素的内容。和单链表类似,一个二叉链表由头指针唯一确定,若二叉树为空,则头指针指向空。并且结点内容的数据类型为字符型。(2)BTNode *CreateBTNode(BTNode *&b)此函数的功能是构建二叉树。从键盘上按括号表示法输入
5、二叉树字符串构造二叉链表表示的二叉树T。(3)void LevelOrder(BTNode *b)此函数的功能是用非递归的方法实现二叉树的层序遍历算法。调用此函数可以获得二叉树的非递归的中序遍历的结果。(4)void PreOrder(BTNode *b) 此函数的功能是用非递归的方法实现二叉树的先序遍历算法。调用此函数可以获得二叉树的非递归的先序遍历的结果。(5)void InOrder(BTNode *b)此函数的功能是用非递归的方法实现二叉树的中序遍历算法。调用此函数可以获得二叉树的非递归的中序遍历的结果。(6)void PostOrder(BTNode *b)此函数的功能是用非递归的方
6、法实现二叉树的后序遍历算法。调用此函数可以获得二叉树的非递归的后序遍历的结果。(7)void DispBTNode(BTNode *b)此函数的功能是先序输出二叉树字符串。b)概要设计:我们的算法设计如下:一、 非递归遍历算法用指针数组stack代替栈,添加一个top来表示进栈出栈的操作,同时还可以判断stack是否为空。1、 先序遍历 每次将节点压入栈,然后弹出,压右子树,再压入左子树,在遍历过程中,遍历序列的右节点依次被存入栈,左节点逐次被访问。2、 中序遍历先寻找最左边的树叶输出(寻找过程中每个根节点都要入栈),然后依次出栈,判断根节点的右孩子是否有左孩子(即每次都要寻找每个根的最左孩子
7、)知道top=-1,即栈空。3、 后序遍历设置一标志,以判断节点是否访问过。先寻找最左边的树叶,但不输出(寻找过程中每个根节点都要入栈)取栈顶元素,判断其有没有右孩子,没有的话则输出,有的话则还要继续判断其有没有左孩子。知道栈为空。二、 非递归层次遍历算法访问元素所指结点,若该元素所指结点的左右孩子结点非空,则该元素所指结点的左孩子指针和右孩子指针顺序入队。根绝题目要求我们设计main函数流程图为:先定义二叉树,用链式存储结构存储二叉树。其中,Lchild和Rchild是分别指向该结点左孩子和右孩子的指针,data是数据元素的内容。定义二叉树结点值的类型为字符型且结点个数不超过20个。定义好二
8、叉树后,创建二叉链表存储的二叉树。按二叉树带空指针的先序次序输入结点值,结点类型为字符型。按先序次序输入,其中*表示空结点。算法是按照先序遍历思想设计的。构造二叉链表表示的二叉树T,星号表示空树。其中mark的值1、2、3、4分别指stri为字母、(、,、);tag为左、右孩子的标志。建立二叉树的流程图如下:b=null检查str10(),mark=1;b-data=str0,b-lchild=b-rchild=null;p=b;str0是否为字母YNNmark=2?mark=2stri入栈tag=0mark=3?mark=3tag=1Nmark=4pop为空return bNYY)mark=
9、1&栈不空新建结点pp-data=stri p-lchild=p-rchild=nulltag=0?循环结束后return b栈顶-rchild=p栈顶-lchild=pYN二叉树的非递归先序遍历流程图如下:初始化队列,b入队栈非空出栈p;打印p-dataYp-lchild!=nullYp-lchild入栈p-lchild!=nullNYNp-rchild入栈结束N二叉树的层次遍历流程图如下:初始化队列,b入队队列非空出队p;打印p-dataYp-lchild!=nullYp-lchild入队p-lchild!=nullNYNp-rchild入队结束Nc)详细设计:本题的源程序如下:myBTr
10、ee.cpp:/*copyright:孤独的野狼 *版权所有,请勿侵权 *文件名:myBtree.cpp *日期:2012/6/25 */ #include #include #include #define MaxSize 100typedef char ElemType;typedef struct nodeElemType data;/*数据元素*/struct node *lchild;/*指向左孩子*/struct node *rchild;/*指向右孩子*/ BTNode;BTNode *CreateBTNode(BTNode *&b)/*外部输入建立创建二叉链*/BTNode *
11、StMaxSize,*p=NULL;char ch,str300;int top=-1,k,j=0; scanf(%s,str);b=NULL;/*建立的二叉树初始时为空*/ch=strj;while (ch!=0)/*str未扫描完时循环*/ switch(ch) case (:top+;Sttop=p;k=1; break;/*为左结点*/case ):top-;break;case ,:k=2; break; /*为右结点*/default:p=(BTNode *)malloc(sizeof(BTNode);p-data=ch;p-lchild=p-rchild=NULL; if (b=
12、NULL) /*p指向二叉树的根结点*/b=p;else /*已建立二叉树根结点*/switch(k) case 1:Sttop-lchild=p;break;case 2:Sttop-rchild=p;break;j+;ch=strj;return b;void DispBTNode(BTNode *b) /*二叉树输出函数*/if (b!=NULL)printf(%c,b-data);if (b-lchild!=NULL | b-rchild!=NULL)printf();/*有孩子结点时才输出(*/DispBTNode(b-lchild);/*递归处理左子树*/if (b-rchild!
13、=NULL) printf(,);/*有右孩子结点时才输出,*/DispBTNode(b-rchild);/*递归处理右子树*/printf();/*有孩子结点时才输出)*/void LevelOrder(BTNode *b) /*层次遍历算法*/BTNode *p;BTNode *quMaxSize;/*定义环形队列,存放结点指针*/int front,rear;/*定义队头和队尾指针*/front=rear=-1;/*置队列为空队列*/rear+;qurear=b;/*根结点指针进入队列*/while (front!=rear)/*队列不为空*/front=(front+1)%MaxSiz
14、e;p=qufront;/*队头出队列*/printf(%c ,p-data);/*访问结点*/if (p-lchild!=NULL)/*有左孩子时将其进队*/rear=(rear+1)%MaxSize;qurear=p-lchild;if (p-rchild!=NULL)/*有右孩子时将其进队*/rear=(rear+1)%MaxSize;qurear=p-rchild; void PreOrder(BTNode *b)/*先序非递归遍历算法*/BTNode *p;struct BTNode *pt;int tag; StMaxSize;int top=-1;top+;Sttop.pt=b;
15、Sttop.tag=1;while (top-1)/*栈不空时循环*/if (Sttop.tag=1)/*不能直接访问的情况*/p=Sttop.pt;top-;if (p!=NULL)/*(2)式*/top+;/*右孩子结点进栈*/Sttop.pt=p-rchild;Sttop.tag=1;top+;/*左孩子结点进栈*/Sttop.pt=p-lchild;Sttop.tag=1;top+;/*根结点进栈*/Sttop.pt=p;Sttop.tag=0;if (Sttop.tag=0)/*直接访问的情况*/printf(%c ,Sttop.pt-data);top-; /*while*/voi
16、d InOrder(BTNode *b)/*中序非递归遍历算法*/BTNode *p;struct BTNode *pt;int tag; StMaxSize;int top=-1;top+;Sttop.pt=b;Sttop.tag=1;while (top-1)/*栈不空时循环*/if (Sttop.tag=1)/*不能直接访问的情况*/p=Sttop.pt;top-;if (p!=NULL)top+;/*右孩子结点进栈*/Sttop.pt=p-rchild;Sttop.tag=1;top+;/*根结点进栈*/Sttop.pt=p;Sttop.tag=0;top+;/*左孩子结点进栈*/St
17、top.pt=p-lchild;Sttop.tag=1;if (Sttop.tag=0)/*直接访问的情况*/printf(%c ,Sttop.pt-data);top-; /*while*/void PostOrder(BTNode *b)/*后序非递归遍历算法*/BTNode *p;struct BTNode *pt;int tag; StMaxSize;int top=-1;top+;Sttop.pt=b;Sttop.tag=1;while (top-1)/*栈不空时循环*/if (Sttop.tag=1)/*不能直接访问的情况*/p=Sttop.pt;top-;if (p!=NULL)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 上海 应用 技术学院 数据结构 算法 课程设计 报告
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内