链表实现c学生管理系统

 

#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; 
  }
 }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值