数据结构课程设计-二叉树操作系统

二叉树操作系统(二叉排序树)头文件部分:
#define INF 0xffffff
void Insert_BTree(BTree *root,DataType data)
{
	BTree s;
	if(*root==NULL)   //明白这样子写代码的思路吗
	{
		s=(BTNode *)malloc(sizeof(BTNode));        //什么时候在非初始化函数形参内用二级指针或者引用类型
		s->data=data;
		s->lchild=NULL;
		s->rchild=NULL;
		*root=s;
	}
	else if((*root)->data>data)
		Insert_BTree(&((*root)->lchild),data);
	else if((*root)->data<data)
		Insert_BTree(&((*root)->rchild),data);
}

int Search_BTree(BTree root,DataType data)   //二叉排序树查找操作
{
	BTNode *p;
	p=root;
	while(p)
	{
		if(p->data==data)
			return p->data;
		if(p->data>data)
			p=p->lchild;
		else
			p=p->rchild;
	}
	return INF;
}

void Create_BTree(BTree *root)
{
	int i,data,cnt;
	*root=NULL;
	printf("请输入二叉排序树节点的数目:\n");
	scanf("%d",&cnt);
	printf("请输入各节点数据,相邻数据之间用空格隔开:\n");
	for(i=1;i<=cnt;i++)
	{
		scanf("%d",&data);
		Insert_BTree(root,data);
	}
}

void Delete_BTree(BTree root,DataType data)
{
	BTree p,father,sc,q;
	p=root;
	father=NULL;
	while(p)    //匹配元素data或者p==NULL时跳出循环
	{
		if(p->data==data)   //匹配后p就是要被删除的节点
			break;
		father=p;       //father总是存放p的父亲节点
		if(p->data>data)
			p=p->lchild;
		else if(p->data<data)
			p=p->rchild;
	}
	if(p==NULL)    //开始分类讨论
	{
		printf("元素不存在,删除失败!!!\n");
		return ;
	}
	if(p->lchild==NULL)   //删除与插入仍然要符合二叉排序树的性质
	{
		if(father->lchild==p)
			father->lchild=p->rchild;
		else
			father->rchild=p->rchild;
		free(p);
	}
	else      //p的左子树不为空
	{             //既然p左子树不为空,那我肯定是要找左子树的最大节点
		q=p;       //或者是右子树的最小节点,但是
		sc=p->lchild;
		while(sc->rchild)   //这种方式直到sc为叶子节点或者只有左子树的节点
		{                   //最终sc就是p左子树的最大节点
			q=sc;
			sc=sc->rchild;
		}
		if(q==p)   //此时p节点的右子树为空
			q->lchild=sc->lchild;
		else    //此时p的左子树的右子树不为空,
			q->rchild=sc->lchild;  //想想为什么是这样,因为这样才能维持二叉排序树的性质
		p->data=sc->data;
		free(sc);
	}
}

void In_order_Rec_BST(BTree root)
{
	if(root)
	{
		In_order_Rec_BST(root->lchild);
		printf("%d ",root->data);
		In_order_Rec_BST(root->rchild);
	}
}

void Fuction_BTree(BTree root)
{
    int data,chioce,t;
	system("cls");
	printf("\t    二叉排序树应用             \n");
    printf("\t     1. 创建二叉               \n");
    printf("\t     2. 搜索节点               \n");
    printf("\t     3. 插入节点               \n");
    printf("\t     4. 删除节点               \n");
    printf("\t     0. 退出                   \n");
	printf("请输入相应操作: \n");
    scanf("%d",&chioce);
    while(!(chioce>=0&&chioce<=4))   //输入序号不存在,操作出错
	{
		printf("输入有问题,请重新输入:");
		scanf("%d",&chioce);
	}
	while(chioce!=0)
	{                           //建立循环选择不同的操作
        switch(chioce)
		{
			case 1:                           //选择操作1即二叉排序树的创建
                printf("创建二叉树: \n");
                Create_BTree(&root);
                In_order_Rec_BST(root);
                printf("\n");
                break;
			case 2:                       //选择操作2即在二叉排序树中进行查找
                printf("请输入你想搜索的节点存储元素信息: \n");
                scanf("%d",&data);
                t=Search_BTree(root,data);
                if(t!=INF)
				{
                    printf("查找成功: ");
                    printf("%d\n",t);
                }
                else
					printf("关键字不存在\n");
                break;
			case 3:      //选择操作3即在二叉排序树中进行插入操作
				printf("请输入你想插入的节点存储元素信息: \n");
                scanf("%d",&data);
                Insert_BTree(&root,data);
                In_order_Rec_BST(root);
                printf("\n");
                break;
			case 4:    //选择操作4即在二叉排序树中进行删除操作
                printf("请输入你想删除的节点存储信息: \n");
                scanf("%d",&data);
                Delete_BTree(root,data);
                In_order_Rec_BST(root);
                printf("\n");
                break;
        }
        printf("请继续进行相应操作:");
        scanf("%d",&chioce);
    }
    return ;
} 

时间: 2024-10-18 17:46:01

数据结构课程设计-二叉树操作系统的相关文章

数据结构课程设计题目四_二叉树

本文出自:http://blog.csdn.net/svitter 题目4:二叉树 给出一颗无线的二叉树.树的每一个结点用一整数对标识.二叉树构造如下 树根被标识为(1, 1): 如果一个结点被标识为(a, b), 则其左孩子被标识为(a+b,b),右孩子被标识为(a, a+b).现在给出某一结点(a, b),求树根到该结点的最短路径,并且同时求出从树根出发向左走和向右走的次数.建议完成人数1人. 注:此处使用了STL_stack库函数,是不允许的,我图方便. //===============

数据结构——课程设计

  <数据结构课程设计>   课程题目 模拟电话客服管理系统 课程编号 j1620102 学生姓名 吴佳煜 所在专业 信息管理与信息系统 所在班级 信管1133 任课老师 易学明 实习时间 二〇一四年十二月二十五日 设计成绩 老师评语 一.课程设计题目 赵斌是一个信管专业的学生,大学四年顺利毕业了.在毕业季,他也像其他学子一样,投身于求职大军,投出一份又一份求职简历,在苦苦地等待之后,他接到了中国移动通信公司广东分司的面试通知书,通知他于本月1号10点到公司面试.当天,晴空万里,艳阳高照,他身

数据结构课程设计

20. 公交线路上优化路径的查询  问题描述 最短路径问题是图论中的一个经典问题,其中的Dijkstra算法一直被认为是图论中的好算法,但有的时候需要适当的调整Dijkstra算法才能完成多种不同的优化路径的查询. 对于某城市的公交线路,乘坐公交的顾客希望在这样的线路上实现各种优化路径的查询.设该城市的公交线路的输入格式为: 线路编号:起始站名(该站坐标):经过的站点1名(该站坐标):经过的站点2名(该站坐标):--:经过的站点n名(该站坐标):终点站名(该站坐标).该线路的乘坐价钱.该线路平均

数据结构课程设计题目十二_计算机学院学生会的打印机(优先队列)

本文出自:http://blog.csdn.net/svitter 题目12:计算机学院学生会的打印机(优先队列) 小明抱怨学生会的打印机不符合FIFO的原则,看到很多在他后面来打印的同学比他先打印出来.五分钟前,小明的文件就是下一个候选的,如今小明的文件又排到了后面.学生会的同学给小明解释说,学生会的打印机不是採用传统的队列方式,而是採用一种自定义的优先队列方式:每一个要打印的文件被赋予了一个从1到9的优先级(9最高,1最低).打印规定例如以下: 将队列中要打印的文件f从队列中拿出来: 假设在

数据结构课程设计之一元多项式的计算

数据结构不是听会的,也不是看会的,是练会的,对于写这么长的代码还是心有余也力不足啊,对于指针的一些操作,也还是不熟练,总出现一些异常错误,对于数据结构掌握还是不够啊,还是要多练,这个课程设计做的还是有点粗糙,还有待改进啊!! 对代码有进行了一下改进,增加了排序的模块:可能还存在着一下小bug,发现了再更新:减法还可以写的更简便一点. <pre name="code" class="cpp">#include <stdio.h> #includ

数据结构课程设计《稀疏矩阵运算器》

最近正在弄数据结构课程设计内容,说实话,感觉自己数据结构学的就是渣,好多东西都不会.还是要多学点东西啊.现在暂且贴点之前写完的东西吧,到时候也好有个总结. 1 诸论 1.1 问题描述 稀疏矩阵是指那些多数元素为零的矩阵.利用"稀疏"特点进行存储和计算可以大大节省存储空间,提高计算准备效率.实现一个能进行稀疏矩阵基本运算的运算器. 1.2 基本要求 以"带行逻辑链接信息"的三元组顺序表示稀疏矩阵,实现两个稀疏矩阵相加.相减.相乘和求逆的运算.稀疏矩阵的输入形式采用三元

背单词系统 数据结构课程设计

     数据结构     课程设计说明书           题目:          轻松背单词   学生姓名:       啦啦啦 学    号:    201406060306      院 (系):    电气与信息工程 专    业:   计算机科学与技术 指导教师: 2016  年  1 月 15 日 目 录 1.设计任务 1 2. 需求分析 1 3. 概要设计 1 3.1 基本功能 1 3.2 函数说明 1 3.3 变量和结构体说明 2 3.4 单词存储简要分析 2 3.5 功能

数据结构课程设计论文--学生信息管理系统

数据结构课程设计论文--学生信息管理系统 1.学生成绩分析问题 (1)问题描述.录入并保存一个班级学生多门课程的成绩,并对成绩进行分析. (2)基本要求.a)通过键盘输入各学生的多门课程的成绩,建立相应的文件input.dat.b)对文件input.dat中的数据进行处理,要求具有如下功能:按各门课程成绩排序,并生成相应的文件输出:计算每个人的平均成绩,按平均成绩排序,并生成文件:求出各门课程的平均成绩.最高分.最低分.不及格人数.60~69分人数.70~79分人数.80~89分人数.90分以上

数据结构课程设计之通讯录管理系统

数据结构的第二个课程设计,在c语言课程设计的基础上加以改进,(加强版),保存一下代码,对文件的处理,还是有一点一问题,还有待改进 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h>/*屏幕操作函数库*/ struct node { int num; //编号 char name[10];//姓名 char addr[20];//地址 char telenu