有人能解释一下这代码不

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
struct date {
int y;
int m;
int d;
};
typedef struct student {
char name[20];
char sex[6];
char major[20];
struct date birth;
char address[20];
int grade;
struct student *next;
} stu;
void add(struct student *head) {
stu q=(stu)malloc(sizeof(stu));
q->next=NULL;
stu p;
p=head;
//q=(stu
)malloc(sizeof(stu));
printf("请输入学生名字\n");
scanf("%s",q->name);
printf("请输入学生性别\n");
scanf("%s",q->sex);
printf("请输入学生专业\n");
scanf("%s",q->major);
printf("请输入学生生日的年月日\n");
scanf("%d%d%d",&q->birth.y,&q->birth.m,&q->birth.d);
printf("请输入学生地址\n");
scanf("%s",q->address);
printf("请输入学生英语成绩\n");
scanf("%d",&q->grade);
while(p->next!=NULL) {
p=p->next;
}
p->next=q;
p=q;
}
void paixv(struct student *head) { //case 6排序
int b=1;
if(head->next==NULL) {
b=0;
}
if(b==0) {
printf("当前无数据/n");
}
if(b==1) {
stu *p,q;
p=q=(stu
)malloc(sizeof(stu));
struct date birth1,birth2;
char name1[20];
char sex1[6];
char major1[20];
char address1[20];
int grade1;

char name2[20];
char sex2[6];
char major2[20];
char address2[20];
int grade2;



for(p=head->next; p!=NULL; p=p->next) {
  for(q=p->next; q!=NULL; q=q->next) {
    if(p->grade<q->grade) {
      strcpy(name1,p->name);
      strcpy(sex1,p->sex);
      strcpy(major1,p->major);
      birth1.y=p->birth.y;
      birth1.m=p->birth.m;
      birth1.d=p->birth.d;
      strcpy(address1,p->address);
      grade1=p->grade;


      strcpy(name2,q->name);
      strcpy(sex2,q->sex);
      strcpy(major2,q->major);;
      birth1=q->birth;
      strcpy(address2,q->address);
      grade2=q->grade;


      strcpy(p->name,name2);
      strcpy(p->sex,sex2);
      strcpy(p->major,major2);
      p->birth=birth2;
      strcpy(p->address,address2);
      p->grade=grade2;


      strcpy(q->name,name1);
      strcpy(q->sex,sex1);
      strcpy(q->major,major1);
      q->birth=birth1;
      strcpy(q->address,address1);
      q->grade=grade1;


    }
  }
}

}
}
void tongji(stu *head) {//统计 case5
int r=0,t=0,z,u=0,i=0,o=0,a=0,s=0,d=0;
stu *p=head;
if(p->next==NULL) {
printf("此时无数据");
} else {
int i;
printf("请选择你想统计的类型");
printf("***************\n");
printf("1统计性别
\n");
printf("2统计年龄*
\n");
printf("3统计专业*
\n");
printf("**********************\n");
scanf("%d",&i);
switch(i) {
case 1:
while(p->next!=NULL) {
if(strcmp(p->sex,"男")==0)
r++;
else
t++;
p=p->next;
}
printf("男生:%d\n",r);
printf("女生:%d\n",t);
break;
case 2:

    while(p->next!=NULL) {
      z=p->birth.y;
      u=2018-z;
      if(u==18)
        i++;
      else
        o++;
      p=p->next;
    }
    printf("18岁:%d\n",i);
    printf("19岁:%d\n",o);
    break;
  case 3:


    while(p->next!=NULL) {
      a=strcmp(p->major,"云计算");
      if(a==0)
        s++;
      else
        d++;
      p=p->next;
    }
    printf("云计算:%d\n",s);
    printf("大数据:%d\n",d);
    break;
  default:
    printf("请重新输入");
}

}
}
void daoru(stu *head) { //case 3 导入
int n;
printf("输入想插入学生个数:\n");
scanf("%d",&n);
for(int x=0; x<n; x++) {
add(head);
}
}
void shuchu(struct student *head)
{
stu *p;
p=head->next;

while (p!=NULL)
{
printf("%s %s %s %d %d %d %s %d\n",p->name,p->sex,p->major,p->birth.y,p->birth.m,p->birth.d,p->address,p->grade);
p=p->next;
}

}
void sousuo( stu *head) { //case 4
int k=0;
char name3[20];
printf("请输入要搜所的学生的名字\n");
scanf("%s",name3);
stu *p;
for(p=head->next; p!=NULL; p=p->next) {
if(strcmp(name3,p->name)==0) {
k=k+1;
printf("%s %s %s %d %d %d %s %d\n",p->name,p->sex,p->major,p->birth.y,p->birth.m,p->birth.d,p->address,p->grade);
}
if(k==0) {
printf("查无此人");
}
}
}
/void baocun()
{
ofstream outfile("d:\file.txt");
if(!outfile)
{
cerr<<"open error!"<<endl;
exit(1);
}
Student *p=head->next;
while(p)
{
outfile<num<<" ";
outfile<name<<" ";
outfile<sex<<" ";
outfile<major<<" ";
outfile<born<<" ";
outfile<address<<" ";
outfile<english <<" ";
p=p->next;
}
outfile.close();
cout<<"保存完成"<<endl;
}
/
void shanchu(stu *head) { //删除case2

stu *p,q;
p=q=(student
)malloc(sizeof(student));
p=head;
char name3[20];
if(p->next==NULL) {
printf("此时无数据");
} else {
printf("请输入你想删除的学生的名字");
scanf("%s",name3);
while(p!=NULL) {
if(strcmp(p->next->name,name3)==0) {
q=p->next;
p->next=p->next->next ;
q=NULL;
free(q);
}
p=p->next;
}
}
}
int main() {
system("color 3F");
int i;
struct student head=(student)malloc(sizeof(student));
head->next=NULL;
do {
system("date/t");
system("time/t");
system("color 5F");
printf("1、新增学生信息\n");
printf("2、删除学生信息\n");//完成
printf("3、导入学生信息\n");//写完
printf("4、学生信息搜索\n");//写完
printf("5、学生信息统计\n");//写完
printf("6、按英语成绩排序\n");//写完
printf("7、学生信息保存\n");
printf("8、退出\n");
printf("请输入要实现的功能\n");
scanf("%d",&i);
switch(i) {

  case 1:
    system("cls");
    add(head);
    break;
  case 2:
    system("cls");
    shanchu(head);
    break;
  case 3:
    system("cls");
    daoru(head);
    break;
  case 4:
    system("cls");
    sousuo(head);
    break;
  case 5:
    system("cls");
    tongji(head);
    break;
  case 6:
    system("cls");
    paixv(head);
    shuchu(head);
    break;
    /*  case 7: system("cls");*/
  case 8:
    break;
}

} while(i!=8);
printf("运行结束");
return 0;
}

学生管理系统
慢慢看

哪句不懂就拿出来问,这么长让人给你写注释,要写一天