学生健康管理系统的设计与实现 主要实现学生健康情况管理的几个操作功能:新建、插入、删除、写入文件和查询、屏幕输出功能。健康表中学生的信息由学号、姓名、出生日期、性别、身体状况。 利用二叉树来实现,系统的菜单功能如下: 1、新建学生健康表 2、向学生健康表插入学生信息 3、从文件中读取健康表信息 4、向文件写入学生健康表信息 5、在建康表中查询学生信息(按学号进行查询) 6、在屏幕中输出全部学生信息 7、退出 实验设计 以排序二叉树为储存机制,可以方便的实现插入或删除学生信息。每个学生的信息储存在一个结构体 Student中,并且这个结构体帯有输出学生信息的函数output()。然后以这个结构体作为二叉树节点的数据类 型,这样就实现了学生信息的存储。在创建二叉树对象时将已存储在文件中的学生信息写入二叉树,在析构函数里实现将学生信息写入文件。 使用C语言,充分使用数据结构中的二叉树知识 语言简明,模块清晰。请写出这样的代码,并含有注释
时间: 2024-03-30 07:40:19 浏览: 39
/*学生健康管理系统*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*定义学生信息结构体*/
typedef struct student{
char id[20]; //学号
char name[20]; //姓名
char birth[20]; //出生日期
char gender[10]; //性别
char health[50]; //身体状况
}Student;
/*定义二叉树结构体*/
typedef struct node{
Student data; //学生信息
struct node *left; //左子树
struct node *right; //右子树
}Node, *Tree;
/*函数声明*/
void create(Tree *root); //新建学生健康表
void insert(Tree *root); //向学生健康表插入学生信息
void read_file(Tree *root); //从文件中读取健康表信息
void write_file(Tree root); //向文件写入学生健康表信息
void search(Tree root); //在健康表中查询学生信息
void output(Tree root); //在屏幕中输出全部学生信息
void destroy(Tree root); //销毁二叉树
/*主函数*/
int main(){
Tree root = NULL; //初始化二叉树
int choice;
do{
printf("\n1.新建学生健康表\n");
printf("2.向学生健康表插入学生信息\n");
printf("3.从文件中读取健康表信息\n");
printf("4.向文件写入学生健康表信息\n");
printf("5.在健康表中查询学生信息\n");
printf("6.在屏幕中输出全部学生信息\n");
printf("7.退出\n");
printf("请输入您的选择:");
scanf("%d", &choice);
switch(choice){
case 1: create(&root); break;
case 2: insert(&root); break;
case 3: read_file(&root); break;
case 4: write_file(root); break;
case 5: search(root); break;
case 6: output(root); break;
case 7: destroy(root); exit(0); break;
default: printf("输入错误,请重新输入!\n"); break;
}
}while(1);
return 0;
}
/*新建学生健康表*/
void create(Tree *root){
printf("\n新建学生健康表\n");
*root = NULL; //初始化二叉树
printf("新建成功!\n");
}
/*向学生健康表插入学生信息*/
void insert(Tree *root){
printf("\n向学生健康表插入学生信息\n");
Student stu;
printf("请输入学号:");
scanf("%s", stu.id);
printf("请输入姓名:");
scanf("%s", stu.name);
printf("请输入出生日期:");
scanf("%s", stu.birth);
printf("请输入性别:");
scanf("%s", stu.gender);
printf("请输入身体状况:");
scanf("%s", stu.health);
Node *p = (Node*)malloc(sizeof(Node));
p->data = stu;
p->left = p->right = NULL;
if(*root == NULL){ //若二叉树为空,则直接插入
*root = p;
}
else{ //否则按学号大小插入
Node *q = *root;
while(q != NULL){
if(strcmp(stu.id, q->data.id) < 0){
if(q->left == NULL){
q->left = p;
printf("插入成功!\n");
return;
}
else{
q = q->left;
}
}
else if(strcmp(stu.id, q->data.id) > 0){
if(q->right == NULL){
q->right = p;
printf("插入成功!\n");
return;
}
else{
q = q->right;
}
}
else{ //学号相同时提示插入失败
printf("插入失败,学号已存在!\n");
return;
}
}
}
}
/*从文件中读取健康表信息*/
void read_file(Tree *root){
printf("\n从文件中读取健康表信息\n");
FILE *fp = fopen("health.dat", "rb");
if(fp == NULL){ //文件不存在时提示读取失败
printf("读取失败,文件不存在!\n");
return;
}
Student stu;
while(fread(&stu, sizeof(Student), 1, fp) == 1){ //按照结构体大小读取文件内容
Node *p = (Node*)malloc(sizeof(Node));
p->data = stu;
p->left = p->right = NULL;
if(*root == NULL){ //若二叉树为空,则直接插入
*root = p;
}
else{ //否则按学号大小插入
Node *q = *root;
while(q != NULL){
if(strcmp(stu.id, q->data.id) < 0){
if(q->left == NULL){
q->left = p;
break;
}
else{
q = q->left;
}
}
else if(strcmp(stu.id, q->data.id) > 0){
if(q->right == NULL){
q->right = p;
break;
}
else{
q = q->right;
}
}
else{ //学号相同时提示插入失败
break;
}
}
}
}
fclose(fp);
printf("读取成功!\n");
}
/*向文件写入学生健康表信息*/
void write_file(Tree root){
printf("\n向文件写入学生健康表信息\n");
FILE *fp = fopen("health.dat", "wb");
if(fp == NULL){ //文件打开失败时提示写入失败
printf("写入失败,文件打开失败!\n");
return;
}
fwrite(root, sizeof(Student), 1, fp); //按照结构体大小写入文件内容
fclose(fp);
printf("写入成功!\n");
}
/*在健康表中查询学生信息*/
void search(Tree root){
printf("\n在健康表中查询学生信息\n");
char id[20];
printf("请输入要查询的学号:");
scanf("%s", id);
Node *p = root;
while(p != NULL){
if(strcmp(id, p->data.id) < 0){
p = p->left;
}
else if(strcmp(id, p->data.id) > 0){
p = p->right;
}
else{
printf("学号\t姓名\t出生日期\t性别\t身体状况\n");
printf("%s\t%s\t%s\t%s\t%s\n", p->data.id, p->data.name, p->data.birth, p->data.gender, p->data.health);
return;
}
}
printf("查询失败,未找到该学号!\n");
}
/*在屏幕中输出全部学生信息*/
void output(Tree root){
printf("\n在屏幕中输出全部学生信息\n");
printf("学号\t姓名\t出生日期\t性别\t身体状况\n");
if(root == NULL){
printf("健康表为空!\n");
return;
}
void inorder(Tree root); //中序遍历二叉树
inorder(root);
}
/*中序遍历二叉树*/
void inorder(Tree root){
if(root != NULL){
inorder(root->left);
printf("%s\t%s\t%s\t%s\t%s\n", root->data.id, root->data.name, root->data.birth, root->data.gender, root->data.health);
inorder(root->right);
}
}
/*销毁二叉树*/
void destroy(Tree root){
if(root != NULL){
destroy(root->left);
destroy(root->right);
free(root);
}
}
阅读全文