「数据结构课程设计」二叉排序树与文件操作

news2024/12/26 12:39:56

功能要求:

1)从键盘输入一组学生记录建立二叉排序树;

2)中序遍历二叉排序树;

3)求二叉排序树深度;

4)求二叉排序树的所有节点数和叶子节点数;

5)向二叉排序树插入一条学生记录;

6)从二叉排序树中删除一条学生记录;

7)从二叉排序树中查询一条学生记录;

8)以广义表的形式输出二叉排序树

该文件也是本人现在的作业,请不要全部照搬

部分函数体功能介绍及注意

void ask(bsttree T,int num)

该函数用于输入一个成绩信息,输出一个对应的学号信息,如果未找到则输出“未找到”,返回菜单目录,程序继续运行。

void Search(bsttree T,char num[])

该函数用于输入一个学号信息(学号不能超过9位),输出一个对应的成绩信息,如果未找到该学号则输出“未找到”,程序继续运行。

void writefile(bsttree T)

该函数用于保存文件信息。将树的前序遍历的节点信息保存到data.txt文件中。调用该函数前要在主函数同级文件夹中建立data.txt文件。

#include <bits/stdc++.h>
using namespace std;
typedef struct node1
{
    int grade;//成绩
    char num[10];//学号
}student;
typedef struct node2
{
    student data;
    struct node2 *left;
    struct node2 *right;
}bstnode,*bsttree;


void insertbst(bsttree &T,student e)
{
    if(T==NULL)
    {
        bsttree s=new bstnode;
        s->data=e;
        s->left=s->right=NULL;
        T=s;
    }
    else if(e.grade < T->data.grade)//递归插入其子树
        {insertbst(T->left,e);}
    else if(e.grade>T->data.grade)
        {insertbst(T->right,e);}
}
void createbst(bsttree &T)
{
    T=NULL;
    int n;
    cout<<"输入节点的个数"<<endl;
    cin>>n;
    cout<<"依次输入"<<n<<"个学生的成绩和学号"<<endl;
    while(n--)
    {
        student e;
        cin>>e.grade;
        cin>>e.num;
        insertbst(T,e);//调用insert函数
    }
    cout<<"建立完成"<<endl;
}
void bianli(bsttree T)//中序遍历
{
    if(T!=NULL)
    {
        bianli(T->left);
        cout<<"学号:"<<T->data.num<<"  "<<"成绩:"<<T->data.grade<<endl;
        bianli(T->right);
    }
}
int depth(bsttree T)//计算树的高度
{
  int leftdepth,rightdepth;
  if(T==NULL)return 0;
  else{
    leftdepth=depth(T->left);
    rightdepth=depth(T->right);
    if(leftdepth>rightdepth)return (leftdepth+1);//返回左和右中较大的
    else return(rightdepth+1);
}
}
int countleave(bsttree T)//计算树叶数
{
    int num=0;
    if(T==NULL){return 0;}
    else if(T->left==NULL&&T->right==NULL){return 1;}
    else{
        return countleave(T->left)+countleave(T->right);
        }//左子树加右子树
}

void ask(bsttree T,int num)//根据成绩查找学号
{
    int len=0;bsttree p,s[500];
    p=T;
    if(T==NULL)return;
    while(p!=NULL||len>0)
    {
        while(p!=NULL)
        {
            s[len]=p;len++;p=p->left;
        }
        if(len>0)
        {
            len--;p=s[len];
            if(num==p->data.grade)
            {
                cout<<"查找成功!"<<endl;
                cout<<"学号: "<<p->data.num<<" "<<"成绩:"<<p->data.grade<<endl;
                return;
            }
            p=p->right;
        }
    }
    cout<<"未找到"<<endl;
    cout<<endl;

}

void Search(bsttree T,char num[])//根据学号查成绩
{
    int len=0;bsttree p,s[500];
    p=T;
    if(T==NULL)return;
    while(p!=NULL||len>0)
    {
        while(p!=NULL)
        {
            s[len]=p;len++;p=p->left;
        }
        if(len>0)
        {
            len--;p=s[len];
            if(strcmp(num,p->data.num)==0)
            {
                cout<<"查找成功!"<<endl;
                cout<<"学号: "<<p->data.num<<" "<<"成绩:"<<p->data.grade<<endl;
                return;
            }
            p=p->right;
        }
    }
    cout<<"未找到"<<endl;
    cout<<endl;
}

void deletebst(bsttree &T, int value)
{
    if (!T) return;
    if (value < T->data.grade) {
        deletebst(T->left, value);
    }
    else if (value > T->data.grade) {
        deletebst(T->right, value);
    }
    else {
    	// 节点有两个子节点
    if (T->left && T->right) {
   	    // 查找右子树的最小值
    	bsttree minNode = T->right;
    	while (minNode->left) {
    	    minNode = minNode->left;
    	}
   	 	// 替换值
    	T->data.grade = minNode->data.grade;
    	for(int i=0;i<6;i++)
        {
            T->data.num[i]=minNode->data.num[i];
        }
    	// 删除最小值节点
    	deletebst(T->right, minNode->data.grade);
    }
	else {
    	 // 节点只有一个子节点或没有子节点
    	bsttree temp = T;
  		T = (T->left) ? T->left : T->right;
    	delete temp;
        }
    }
    cout<<"删除成功"<<endl;
}

void printbst(bsttree T)//广义表形式输出树
{
		cout<<T->data.num;
		if(T->left!=NULL)
        {
			cout<<"(";
			printbst(T->left);
			if(T->right==NULL)
			{
				cout<<",)";
			}
		}
		if(T->right!=NULL)
		{
			if(T->left==NULL)
			{
				cout<<"(";
            }
			cout<<",";
			printbst(T->right);
			cout<<")";
		}
}

void writefile(bsttree T)
{
    FILE *f;
    freopen("data.txt","w",stdout);
    int len=0;bsttree p,s[500];
    p=T;
    if(T==NULL)return;
    while(p!=NULL||len>0)
    {
        while(p!=NULL)
        {
            s[len]=p;len++;cout<<p->data.grade<<" "<<p->data.num<<endl;
            p=p->left;
        }
        if(len>0)
        {
            len--;p=s[len];
            p=p->right;
        }
    }
    cout<<endl;
    fclose(stdout);
    freopen("con","w",stdout);
    cout<<"已存入data.txt"<<endl;
}

void menu()
{
    cout<<"**************欢迎使用本系统 ***************"<<endl;
    cout<<"**                                        **"<<endl;
    cout<<"**        二叉排序树与文件操作            **"<<endl;
    cout<<"**       输入数字,执行相应操作           **"<<endl;
    cout<<"**                                        **"<<endl;
    cout<<"**       1.建立二叉排序树                 **"<<endl;
    cout<<"**       2.查看树的中序遍历               **"<<endl;
    cout<<"**       3.查看树的高度                   **"<<endl;
    cout<<"**       4.查看叶子节点个数               **"<<endl;
    cout<<"**       5.插入一条学生信息               **"<<endl;
    cout<<"**       6.删除一条学生信息               **"<<endl;
    cout<<"**       7.根据成绩查询学号               **"<<endl;
    cout<<"**       8.查看树的广义表形式             **"<<endl;
    cout<<"**       9.根据学号查找学生成绩           **"<<endl;
    cout<<"**                                        **"<<endl;
    cout<<"**                                        **"<<endl;
    cout<<"**       10.保存数据                      **"<<endl;
    cout<<"**       0.退出程序                       **"<<endl;
    cout<<"**                                        **"<<endl;
    cout<<"********************************************"<<endl;
    cout<<endl;
}
int main()
{
    bsttree T;
    int q=0,flag=1;
    while(flag)
    {
        menu();
        cin>>q;
        switch(q)
        {
            case(1):createbst(T);break;
            case(2):cout<<"中序遍历的结果为:"<<endl;bianli(T);cout<<endl;break;
            case(3):cout<<"树的高度为"<<depth(T)<<endl;break;
            case(4):cout<<"叶子个数为"<<countleave(T)<<endl;break;
            case(5):student e;cout<<"输入要插入的学生的成绩和学号"<<endl;cin>>e.grade>>e.num;insertbst(T,e);break;
            case(6):int key;cout<<"输入要删除的学生的成绩"<<endl;cin>>key;deletebst(T,key);break;
            case(7):int num;cout<<"输入成绩"<<endl;cin>>num;ask(T,num);cout<<endl;break;
            case(8):cout<<"树的广义表形式如下:"<<endl;printbst(T);cout<<endl;break;
            case(9):
                {
                    char tmp[10];cout<<"输入学号"<<endl;
                    cin>>tmp;Search(T,tmp);break;
                }
            case(10):writefile(T);break;
            case(0):flag=0;break;
        getchar();
        cout<<"再次回车确认退出"<<endl;
        getchar();
        system("cls");
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2265844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

认识计算机网络

单单看这一个词语&#xff0c;有熟悉又陌生&#xff0c;让我们来重新认识一下这位大角色——计算机网络。、 一、是什么 以及 怎么来的 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路和通信设备连接起来&#xff0c;在网络操…

GitLab部署到阿里云服务器上

GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能&#xff0c;能够浏览源代码&#xff0c;管理缺陷和注释。 一、安装 1.创建一…

windows nacos安装配置

GitHub下载压缩包 解压目录&#xff08;注意不要用中文路径&#xff09; 在mysql先创建数据库nacos&#xff0c;再执行sql脚本 配置数据库 #*************** Config Module Related Configurations ***************# ### If use MySQL as datasource: ### Deprecated conf…

ChildLife“童年时光杯”足球联赛启动 共促青少年健康成长

2024年12月21日至22日&#xff0c;由美国知名婴幼儿营养品牌ChildLife童年时光赞助的“童年时光杯”青少年足球联赛将在上海拉开帷幕。本次赛事U7/U8组别共有16支足球队参赛&#xff0c;包括上海幸运星足球俱乐部旗下的明星球队&#xff0c;以及其他青少年俱乐部的优秀队伍&…

动态规划<四> 回文串问题(含对应LeetcodeOJ题)

目录 引例 其余经典OJ题 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 引例 OJ 传送门Leetcode<647>回文子串 画图分析&#xff1a; 使用动态规划解决 原理&#xff1a;能够将所有子串是否是回文的信息保存在dp表中 在使用暴力方法枚举出所有子串&#xff0c;是…

Log4j1.27配置日志输出级别不起效

起因&#xff1a;构建独立版本debezuim使用时&#xff0c;日志一直打印debug信息。 原因&#xff1a;包冲突问题&#xff0c;进行排包操作。 参考log4j日志级别配置完成后不生效 系统一直打印debug日志_log4j不起作用-CSDN博客 1、application.properties logging.configc…

探索Flink动态CEP:杭州银行的实战案例

摘要&#xff1a;本文撰写自杭州银行大数据工程师唐占峰、欧阳武林老师。将介绍 Flink 动态 CEP的定义与核心概念、应用场景、并深入探讨其技术实现并介绍使用方式。主要分为以下几个内容&#xff1a; Flink动态CEP简介 Flink动态CEP的应用场景 Flink动态CEP的技术实现 Flin…

Git多人协作流程与git命令

目录 一、拉取&#xff1a;从仓库到本地1、第一次拉取2、后续的拉取 二、上传&#xff1a;从本地到仓库三、git commit版本信息标注 一、拉取&#xff1a;从仓库到本地 1、第一次拉取 # clone项目 git clone xxx2、后续的拉取 第一次拉取是指本地为空&#xff0c;如果本地已…

前端:改变鼠标点击物体的颜色

需求&#xff1a; 需要改变图片中某一物体的颜色&#xff0c;该物体是纯色&#xff1b; 鼠标点击哪个物体&#xff0c;哪个物体的颜色变为指定的颜色&#xff0c;利用canvas实现。 演示案例 代码Demo <!DOCTYPE html> <html lang"en"><head>&l…

[Unity] ShaderGraph动态修改Keyword Enum,实现不同效果一键切换

上次更新已然四个月前&#xff0c;零零散散的工作结束&#xff0c;终于有时间写点东西记录一下~ 实际使用中&#xff0c;经常会碰到同一个对象需要切换不同的材质&#xff0c;固然可以通过C#直接替换材质球。 或者在ShaderGraph中使用Comparison配合Branch实现切换&#xff…

电脑出现 0x0000007f 蓝屏问题怎么办,参考以下方法尝试解决

电脑蓝屏是让许多用户头疼的问题&#xff0c;其中出现 “0x0000007f” 错误代码更是较为常见且棘手。了解其背后成因并掌握修复方法&#xff0c;能帮我们快速恢复电脑正常运行。 一、可能的硬件原因 内存问题 内存条长时间使用可能出现物理损坏&#xff0c;如金手指氧化、芯片…

深度学习中的并行策略概述:1 单GPU优化

深度学习中的并行策略概述&#xff1a;1 单GPU优化 1 Training Larger Models on a Single GPU 在讨论模型的“扩展”时&#xff0c;往往会想到在多个GPU或多台机器上进行模型训练。不过&#xff0c;即便是在单个GPU上&#xff0c;也存在多种方法来训练更大规模的模型并提升…

数据结构(哈希表(中)纯概念版)

前言 哈希表&#xff08;Hash Table&#xff09;是计算机科学中的一个基础而重要的数据结构&#xff0c;它广泛评估各种算法和系统中&#xff0c;尤其是在需要快速查找、插入和删除操作的场景中。由于其O( 1)的平均时间复杂度&#xff0c;存储表在性能要求较高的应用中表现得非…

centos7的磁盘扩容

1、首先&#xff0c;确认你的磁盘是否已经正确识别并添加了新的空间。你可以使用lsblk或fdisk -l命令来查看 lsblk fdisk /dev/vda 2、我的情况是这样的&#xff0c;误操作将盘扩展为物理卷轴了&#xff0c;所以说是这样呈现的&#xff0c;如果有我的那种情况请先删除物理卷轴…

uniapp 微信小程序 页面部分截图实现

uniapp 微信小程序 页面部分截图实现 ​ 原理都是将页面元素画成canvas 然后将canvas转化为图片&#xff0c;问题是我页面里边本来就有一个canvas&#xff0c;ucharts图画的canvas我无法画出这块。 ​ 想了一晚上&#xff0c;既然canvas最后能转化为图片&#xff0c;那我直接…

ubuntu笔记

1.系统下载与虚拟机设置 系统下载https://cn.ubuntu.comhttps://releases.ubuntu.com 虚拟机设置: 桥接模式 在桥接模式下, 虚拟出来的操作系统就像是局域网中的一台独立的主机, 它可以访问网内任何一台机器主机网卡和虚拟网卡的IP地址处于同一个网段, 子网掩码、网关、DNS等…

音视频入门基础:AAC专题(13)——FFmpeg源码中,获取ADTS格式的AAC裸流音频信息的实现

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…

开发高效实时美颜工具:从美颜SDK到直播APP插件的全流程解析

今天&#xff0c;小编将以美颜SDK为核心&#xff0c;从开发、集成到优化的全流程&#xff0c;深入解析高效实时美颜工具的实现路径。 一、美颜SDK的核心功能与技术构成 美颜SDK是实时美颜技术的核心模块&#xff0c;承担着图像处理和效果呈现的重任。其主要功能包括&#xff…

用 gdbserver 调试 arm-linux 上的 AWTK 应用程序

很多嵌入式 linux 开发者都能熟练的使用 gdb/lldb 调试应用程序&#xff0c;但是还有不少朋友在调试开发板上的程序时&#xff0c;仍然在使用原始的 printf。本文介绍一下使用 gdbserver 通过网络调试开发板上的 AWTK 应用程序的方法&#xff0c;供有需要的朋友参考。 1. 下载 …

20241225在ubuntu22.04.5下使用smartmontools命令查看ssd的寿命

20241225在ubuntu22.04.5下使用smartmontools命令查看ssd的寿命 2024/12/25 15:10 rootrootrootroot-ThinkBook-16-G5-IRH:~$ sudo apt install smartmontools rootrootrootroot-ThinkBook-16-G5-IRH:~$ sudo fdisk -l Disk /dev/nvme0n1: 3.73 TiB, 4096805658624 bytes, 800…