1、wilyes11 收集 博客(与学习无关) :http:/ E 所在层次:2、同学录的测试数据:“赵一“,“1979-01-01“,“15811111111“,“0807011001“钱二“,“1980-02-02“,“15822222222“,“0807011002“孙三“,“1981-03-03“,“15833333333“,“0807011003“李四“,“1982-04-04“,“15844444444“,“0807011004“在上表的的基础上,测试表的建立,以及记录的新增、修改、删除等。四、算法思想1、在顺序二叉树下求节点所在层次数本题中顺序二叉树按照满二叉树的原则建立,空节点存“
2、0” 。故节点所在层次 count与节点下标 m 有如下关系:1)初始层次数 count=1,当 m=0 时,所查节点不存在2)当 m 非 0 时,令 m=m/2,count 加一3)m 不为 1 时,返回层次数 count;m 为 1 时,重复步骤 2)2、在链式二叉树下求节点所在层次数算法要用非递归算法求解二叉树中给定节点的深度,为实现层次非递归求解,必须借用数据结构保存将要访问的节点,在函数 CengciTree(BiTreeLink T,char c)中用数组 queue实现此功能。具体编程时,用变量 n 保存当前访问的节点的层次数目并初始化为 1,frontwilyes11 收集 博
3、客(与学习无关) :http:/ rear 是数组 queue 中当前正在访问的节点的下标以及可插入节点的下标,而 flag 起到标志作用用来表明是否要增加当前的层次数 n。算法开始时,首先判断树是否为空,若为空树退出程序;若树不为空,则先判断根节点的值是否与要查找节点的值相等,若相等则返回 n,否则将当前层次 n 加 1,并将根节点的左孩子、右孩子以及根节点本身插入到数组 queue 中。可能,有人会问为什么还要将根节点插入到数组 queue 中?这里,将根节点插入到数组 queue 中的目的是,当 queuefront保存的是根节点的指针时,二叉树的一层节点遍历结束了,需要将当前层次数 n
4、 加 1 并让queuerear保存根节点的指针。算法的核心部分就是 while 循环里面的内容,首先让标志 flag 值为 0,如果queuefront不为空且 queuefront-data 的值等于要查找的值 c,程序结束返回 n 即可;若 queuefront的值是指向根节点的指针,表明当前层次上的所有节点都已经访问过了,要访问下一个层次的节点了,故要把 n 加 1 并让 flag 值为 1 以表明在数组的插入位置queuerear需要赋值为跟节点的指针;如果,均不是上述情况,则将 queuefront的左孩子、右孩子都放到数组 queue 中,并将 front 指向下一个元素。重复上
5、述循环,直到找到了要查找的值,或者遍历了所有的节点。3、同学录的实现本题的一个实际应用是实现同学录,我们采用二叉树存储结构,利用预置数组建立二叉树;先序方式遍历二叉树并输出;递归算法实现对同学录的查找;基于查找实现对同学录的修改和新增成员;求所要操作节点的父亲节点,从而顺利的编写对同学录的删除操作。五、模块划分:1、在顺序二叉树下求节点所在层次数(1)void Creattree()其功能是建立顺序二叉树;(2)void Cengcitree()其功能是求节点层次2、在链式二叉树下求节点所在层次数(1)int CreateBiTree(BiTreeLink *T)其功能是建立二叉树;(2)vo
6、id PreOrderTraverse(BiTreeLink T) 其功能是先序遍历二叉树;(3)int CengciTree(BiTreeLink T,char c) 其功能是求层次数(1)int n=0,front=0,rear=0,flag;初始化队列;(2)(front+1)%MAXSIZE!=rear 判断队列不满。3、以同学录为例,利用二叉树存储结构,实现建立、查找、新增、删除等功能。(1)void CreateBiTree(DataType *items,BiTree *T)其功能是建立同学录(2)void PreOrderTraverse(BiTree T)(3)PBTNode
7、 SearchTree(BiTree T,char *ch)(4)void ModifyTree(BiTree T)(5)void DeleteTree(BiTree T)4、main()主函数,功能是调要相关函数实现问题的求解。六、数据结构:1、二叉树的抽象数据类型结构定义:typedef struct Node TElemType data;struct Node *lchild,*rchild;wilyes11 收集 博客(与学习无关) :http:/ BiTNode, *BiTreeLink;2、同学录节点信息:typedef struct Infochar name20; /姓名ch
8、ar date11; /生日char phone12; /电话char StudentNum11;/学号DataType;3、同学录数据存储结构:typedef struct Node DataType data;struct Node *left,*right;BTNode, *PBTNode,*BiTree;七、源程序:1、在顺序二叉树下求节点所在层次数#define maxlen 100#include“stdio.h“typedef struct node char data; Bitreemaxlen;int N; Bitree T;/*建立二叉树*/void Creattree()
9、 int i; char c;printf(“请输入结点数目(包括空结点):“);scanf(“%d“,printf(“请输入结点(空结点为 0):“);for(i=1;i #include #define MAXSIZE 20#define NULL 0typedef char TElemType;/* 二叉链树的类型定义*/typedef struct BiTNode TElemType data;struct BiTNode *lchild,*rchild; BiTNode, *BiTreeLink;/*先序建立二叉树*/int CreateBiTree(BiTreeLink *T) c
10、har ch;scanf(“%c“,if (ch= )*T=NULL;else *T=(BiTreeLink)malloc(sizeof(BiTNode);if (!(*T) return 0; /* 未分配到空间错误返回*/(*T)-data=ch;CreateBiTree(CreateBiTree( return 1; wilyes11 收集 博客(与学习无关) :http:/ 先序遍历二叉树*/void PreOrderTraverse(BiTreeLink T) if (T) printf(“%c“,T-data);PreOrderTraverse(T-lchild);PreOrder
11、Traverse(T-rchild); /*求二叉树节点所在层次数*/int CengciTree(BiTreeLink T,char c)int n=1,front=0,rear=0,flag;BiTreeLink queueMAXSIZE;/if(!T)printf(“树为空!n“);return n;if(T-data=c)return n;queuerear+=T-lchild;queuerear+=T-rchild;queuerear+=T;n+;while(front+1)%MAXSIZE!=rear)flag=0;if(queuefrontif(queuefront=T) n+;
12、flag=1;else if(queuefront) queuerear=queuefront-lchild;rear=(rear+1)%MAXSIZE;queuerear=queuefront-rchild;rear=(rear+1)%MAXSIZE;if(flag)queuerear=T;rear=(rear+1)%MAXSIZE;wilyes11 收集 博客(与学习无关) :http:/ 元素%c 不存在。n“,c);return -1;/*主函数*/int main() BiTreeLink T;int c=0;char x;printf(“请输入节点n“); CreateBiTree
13、(printf(“n 先序:“); PreOrderTraverse(T);printf(“n 请输入节点:“);getchar();printf(“n 请输入要查询的字符:“);scanf(“%c“, printf(“n 所在层次%3dnn“,CengciTree(T,x);system(“pause“);return 0; 3、以同学录为例,利用二叉树存储结构,实现建立、查找、新增、删除等功能。#include “stdio.h“#include “stdlib.h“#include “string.h“/*二叉链树的类型定义*/typedef struct Infochar name20
14、; /姓名char date11; /生日char phone12; /电话char StudentNum11;/学号DataType;typedef struct Node DataType data;struct Node *left,*right;BTNode, *PBTNode,*BiTree;/*插入(左孩子)*/PBTNode InsertLeft(PBTNode T,DataType x) PBTNode p;if(!T) return NULL;if(T-left =NULL) p=(PBTNode)malloc(sizeof(BTNode);p-data=x;wilyes11
15、 收集 博客(与学习无关) :http:/ =NULL;p-right =NULL;T-left =p;return p;return NULL;/*插入(右孩子)*/PBTNode InsertRight(PBTNode T,DataType x) PBTNode p;if(!T) return NULL;if(T-right =NULL) p=(PBTNode)malloc(sizeof(BTNode);p-data=x;p-left =NULL;p-right =NULL;T-right =p;return p;return NULL;/*插入*/void InsertChild(PBT
16、Node T,DataType x) if (T-left=NULL else if (InsertLeft(T,x) return;elseif (InsertRight(T,x) return;else InsertChild(T-left ,x);/*建立二叉树*/void CreateBiTree(DataType *items,BiTree *T) int i;printf(“本程序通过预置数组建立二叉树n“);(*T)=(PBTNode)malloc(sizeof(BTNode);(*T)-left=NULL;(*T)-right=NULL;(*T)-data=items0;for
17、(i=1;idata.name,T-data.StudentNum,T-wilyes11 收集 博客(与学习无关) :http:/ /*查找二叉树*/PBTNode SearchTree(BiTree T,char *ch) PBTNode flag=NULL;if (T) if(!strcmp(T-data.name,ch) printf(“nt%st%st%st%snn“,T-data.name,T-data.StudentNum,T-data.date,T-data.phone);flag=T; return flag;else flag=SearchTree(T-left,ch);if
18、(flag) return flag;elseflag=SearchTree(T-right,ch);return flag;/*查找父亲节点*/PBTNode SearchFather(PBTNode r,BiTree T,int *flag) PBTNode p=NULL; if(T) if(T-left=r)(*flag)=0; p=T;return p;/flag=0 表示左孩子的父亲else if(T-right=r) (*flag)=1; p=T;return p;elsep=SearchFather(r,T-left,flag);if(p) return p;else p=Sea
19、rchFather(r,T-right,flag);return p;/*修改二叉树*/void ModifyTree(BiTree T) char ch20,Mod12; PBTNode ModifyNode; int caseflag;printf(“请输入要修改信息的姓名:“); scanf(“%s“,ch); ModifyNode=SearchTree(T,ch);if(!ModifyNode)printf(“n 查找的姓名不存在n“); elsewhile(1)wilyes11 收集 博客(与学习无关) :http:/ 1:printf(“请输入修改后的生日:“);scanf(“%s
20、“,Mod);strcpy(ModifyNode-data.date,Mod);break;case 2:printf(“请输入修改后的电话:“);scanf(“%s“,Mod);strcpy(ModifyNode-data.phone,Mod);break;case 3:printf(“请输入修改后的学号:“);scanf(“%s“,Mod);strcpy(ModifyNode-data.StudentNum,Mod);break;case 4:return;/*删除二叉树*/void DeleteTree(BiTree T) char ch20; PBTNode DelNodeFather
21、,DelNode,p,q;int flag;printf(“请输入要删除信息的姓名:“); scanf(“%s“,ch); DelNode=SearchTree(T,ch);if(!DelNode)printf(“n 查找的姓名不存在n“); elseif (T=DelNode)if(DelNode-left)p=DelNode-left;while(p-right)p=p-right;p-right=DelNode-right;q=DelNode-left;*DelNode=*q;q-left=NULL;q-right=NULL;wilyes11 收集 博客(与学习无关) :http:/ i
22、f(DelNode-right) q=DelNode-right;*DelNode=*q;q-left=NULL;q-right=NULL;free(q);else strcpy(T-data.name,“ 无“);strcpy(T-data.StudentNum,“ 无“);strcpy(T-data.date,“ 无“);strcpy(T-data.phone,“ 无“);else DelNodeFather=SearchFather(DelNode,T, if(DelNode-left)p=DelNode-left;while (p-right)p=p-right;p-right=Del
23、Node-right;q=DelNode-left;*DelNode=*q;q-left=NULL;q-right=NULL;free(q);else q=DelNode-right;if(q) *DelNode=*q;q-left=NULL;q-right=NULL;free(q);else free(DelNode);if (flag=0) DelNodeFather-left=NULL;if (flag=1) DelNodeFather-right=NULL;printf(“n 删除指定姓名后的同学录n“);/*主函数*/void main() BiTree T; Int casefla
24、g;char ch20; DataType x=“周五“,“1983-05-05“,“15855555555“,“0807011005“;wilyes11 收集 博客(与学习无关) :http:/ items4=“赵一“,“1979-01-01“,“15811111111“,“0807011001“,“钱二“,“1980-02-02“,“15822222222“,“0807011002“,“孙三“,“1981-03-03“,“15833333333“,“0807011003“,“李四“,“1982-04-04“,“15844444444“,“0807011004“;CreateBiTree(i
25、tems,printf(“n 先序遍历:n“); PreOrderTraverse(T);while(1)printf(“n1.按姓名查找n2.新增同学信息n3.修改同学信息n4.删除同学信息n5.退出nn“);scanf(“%d“,switch(caseflag)case 1:printf(“请输入要查找的姓名:“); scanf(“%s“,ch); if(!SearchTree(T,ch)printf(“n 查找的姓名不存在n“); break;case 2:printf(“n 新增:n“);InsertChild(T,x);PreOrderTraverse(T);break;case 3
26、:ModifyTree(T);PreOrderTraverse(T);break;case 4:DeleteTree(T);PreOrderTraverse(T);break;case 5:return;八、测试结果:2、在顺序二叉树中求解节点所在层次数。wilyes11 收集 博客(与学习无关) :http:/ 收集 博客(与学习无关) :http:/ 收集 博客(与学习无关) :http:/ C 语言版严蔚敏 吴伟民 主编;C 语言程序设计谭浩强 主编;wilyes11 收集 博客(与学习无关) :http:/ C 语言知识和数据结构中关于队列、二叉树的有关知识,然后充分利用上课时间查阅资
27、料和编写代码,通过对一些现有源代码的研究,以及指导老师提供关于二叉树的部分源代码研究,逐渐对整个课程设计有了更清晰的认识,在脑海中有了明确的设计思路。在编写代码的过程中,由于 C 语言知识的不扎实,频繁的出现错误,虚心请教老师和同学,经过指导,对程序进行不停的修改和调试,完成了此次课程设计。本次课程设计训练了我对计算机加工的数据对象进行分析的能力,选择适当的数据结构及相应算法的能力。让我对所学课程内容掌握情况的一次自我验证。同时这些日子里小组同学之间互相学习,探讨算法,才得出此完善的程序,深刻感受到团队合作的力量,当程序完成时我们一个个都感到深深的欣慰,也从实践中学到很多知识。通过课程设计能提高了我对所学知识的综合应用能力,能全面检查并掌握所学内容;培养了我独立思考、刻苦钻研的精神;在分析问题、解决问题的过程中,让我获得一种成功的喜悦,进而增加其学习和应用的兴趣。