数据结构课程设计说明书树的应用树和二叉树的转换_第1页
数据结构课程设计说明书树的应用树和二叉树的转换_第2页
数据结构课程设计说明书树的应用树和二叉树的转换_第3页
数据结构课程设计说明书树的应用树和二叉树的转换_第4页
数据结构课程设计说明书树的应用树和二叉树的转换_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、中北大学数据结构与算法课程设计说 明 书学院、系:软件学院专业:软件工程班级:1314010xxx学生姓名:学 号: 1314010xxx设计题目:树的应用起迄日期 :2015 年 1 月 12 日- 2015年1月29日指导教师 :尹四清.2015 年1月29 日一、需求分析1. 设计内容及设计要求A. 设计内容:( 1)建立一棵树;( 2)将树转换成二叉树;( 3)实现二叉树的前序、中序、后序的递归和非递归遍历算法。B. 设计要求:(1) 符合课题要求,实现相应功能;(2) 要求界面友好美观,操作方便易行;(3) 注意程序的实用性、安全性;2. 本演示程序中,元素为单个字符,以空格表示空树

2、 ( 即结点为空 ) ,以回车符作为输入结束标志,树采用孩子兄弟表示法,二叉树采用二叉链表表示法。在真实的运行过程中,由用户手动输入待创建树的含有空格的先根次序序列, 并按回车结束, 程序会将其转化为其对应的二叉树,然后对二叉树进行先序、中序、后序的递归及非递归遍历以及层序遍历,然后显示转化后二叉树的高度和总结点数,以验证所创建的二叉树是否正确,最后,销毁创建的树和二叉树,程序结束。3. 演示程序以用户和计算机对话方式执行,即在计算机终端(屏幕)上显示“提示信息”之后,由用户在键盘上输入演示程序规定的运算命令,相应的输入数据和运算结果显示在其后。4. 为了美观,程序的输出结果采用了分块显示的模

3、式,由虚线及标题隔开,便于用户检查和验证。5. 测试数据如图,给出一棵树,若屏幕上显示如下信息:->请按树的先根次序输入序列,如有空子树,用空格填充,完成后输入回车确认此时,你应当输入:(表示回车确认)ABEF CDGHIJK提示:为方便确认输入了几个空格,用星号* 表示输入序列中的空格,则序列如下ABE*F*C*DGHI*J*K*(不是真实的输入序列,供计算需输入空格个数时用)这时,建好的树的先根和后根次序序列如下:.树的先根序列ABEFCDGHIJK树的后根序列EFBCIJKHGDA由树和二叉树的转换关系知,二叉树的先序和中序遍历所得序列分别与树的先根和后根遍历所得序列相同,据此验证

4、转化是否正确。二叉树的先序和中序遍历序列如下:二叉树先序序列ABEFCDGHIJK二叉树中序序列EFBCIJKHGDA二、概要设计为了实现上述程序功能,树采用孩子兄弟表示法,二叉树采用二叉链表表示法。为此,需要两个抽象数据类型,树和二叉树的抽象数据类型。1. 树的抽象数据类型定义ADT Tree数据对象D: D 是具有相同特性的数据元素的集合。数据关系R:若 D为空集,则称为空树;若 D仅含有一个数据元素,则R为空集,否则R=H , H是如下二元关系:(1)在 D 中存在唯一的称为根的数据元素root ,它在关系 H 下无前驱;(2)若 D-root ,则存在 D-root 的一个划分 D1,

5、D2,D3, ,Dm(m>0),对于任意 j k(1 j,k m)有 Dj Dk= , 且对任意的 i(1 i m),唯一存在数据元素xi Di 有 <root,xi> H;(3)对应于 D-root的划分, H-<root,xi>, ,<root,xm> 有唯一的一个划分H1, H2, , ,Hm(m>0),对任意 j k(1 j,k m)有 Hj Hk=,且对任意 i(1 i m),Hi 是 Di 上的二元关系, (Di,Hi)是一棵符合本定义的树,称为根 root 的子树。基本操作P:InitTree(&T);操作结果:构造空树T。

6、DestroyTree(&T);初始条件:树T 存在。操作结果:销毁树T。CreateTree(&T,definition);初始条件: definition给出树 T 的定义。.操作结果:按definition构造树 T。ClearTree(&T);初始条件:树T 存在。操作结果:将树T 清为空树。TreeEmpty(T);初始条件:树T 存在。操作结果:若T 为空树,则返回TRUE,否则返回FALSE。TreeDepth(T);初始条件:树T 存在。操作结果:返回的深度。Root(T);初始条件:树T 存在。操作结果:返回T 的根。Value(T,cur_e);初始

7、条件:树T 存在, cur_e 是 T 中某个结点。操作结果:返回cur_e 的值。Assign(T,cur_e,value);初始条件:树T 存在, cur_e 是 T 中某个结点。操作结果:结点cur_e 赋值为 value 。Parent(T,cur_e);初始条件:树T 存在, cur_e 是 T 中某个结点。操作结果:若cur_e 是 T 的非根结点,则返回它的双亲,否则函数值为“空”。LeftChild(T,cur_e);初始条件:树T 存在, cur_e 是 T 中某个结点。操作结果:若cur_e 是 T 的非叶子结点,则返回它的最左孩子,否则返回“空”。RightSibling

8、(T,cur_e);初始条件:树T 存在, cur_e 是 T 中某个结点。操作结果:若cur_e 有右兄弟,则返回它的右兄弟,否则返回“空”。InsertChild(&T,&p,I,c);初始条件:树存在,指向中某个结点,1 i p 指结点的度,非空树与.不相交。操作结果:插入c 为中指结点的第棵子树。DeleteChild(&T,&p,i);初始条件:树T 存在, p 指向 T 中某个结点, 1 i p 指结点的度。操作结果:删除中所指结点的第棵子树。TraverseTree(T,visit();初始条件:树T 存在, visit是对结点操作的应用函数。操作

9、结果:按某种次序对T 的每个结点调用函数visit() 一次且至多一次。 一旦 visit()失败,则操作失败。ADTTree2. 二叉树的抽象数据类型定义ADT BinaryTree数据对象D: D 是具有相同特性的数据元素的集合。数据关系R:若 D=,则 R=,称 BinaryTree 为空二叉树;若 D,则 R=H , H 是如下二元关系;( 1)在 D 中存在惟一的称为根的数据元素root ,它在关系H下无前驱;( 2)若 D-root,则存在D-root=D1,Dr,且 D1Dr = ;( 3)若 D1,则 D1 中存在惟一的元素x1,<root,x1> H,且存在 D1

10、 上的关系H1 ?H;若Dr,则Dr 中存在惟一的元素xr , <root,xr> H,且存在上的关系Hr ? H;H=<root,x1>,<root,xr>,H1,Hr;( 4) (D1,H1)是一棵符合本定义的二叉树,称为根的左子树;(Dr,Hr)是一棵符合本定义的二叉树,称为根的右子树。基本操作:InitBiTree( &T )操作结果:构造空二叉树T。DestroyBiTree( &T )初始条件:二叉树T 已存在。操作结果:销毁二叉树T。CreateBiTree( &T, definition ).初始条件: definit

11、ion给出二叉树T 的定义。操作结果:按definiton构造二叉树T。ClearBiTree( &T )初始条件:二叉树T 存在。操作结果:将二叉树T 清为空树。BiTreeEmpty( T )初始条件:二叉树T 存在。操作结果:若T 为空二叉树,则返回TRUE,否则返回FALSE。BiTreeDepth( T )初始条件:二叉树T 存在。操作结果:返回T 的深度。Root( T )初始条件:二叉树T 存在。操作结果:返回T 的根。Value( T, e )初始条件:二叉树T 存在, e 是 T 中某个结点。操作结果:返回e 的值。Assign( T, &e, value )

12、初始条件:二叉树T 存在, e 是 T 中某个结点。操作结果:结点e 赋值为 value 。Parent( T, e )初始条件:二叉树T 存在, e 是 T 中某个结点。操作结果:若e 是 T 的非根结点,则返回它的双亲,否则返回“空”。LeftChild( T, e )初始条件:二叉树T 存在, e 是 T 中某个结点。操作结果:返回e 的左孩子。若e 无左孩子,则返回“空”。RightChild( T, e )初始条件:二叉树T 存在, e 是 T 中某个结点。操作结果:返回e 的右孩子。若e 无右孩子,则返回“空”。LeftSibling( T, e ).初始条件:二叉树T 存在, e

13、 是 T 中某个结点。操作结果:返回e 的左兄弟。若e 是 T 的左孩子或无左兄弟,则返回“空”。RightSibling( T, e )初始条件:二叉树T 存在, e 是 T 中某个结点。操作结果:返回e 的右兄弟。若e 是 T 的右孩子或无右兄弟,则返回“空”。InsertChild( T, p, LR, c )初始条件:二叉树T 存在, p 指向 T 中某个结点,LR 为 0 或 1,非空二叉树c 与 T不相交且右子树为空。操作结果:根据LR 为 0 或 1,插入 c 为 T 中 p 所指结点的左或右子树。p 所指结点的原有左或右子树则成为c 的右子树。DeleteChild( T, p

14、, LR )初始条件:二叉树T 存在, p 指向 T 中某个结点, LR 为 0 或 1。操作结果:根据LR 为 0 或 1,删除 T 中 p 所指结点的左或右子树。PreOrderTraverse( T, visit() )初始条件:二叉树T 存在, Visit是对结点操作的应用函数。操作结果:先序遍历T,对每个结点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。InOrderTraverse( T, visit() )初始条件:二叉树T 存在, Visit是对结点操作的应用函数。操作结果:中序遍历T,对每个结点调用函数Visit一次且仅一次。一旦visit()失败,则操

15、作失败。PostOrderTraverse( T, visit() )初始条件:二叉树T 存在, Visit是对结点操作的应用函数。操作结果:后序遍历T,对每个结点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。LevelOrderTraverse( T, visit() )初始条件:二叉树T 存在, Visit是对结点操作的应用函数。操作结果:层次遍历T,对每个结点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。ADT BinaryTree.3. 本程序包括个模块【1】主程序模块先声明一棵树和一棵二叉树,然后输入树的含空格先根次序序列,构建一棵树,然后

16、将其转化为二叉树,并对二叉树进行先序、中序、后序的递归和非递归遍历以及层序遍历,然后输出二叉树的高度和总结点数,最后销毁这两棵树。【2】建立树模块按照树的先根序列创建树。【3】树转化二叉树模块将树转化为二叉树。【4】二叉树的遍历二叉树的先序、中序、后序的递归和非递归遍历以及层序遍历。【5】二叉树的相关信息二叉树的高度和总结点数。【6】销毁树和二叉树模块销毁创建的树和转换出的二叉树。【7】栈和队列的模块供二叉树先序、中序、后序的非递归算法调用各模块之间关系:三、详细设计1. 元素类型、结点类型和指针类型.树的结点元素类型设置为字符型,这样既可以接收字符也可以接受数字。typedef char T

17、ElemType;/树中结点元素类型/-二叉树的二叉链表存储表示-typedef struct BiNodeTElemType data; /数据域 , 存储结点名称struct BiNode *lchild,*rchild;/孩子结点指针BiNode,*BiTree;二叉树的二叉链表表示法示意图:/-树的孩子兄弟表示法-typedef struct CSNodeTElemType data; /数据域 , 存储结点名称struct CSNode *firstchild, *nextsibling; /孩子指针域和兄弟指针域 CSNode, *CSTree;树的孩子兄弟表示法示意图:.2. 构

18、造一般树算法:按照树的先根次序序列构建一棵树:对于这棵树,按照需求分析第1 页的测试数据,用户应当输入(表示回车确认)ABEF CDGHIJK正确输入所需序列后,树的建立完成。Status CreateCSTree(CSTree &CT) /按先根序列构造树/ 按先根次序输入树中结点的值(一个字符),空格字符表示空树,构造二叉链表表示树Tchar ch;ch=getchar();if(ch=' ')CT=NULL;elseif(!(CT=(CSNode *)malloc(sizeof(CSNode)printf("内存分配失败!n");exit(OV

19、ERFLOW);/ifCT->data=ch;/生成根结点CreateCSTree(CT->firstchild);/构建左子树CreateCSTree(CT->nextsibling);/构建右子树/else.return OK;/CreateCSTree3. 转换为二叉树树和二叉树的转换关键在于树的二叉链表与其对应的二叉树的二叉链表是相同的,只是对同一个二叉链表的解释不同,二叉树的数据域存放结点名称,左指针域指向左孩子,右指针域指向右孩子;树的数据域存放结点名称,左指针域指向孩子结点,右指针域指向与该结点相邻的一个兄弟结点。当两者具有相同的存储结构时, 便可以完成转换,转

20、换过程的实质是按照二叉树的定义将二叉链表解释为二叉树的过程。Status ExchangeToBiTree(CSTree &CT,BiTree &T)/ 将一棵用二叉链表表示的树递归地转换为二叉树if(!CT) /树 CT 为空时,二叉树T 为空T=NULL;else/ 若树的对应结点不空,申请内存空间if(!(T=(BiNode *)malloc(sizeof(BiNode)printf("内存分配失败!n");exit(OVERFLOW);/if/ 将树的数据域复制到二叉树对应的数据域T->data=CT->data;/ 若树的孩子域不为空,

21、则用树的孩子域创建二叉树的左子树ExchangeToBiTree(CT->firstchild,T->lchild);/ 若树的兄弟域不为空,则用树的兄弟域创建二叉树的右子树ExchangeToBiTree(CT->nextsibling,T->rchild);/else./ExchangeToBiTree4. 二叉树的遍历二叉树有先序、中序、后序、层序四种遍历方式,而先序、中序、后序遍历又有递归和非递归两种算法,总共有7 个遍历算法。其中,先序、中序、后序非递归遍历算法需要用到栈,层序遍历需要使用队列,队列和栈的相关定义和算法请参考详细设计P21。二叉树先序、中序、后

22、序遍历的区别仅在于访问根结点的时机不同,而层序遍历则是逐层从左到右访问每一个结点。先序遍历二叉树算法的框架是:若二叉树为空,则空操作;否则访问根结点(D) ;先序遍历左子树(L);先序遍历右子树(R) 。中序遍历二叉树算法的框架是:若二叉树为空,则空操作;否则中序遍历左子树(L); 访问根结点(D) ;中序遍历右子树(R) 。后序遍历二叉树算法的框架是:若二叉树为空,则空操作;否则后序遍历左子树(L); 后序遍历右子树(R) ;访问根结点(D) 。虽然访问根结点的时机不同,但是先左后右的规则并没有改变。所有的遍历函数都调用元素访问函数Visit,他们的参数列表中均含有一个函数指针变量Statu

23、s(* Visit)(TElemType),通过主函数向他们传递元素访问函数Visit的函数名,就可以实现按元素访问函数Visit设定格式输出的目的。这样的好处在于当输出格式改变时,只需修改元素访问函数Visit的输出格式而无需更改7 个遍历函数,做到一改全改。以下是所有遍历算法的实现以及元素访问函数Visit:/-元素访问函数Visit-Status PrintElement(TElemType e) /输出元素e 的值printf(" %c ",e); /元素类型设定为字符型return OK;/PrintElement/-递归算法 -Status PreOrderTr

24、averse(BiTree T,Status(* Visit)(TElemType) /先序遍历递归算法./ 采用二叉链表存储结构, Visit 是对数据元素操作的应用函数/ 先序遍历二叉树T 的递归算法,对每个数据元素调用函数Visitif(T)if(Visit(T->data) /访问根结点if(PreOrderTraverse(T->lchild,Visit) /访问左子树if(PreOrderTraverse(T->rchild,Visit) /访问右子树return OK;return ERROR; /ifelse return OK;/PreOrderTraver

25、seStatus InOrderTraverse(BiTree T,Status(* Visit)(TElemType) /中序遍历递归算法/ 采用二叉链表存储结构, Visit 是对数据元素操作的应用函数/ 中序遍历二叉树T 的递归算法,对每个数据元素调用函数Visitif(T)if(InOrderTraverse(T->lchild,Visit) /访问左子树if(Visit(T->data) /访问根结点if(InOrderTraverse(T->rchild,Visit) /访问右子树return OK;return ERROR; /ifelse return OK;

26、/InOrderTraverseStatus PostOrderTraverse(BiTree T,Status(* Visit)(TElemType) /后序遍历递归算法/ 采用二叉链表存储结构, Visit 是对数据元素操作的应用函数/ 后序遍历二叉树T 的递归算法,对每个数据元素调用函数Visitif(T)if(PostOrderTraverse(T->lchild,Visit) /访问左子树if(PostOrderTraverse(T->rchild,Visit) /访问右子树if(Visit(T->data) /访问根结点.return OK;return ERRO

27、R;/ifelse return OK;/PostOrderTraverse/-非递归遍历算法-Status PreOrderTraverse1(BiTree T,Status(* Visit)(TElemType) /先序遍历非递归算法/ 采用二叉链表存储结构, Visit 是对数据元素操作的应用函数/ 先序遍历二叉树T 的非递归算法,对每个数据元素调用函数VisitStack S;InitStack(S); /初始化栈BiTree p=T;/设置工作指针p 并对其赋初值while(p|!(StackEmpty(S)if(p)if(!Visit(p->data)/访问根结点return

28、 ERROR;Push(S,p);/根指针进栈p=p->lchild;/遍历左子树/ifelsePop(S,p);/根指针退栈p=p->rchild;/遍历右子树/else/whilereturn OK; /PreOrderTraverse1Status InOrderTraverse1(BiTree T,Status(* Visit)(TElemType) /中序遍历非递归算法/ 采用二叉链表存储结构, Visit 是对数据元素操作的应用函数/ 中序遍历二叉树T 的非递归算法,对每个数据元素调用函数VisitStack S;.InitStack(S);BiTree p=T;whi

29、le(p|!(StackEmpty(S)if(p)Push(S,p);/根指针进栈p=p->lchild;/遍历左子树/ifelsePop(S,p);/根指针退栈if(!Visit(p->data)/访问根结点return ERROR;p=p->rchild;/遍历右子树/else/whilereturn OK; /InOrderTraverse1Status PostOrderTraverse1(BiTree T,Status(* Visit)(TElemType) /后序遍历非递归算法/ 采用二叉链表存储结构, Visit 是对数据元素操作的应用函数/ 后序遍历二叉树T

30、的非递归算法,对每个数据元素调用函数VisitBiTree p=T, q=NULL; / int n=0;Stack s;InitStack(s);while(p)|(!StackEmpty(s) while(p)Push(s,p);p=p->lchild;/whileq=NULL;while(!StackEmpty(s)GetTop(s, p);.if(p->rchild=NULL)|(p->rchild=q)if(!Visit(p->data)/访问根结点return ERROR;if(p=T) return ERROR;q=p;Pop(s,p);/ifelsep=

31、p->rchild;break;/else/while/whilereturn OK; /PostOrderTraverse1Status LevelOrderTraverse1(BiTree T,Status(* Visit)(TElemType) /层序遍历非递归算法/ 采用二叉链表存储结构, Visit 是对数据元素操作的应用函数/ 层序遍历二叉树T 的算法,对每个数据元素调用函数VisitQueue Q;BiTree p=T;if(T)/根结点入队列InitQueue(Q);/初始化队列EnQueue(Q,T);while(!QueueEmpty(Q)/队列不空DeQueue(Q

32、,p);if(!Visit(p->data)/访问根结点return ERROR;if(p->lchild)EnQueue(Q,p->lchild);/左孩子入队列if(p->rchild).EnQueue(Q,p->rchild);/右孩子入队列/whileprintf("n");/ifreturn OK; /LevelOrderTraverse15. 二叉树的信息int BiTreeDepth(BiTree T) /递归求二叉树高度/ 若二叉树T 存在,返回T 的深度(高度),否则返回0int Thigh,leftThigh,rightTh

33、igh; /分别表示二叉树高度,左子树高度,右子树高度if(!T) return 0; /树高为 0elseleftThigh=BiTreeDepth(T->lchild);/求左子树高度rightThigh=BiTreeDepth(T->rchild);/求右子树高度if(leftThigh>=rightThigh)/求二叉树高度Thigh=leftThigh+1;elseThigh=rightThigh+1;/elsereturn Thigh;/BiTreeDepthint NodeSubNum(BiTree T) /统计二叉树的结点个数if(!T) return 0;

34、/二叉树为空树,没有结点else return(NodeSubNum(T->lchild)+NodeSubNum(T->rchild)+1); /NodeSubNum6. 销毁树void DestoryCSTree(CSTree &CT)/ 按照树的定义递归地销毁树if(CT) /非空树if(CT->firstchild)/孩子子树非空.DestoryCSTree(CT->firstchild);if(CT->nextsibling) /兄弟子树非空DestoryCSTree(CT->nextsibling);free(CT); /释放根结点CT=N

35、ULL;/空指针赋0/if/DestoryTreevoid DestoryBiTree(BiTree &T)/ 按照二叉树定义递归地销毁二叉树if(T) /非空树if(T->lchild) /左子树非空 , 销毁左子树DestoryBiTree(T->lchild);if(T->rchild) /右子树非空 , 销毁右子树DestoryBiTree(T->rchild);free(T); /释放根结点T=NULL;/空指针赋0/if/DestoryTreevoid DestoryTree(CSTree &CT,BiTree &T)/ 销毁树和二叉

36、树DestoryCSTree(CT);DestoryBiTree(T);printf("->生成的树和二叉树已被销毁!");/DestoryTree7. 栈和队列的定义及算法/-栈的顺序存储表示-typedef BiTree SElemType;/栈的元素为二叉树指针类型typedef struct /栈的顺序存储表示SElemType *base;/栈底指针,在栈构造之前和销毁之后,base 的值为 NULLSElemType *top;/栈顶指针.int stacksize;/当前已分配的存储空间,以元素为单位Stack;/-队列的链式存储表示-typedef B

37、iTree QElemType;/队列元素为二叉树指针类型typedef struct QNode /链队列的C 语言表示QElemType data;/数据域struct QNode * next;/指针域QNode,* QueuePtr;typedef structQueuePtr front; /队头指针QueuePtr rear;/队尾指针Queue;/-栈的相关函数 ( 供非递归后序遍历使用)-Status InitStack(Stack &S)/构造一个空的顺序栈if(!(S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(S

38、ElemType)printf("内存分配失败!n");exit(OVERFLOW);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;/InitStackStatus DestoryStack(Stack &S)/释放顺序栈S 所占内存空间free(S.base);S.base=NULL;S.top=NULL;return OK;/DestoryStackStatus StackEmpty(Stack S)/判断顺序栈S 是否为空栈 , 是返回 1,否返回0.return S.top=S.base;/StackI

39、sEmptyStatus Push(Stack &S,SElemType e) /入栈if(S.top-S.base >= S.stacksize)if(!(S.base=(SElemType*)realloc(S.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SElemType)printf("内存分配失败!n");exit(OVERFLOW);S.top = S.base + S.stacksize;S.stacksize +=STACKINCREMENT;*S.top+=e;/PushStatus Pop(St

40、ack &S,SElemType &e) /出栈if(StackEmpty(S)return ERROR;e=*-S.top;return OK;/PopStatus GetTop(Stack S,SElemType &e)/ 若栈不空,用 e 返回顺序栈 S 栈顶元素的值,并返回 OK,否则返回 ERRROR if(StackEmpty(S)return ERROR;e = *(S.top-1);return OK;/GetTop/-队列的相关函数( 供非递归层序遍历使用)-QueuePtr MallocQNode()/为链队列结点申请内存的函数QueuePtr p;

41、 /工作指针p.if(!(p=(QueuePtr)malloc(sizeof(QNode) /申请结点的内存空间, 若失败则提示并退出程序printf("内存分配失败,程序即将退出!n");exit(OVERFLOW);return p; /MallocQNodeStatus InitQueue(Queue &Q) /初始化链队列 / 构建一个空队列 QQ.front=Q.rear=MallocQNode();/申请头结点的内存空间,并使队头和队尾指针同时指向它Q.front->next=NULL;Q.front->data=0;/将队长设为0retur

42、n OK;/InitQueueStatus DestoryQueue(Queue &Q)/销毁队列Qwhile(Q.front) / 从头结点开始向后逐个释放结点内存空间 Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;/whileprintf("链队列已成功销毁!n");return OK;/DestoryQueueStatus QueueEmpty(Queue Q)/若 Q为空队列,则返回OK;否则返回ERRORif(Q.rear=Q.front) /队列为空的标志return OK;return ERR

43、OR;/QueueEmptyStatus EnQueue(Queue &Q,QElemType e)./ 插入元素 e 为 Q的新的队尾元素QueuePtr p=MallocQNode();p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;Q.front->data+; /队长 +1return OK;/EnQueueStatus DeQueue(Queue &Q,QElemType &e) / 若队列不空 , 则删除 Q的队头元素 , 用 e 返回其值 , 并返回 OK,否则返回 ERROR if(Q

44、ueueEmpty(Q)return ERROR; QueuePtr p= Q.front->next;e = p->data;Q.front->next = p->next;if(Q.rear=p)Q.rear=Q.front;free(p);Q.front->data-; /队长 -1return OK;/DeQueue8. 主函数int main(int argc,char *argv)printf("-树的应用-n");BiTree T=NULL;/声明一棵二叉树CSTree CT=NULL;/声明一棵普通树printf("-树的建立-n");printf("->请按树的先根次序输入序列,如有空子树, 用空格填充, 完成后输入回车确认 n");CreateCSTree(CT);.printf("-树的转换 -n");printf("->正在将输入的树转换为其对应的二叉树.n");ExchangeToBiTree(CT,T);printf("->

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论