学生管理系统,用二叉树(二叉搜索树)实现。

自用项目代码,上传防止丢失。

仅供参考,请勿转载。

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
struct student
{
	char number[20];
	char name[10];
	int score;
};
typedef struct node
{
	struct student date;
	struct node *next;
}Node;
typedef struct tree
{
	Node* val;
	struct tree *left;
	struct tree *right;
}tree;
void show(Node *p,int n)
{
	system("cls");
	printf("学号                姓名                成绩\n");
	while(n--)
	{
		int nu=20-strlen(p->date.number),na=20-strlen(p->date.name);
		printf("%s",p->date.number);
		while(nu--)
		printf(" ");
		printf("%s",p->date.name);
		while(na--)
		printf(" ");
		printf("%d\n",p->date.score);
		p=p->next;
	}
}
void find(Node *p)
{
	system("cls");
	printf("请选择你的查找方式:\n输入1为学号查找\n输入2为姓名查找\n");
	while(1)
	{
		char w; 
		w=getch();
		system("cls");
		if(w!='1'&&w!='2')
		{
			printf("输入错误,请重新输入(输入1为学号查找,2为姓名查找):\n");
		}
		else
		{
			if(w=='1')
		{
			system("cls");
			printf("请输入学号(输入完毕请按回车):\n"); 
			char num[20];
			scanf("%s",num);
			int h=0;
			while(p!=NULL)
			{
				int flag=strcmp(num,p->date.number);
				if(flag==0)
				{
					system("cls");
					int nu=strlen(p->date.number),na=strlen(p->date.name);
					if(nu<=4)
					nu=4;
					if(na<=4)
					na=4;
					printf("学号");
					while(nu--)
					printf(" ");
					printf("姓名");
					while(na--)
					printf(" ");
					printf("成绩\n");
					nu=strlen(p->date.number),na=strlen(p->date.name);
					printf("%s",p->date.number);
					if(nu<=4)
					{
						nu=8-nu;
						while(nu--)
						printf(" ");	
					}
					else
					{
						nu=4;
						while(nu--)
						printf(" ");
					}
					 printf("%s",p->date.name);
					 if(na<=4)
					{
						na=8-na;
						while(na--)
						printf(" ");	
					}
					else
					{
						na=4;
						while(na--)
						printf(" ");
					}
					 printf("%d\n",p->date.score);
					 h=1;
					 break;
				}
				else
				p=p->next;
			}
			if(h==0)
			{
				system("cls");
				printf("查询失败,此学生不存在!\n");
			}
			break; 
		}
		else
		if(w=='2')
		{
			printf("请输入姓名(输入完毕请按回车):\n");
			char num[20];
			gets(num);
			int h=0;
			while(p!=NULL)
			{
				int flag=strcmp(num,p->date.name);
				if(flag==0)
				{
					system("cls");
					int nu=strlen(p->date.number),na=strlen(p->date.name);
					if(nu<=4)
					nu=4;
					if(na<=4)
					na=4;
					printf("学号");
					while(nu--)
					printf(" ");
					printf("姓名");
					while(na--)
					printf(" ");
					printf("成绩\n");
					nu=strlen(p->date.number),na=strlen(p->date.name);
					printf("%s",p->date.number);
					if(nu<=4)
					{
						nu=8-nu;
						while(nu--)
						printf(" ");	
					}
					else
					{
						nu=4;
						while(nu--)
						printf(" ");
					}
					 printf("%s",p->date.name);
					 if(na<=4)
					{
						na=8-na;
						while(na--)
						printf(" ");	
					}
					else
					{
						na=4;
						while(na--)
						printf(" ");
					}
					 printf("%d\n",p->date.score);
					 h=1;
					 break;
				}
				else
				p=p->next;
			}
			if(h==0)
			{
				system("cls");
				printf("查询失败,此学生不存在!\n");
			}
			break; 
		}
		}
		
	}
}
void increase(Node *p,int *n)
{
	system("cls");
	printf("请输入学生信息(按学号-姓名-成绩顺序录入并用空格分隔,录入完毕请按回车):\n");
	Node *s;
	s=(Node*)malloc(sizeof(Node));
	scanf("%s%s%d",s->date.number,s->date.name,&(s->date.score));
	system("cls");
	printf("请输入插入位置i(1<=i<=%d),结束请按回车:\n",*n+1);
	while(1)
	{
		int i;
		scanf("%d",&i);
		if(i<=0||i>*n+1)
		{
			system("cls");
			printf("位置输入错误,请重新输入插入位置i(1<=i<=%d),结束请按回车:\n");	
		}
		else
		{
			system("cls");
			for(int j=1;j<=i-1;j++)
				p=p->next;
			s->next=p->next;
			p->next=s;
			*n=*n+1;
			printf("已成功录入!\n");
			break; 
		}
	}
}
void Delete(Node *p,int *n)
{
	system("cls");
	printf("请输入要删除的学生位置i(1<=i<=%d),结束请按回车:\n",*n);
	while(1)
	{
		int i;
		scanf("%d",&i);
		if(i<=0||i>*n)
		{
			system("cls");
			printf("位置输入错误,请重新输入要删除的位置i(1<=i<=%d),结束请按回车:\n",*n);	
		}
		else
		{
			for(int j=1;j<=i-1;j++)
			p=p->next;
			p->next=p->next->next;
			free(p->next);
			*n=*n-1; 
			system("cls");
			printf("已成功删除!\n");
			break; 
		} 
	}
}
Node* create(Node *p,int *n)
{
	system("cls");
	printf("请输入你要新建立的学生信息的个数(输入完请按回车):\n");
	int g;
	scanf("%d",&g);
	*n=*n+g;
	system("cls");
	printf("请输入学生信息(按学号-姓名-成绩顺序录入并用空格分隔,录入完毕请按回车):\n");
	Node *s;
	while(g--)
	{
		 
		s=(Node*)malloc(sizeof(Node));
		scanf("%s%s%d",s->date.number,s->date.name,&(s->date.score));
		p->next=s;
		p=s;
	}
	p->next=NULL;
	system("cls"); 
	printf("已成功录入!\n");
	return p; 
}
tree *e;
bool d1,d2;
int check(tree* p)
{
	if(p==NULL||e)
	return 0;
	int x=check(p->left); 
	int y=check(p->right);
	if(e==NULL&&(x-y<-1||x-y>1))
	{
		e=p;
		if(x-y<-1)
		d1=false;
		else
		d1=true;
	}	
	if(x-y>0)
		return x+1;
	else
		return y+1;
}
int panduan(tree* p)
{
	if(p==NULL)
	return 0;
	int x=panduan(p->left);
	int y=panduan(p->right);
	if(x-y>0)
	{
		d2=true;
		return x+1;
	}
	else
	{
		if(x==y)
			d2=d1;
		else
			d2=false;
		return y+1;
	}
}
tree* w;
void sousuo1(tree* p,tree* q)
{
	if(p==NULL||w)
	return;
	if(w==NULL&&p->left==q)
	{
		w=p;
		return;
	}
	sousuo1(p->left,q);
	sousuo1(p->right,q);
} 
void sousuo2(tree* p,tree* q)
{
	if(p==NULL||w)
	return;
	if(w==NULL&&p->right==q)
	{
		w=p;
		return;
	}
	sousuo2(p->left,q);
	sousuo2(p->right,q);
}
void dfs(tree* p)
{
	if(!p)
	return;
	dfs(p->right);
	int nu=20-strlen(p->val->date.number),na=20-strlen(p->val->date.name);
	printf("%s",p->val->date.number);
	while(nu--)
	printf(" ");
	printf("%s",p->val->date.name);
	while(na--)
	printf(" ");
	printf("%d\n",p->val->date.score);
	dfs(p->left);
} 
void sort(Node *p)
{
	tree* root=(tree*)malloc(sizeof(tree));
	root->left=NULL;
	root->right=NULL;
	if(p->next)
	{
		root->val=p->next;
		p=p->next;
	}
	while(p->next)
	{
		tree* s=(tree*)malloc(sizeof(tree));
		s->left=NULL;
		s->right=NULL;
		s->val=p->next;
		p=p->next;
		tree* q=root;
		while(q)
		{
			if(q->val->date.score>=s->val->date.score)
			{
				if(q->left==NULL)
				{
					q->left=s;
					break;
				}
				else
					q=q->left;	
			}	
			else
			{
				if(q->right==NULL)
				{
					q->right=s;
					break;
				}
				else
					q=q->right;
			}	
		}
		e=NULL;
		check(root);
		if(e)
		{
			if(d1==true)
			panduan(e->left);
			else
			panduan(e->right);
			if(d1==true&&d2==true)
			{
				w=NULL;
				sousuo1(root,e);
				w->left=e->left;
				tree* v=e->left->right;
				e->left->right=e;
				e->left=v;
			}
			if(d1==false&&d2==false)
			{
				w=NULL;
				sousuo2(root,e);
				w->right=e->right;
				tree* v=e->right->left;
				e->right->left=e;
				e->right=v;
			}
			if(d1==true&&d2==false)
			{
				tree *g=e->left;
				e->left=e->left->right;
				g->right=e->left->left;
				e->left->left=g;
				w=NULL;
				sousuo1(root,e);
				w->left=e->left;
				tree* v=e->left->right;
				e->left->right=e;
				e->left=v;
			}
			if(d1==false&&d2==true)
			{
				tree *g=e->right;
				e->right=e->right->left;
				g->left=e->right->right;
				e->right->right=g;
				w=NULL;
				sousuo2(root,e);
				w->right=e->right;
				tree* v=e->right->left;
				e->right->left=e;
				e->right=v;
			}
		}
	}
	system("cls");
	printf("学号                姓名                成绩\n");
	dfs(root);
}
int main()
{
	Node *L,*s;
	L=(Node*)malloc(sizeof(Node));
	L->next=NULL;
	s=L;
	int n=0;
	char y;
	while(1)
	{
		printf("\n请选择你要执行的操作(请输入要执行操作前面的数字):\n 1、录入学生信息\n 2、显示所有学生信息\n");
		printf(" 3、通过学号或姓名查找学生\n 4、插入一个学生信息\n 5、删除指定位置学生信息\n 6、查询学生总人数\n 7、输出按成绩排序的学生信息\n 8、退出程序\n");
		y=getch();
		if(n==0&&(y=='2'||y=='3'||y=='5'||y=='7'))
		{
			system("cls");
			printf("目前没有学生信息,此操作不能执行,请先录入学生信息!\n");
		}
		else
		{
			if(y=='8')//退出程序
			{
			system("cls");
			printf("感谢使用!\n");
			break;	
			} 
			if(y=='1')
			s=create(s,&n);//录入学生信息
			if(y=='2')
			show(L->next,n);//显示所有学生信息
			if(y=='3')
			find(L->next);//通过学号或姓名查找学生
			if(y=='4')
			increase(L,&n);//插入一个学生信息
			if(y=='5')
			Delete(L,&n);//删除指定位置学生信息
			if(y=='6')
			{
				system("cls");
				printf("学生总人数为:%d\n",n);
			}        //查询学生总人数 
			if(y=='7')
			sort(L);//输出按成绩排序的学生信息
			if(y!='2'&&y!='1'&&y!='3'&&y!='4'&&y!='5'&&y!='6'&&y!='7'&&y!='8')
			{
				system("cls");
				printf("输入错误!\n");	
			}
		}
	}
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值