自用项目代码,上传防止丢失。
仅供参考,请勿转载。
#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");
}
}
}
}