#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
struct Date
{
int year;
int month;
int day;
};
struct Score
{
int Math;
int English;
int Chinese;
int CLanguage;
};
struct student
{
long int num;
char name[20];
char sex[2];
struct Date age;
char address[30];
struct Score sc;
struct student *next;
};
#define LEN sizeof(struct student)
int n;
/**************************************创建链表**************************************/
struct student *creat()
{
struct student *head;
struct student *p1;
struct student *p2;
n=0;
head=NULL;
p1=(struct student *)malloc (LEN);
printf("\n请输入第%d个学生的学号\n",n+1);
scanf("%ld",&p1->num);
printf("\n请输入姓名:\n");
scanf("%s",p1->name);
printf("\n请输入学生的性别:\n");
scanf("%s",p1->sex);
printf("\n请输入出生日期(例如:1990-03-12):\n");
scanf("%d-%d-%d",&p1->age.year,&p1->age.month,&p1->age.day);
printf("\n请输入地址:\n");
scanf("%s",p1->address);
printf("\n请依次输入数学、英语、语文、C语言的成绩):\n");
scanf("%d%d%d%d",&p1->sc.Math,&p1->sc.English,&p1->sc.Chinese,&p1->sc. CLanguage);
system("cls");
p2=NULL;
loop:while(p1->num != 0)
{
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(struct student *)malloc (LEN);
printf("\n请输入第%d个学生的学号\n",n+1);
scanf("%ld",&p1->num);
if(p1->num==0)
{
goto loop;
}
printf("\n请输入姓名:\n");
scanf("%s",p1->name);
printf("\n请输入学生的性别:\n");
scanf("%s",p1->sex);
printf("\n请输入出生日期(例如:1990-03-12):\n");
scanf("%d-%d-%d",&p1->age.year,&p1->age.month,&p1->age.day);
printf("\n请输入地址:\n");
scanf("%s",p1->address);
printf("\n请依次输入数学、英语、语文、C语言的成绩):\n");
scanf("%d%d%d%d",&p1->sc.Math,&p1->sc.English,&p1->sc.Chinese,&p1->sc. CLanguage);
system("cls");
}
free(p1);
p2->next=NULL;
return(head);
}
/************************************************************************************/
struct student *insert1(struct student *head,struct student *stud)
{
struct student *p0;
struct student *p1;
struct student *p2;
p1=head;
p0=stud;
if(head==NULL)
{
head=p0;
p0->next=NULL;
}
else
{
while((p0->num>p1->num)&&(p1->next==NULL))
{
p2=p1;
p1=p1->next;
}
if(p0->num<=p1->num)
{
if(p1==head)
{
head=p0;
p0->next=p1;
}
else
{
p2->next=p0;
p0->next=p1;
}
}
else
{
p1->next=p0;
p0->next=NULL;
}
}
n=n+1;
return(head);
}
/************************************************************************************/
struct student *del(struct student *head,long num)
{
struct student *p1;
struct student *p2;
if(head==NULL)
{
printf("\n数据为空!请确认好后进行输入!\n");
return head;
}
p1=head;
while(num!=p1->num && p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(num==p1->num)
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
free(p1);
n=n-1;
}
else
printf("未找到删除的结点!");
return head;
}
/************************************************************************************/
/*void print(struct student *head)
{
struct student *p;
p=head;
if(p==NULL)
printf("\n没有相关学生信息!\n");
return ;
while(p!=NULL)
{ printf("\n第%d个学生的信息\n",n+1);
printf("\n学号:%ld",p->num);
printf("\n姓名: %s", p->name);
printf("\n性别:%s",p->sex);
printf("\n出生日期:%d-%d-%d",p->age.year,p->age.month,p->age.day);
printf("\n地址:%s",p->address);
printf("\n数学 %d\n英语 %d\n语文 %d\nC语言 %d",p->sc.Math,p->sc.English,p->sc.Chinese,p->sc.CLanguage);
p=p->next;
}
}*/
/************************************************************************************/
void print(struct student * head)
{
printf("\n\n\n");
printf("全部学生信息:\n");
printf("----------------------------------\n");
struct student *p1;
p1 = head;
if(head != NULL)
{
printf("学号\t姓名\t性别\t出生日期\t地址\t数学\t英语\t语文\tC语言\n");
while(p1 != NULL)
{
printf("%ld\t%s\t%s\t%d-%d-%d\t%s\t%d\t%d\t%d\t%d\n",p1->num,p1->name,p1->sex,p1->age.year,p1->age.month,p1->age.day,p1->address,p1->sc.Math,p1->sc.English,p1->sc.Chinese,p1->sc.CLanguage);
p1 = p1->next;
}
}
else
printf("链为空,无学生信息;\n");
printf("----------------------------------\n\n\n");
}
/************************************************************************************/
/************************************************************************************/
/************************************************************************************/
void insert2()
{
struct student *head;
struct student *p1;
//head=NULL;
p1=(struct student *)malloc(LEN);
printf("请输入学生学号:");
scanf("%ld",&p1->num);
printf("\n请输入姓名:\n");
scanf("%s",p1->name);
printf("\n请输入学生的性别:\n");
scanf("%s",p1->sex);
printf("\n请输入出生日期(例如:1990-03-12):\n");
scanf("%d-%d-%d",&p1->age.year,&p1->age.month,&p1->age.day);
printf("\n请输入地址:\n");
scanf("%s",p1->address);
printf("\n请依次输入数学、英语、语文、C语言的成绩):\n");
scanf("%d%d%d%d",&p1->sc.Math,&p1->sc.English,&p1->sc.Chinese,&p1->sc. CLanguage);
system("cls");
head=insert1(head,p1);
free(p1);
}
/************************************************************************************/
void average(struct student *head)
{
struct student *p1;
int sum=0,ave;
p1=head;
while(p1!=NULL)
{
sum=sum+p1->sc .Math +p1->sc .English+p1->sc .Chinese+p1->sc .CLanguage;
p1=p1->next;
}
ave=sum/4;
printf("\n学生总分和平均分\n");
printf("\n------------------------------------------\n");
printf("\n总分\t平均分\n");
printf("\n%d\t%d\t\n",sum,ave);
printf("\n------------------------------------------\n");
printf("\n\n\n");
}
/************************************************************************************/
void main()
{ struct student *head;
struct student *p1;
int k,j;
head=NULL;
long delnum;
printf("\t\t\t\t学生管理系统\n");
while(1)
{
loop1 :
//system("color.1A");
printf("\n-------- 1: -----------------按1进行输入学生信息-------------------------\n");
printf("\n-------- 2: -----------------按2查看学生信息-----------------------------\n");
printf("\n-------- 3: -----------------按3计算学生平均分和总分---------------------\n");
printf("\n-------- 4: -----------------按4进行学生排名-----------------------------\n");
printf("\n-------- 5: -----------------按5删除学生信息-----------------------------\n");
printf("\n-------- 6: -----------------按6插入学生信息-----------------------------\n");
printf("\n-------- 7: -----------------按7退出-------------------------------------\n");
scanf("%d",&k);
system("cls");
switch(k)
{
case 1:
printf("\n请输入有关学生信息:\n");
head=creat();
break;
case 2:
printf("\n学生信息!\n");
print(head);
break;
case 3:
printf("\n-----------------------------各个学生的成绩总和------------------------\n");
average(head);
break;
/*case 4:
MaoPao();
break;*/
case 5:
printf("\n-----------------------------删除学生信息------------------------------\n");
printf("\n请输入您要删除的学号!\n");
scanf("%ld",&delnum);
while(delnum!=0)
{
head=del(head,delnum);
printf("\n请输入您要删除的学号!\n");
scanf("%ld",&delnum);
printf("学生信息已删除!是否继续删除(0:退出删除!)");
print(head);
}
break;
case 6:
p1=(struct student *)malloc(LEN);
printf("\n插入学生的相关信息:\n");
printf("请输入学生学号:");
scanf("%ld",&p1->num);
printf("\n请输入姓名:\n");
scanf("%s",p1->name);
printf("\n请输入学生的性别:\n");
scanf("%s",p1->sex);
printf("\n请输入出生日期(例如:1990-03-12):\n");
scanf("%d-%d-%d",&p1->age.year,&p1->age.month,&p1->age.day);
printf("\n请输入地址:\n");
scanf("%s",p1->address);
printf("\n请依次输入数学、英语、语文、C语言的成绩):\n");
scanf("%d%d%d%d",&p1->sc.Math,&p1->sc.English,&p1->sc.Chinese,&p1->sc. CLanguage);
system("cls");
head=insert1(head,p1);
//insert2();
break;
case 7:
exit(0);
break;
default :
printf("\n您输入有误!请重新输入!\n");
goto loop1;
}
}
}