用C语言实现 学生管理系统(要带注解)?解决方法

用C语言实现 学生管理系统(要带注解)?
用C语言实现 学生管理系统 

要求: 
1.能建立以班为单位的学生基础数据文件,该文件能反映各科成绩和学生的基本信息. 
2.能按班并能选择任意一科成绩排序,并输出排序后的班文件. 
3.能按年级并能选择任意一科成绩排序,并输出排序后的年级文件. 
4.能实现查询功能.可选择名字,也可选择某一科成绩项进行查询. 
5.能实现统计某学生的总成绩和平均成绩. 
6.能实现统计某班同学的总成绩和平均成绩. 
7.能实现统计某年级的总成绩和平均成绩. 


我贴出这篇帖子关键是想学学一些编程思路,希望能有对每一条语句的解释。

谢谢各位高人出谋划策!!

------解决方案--------------------
前几天不是给你贴了一个吗?哪看不懂?
C/C++ code

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define STUDENT struct student
#define LEN sizeof(STUDENT)
#include<stdarg.h>
#include <stdlib.h>
#include <conio.h>     
STUDENT 
{      
    long num;
    char name[5];
    int math;
    int english;
    int chengxu;
    int average;
    STUDENT *next;
};
int n=0;     
void menu()  
{
    printf("                  **************成绩管理系统**************\n");
    printf("                  *\t1--成绩输入\t2--显示成绩      *\n");
    printf("                  *\t3--成绩查询\t4--删除成绩      *\n");
    printf("                  *\t5--排列成绩\t6--插入成绩      *\n");
    printf("                  *\t0--退出 \t7--保存于文件中  *\n"); 
    printf("                  ****************************************\n");
    printf("请选择(0--7):");
}
char choice()
{
    char select=getche();        
    return (select);
}

STUDENT *create()
{ 
    STUDENT *head,*p1,*p2;   
    p1=p2=(STUDENT *)malloc(LEN);
    scanf("%ld %s %d %d %d",&p1->num,p1->name,&p1->math,&p1->english,&p1->chengxu);
    p1->average=(p1->math+p1->english+p1->chengxu)/3;
    head=NULL;
    while (p1->num!=0)
    {
        n++;
        if(n==1)
            head=p1;  
        else
            p2->next=p1;  
        p2=p1;
        p1=(STUDENT *) malloc(LEN);
        scanf("%ld %s %d %d %d",&p1->num,p1->name,&p1->math,&p1->english,&p1->chengxu);
        p1->average=(p1->math+p1->english+p1->chengxu)/3;
    }
    p2->next=NULL;  
    free(p1);
    printf("\n");
    return(head);
}

void print(STUDENT *head)//打印成绩信息
{  
    STUDENT *p;
    p=head;
    if(head!=NULL)
    {
        printf("\n全部成绩为:\n\n");
        printf("学号\t姓名\t数学\t英语\t程序\t平均分\n\n");
        do
        {
            printf("%ld\t%s\t%d\t%d\t%d\t%d\n", p->num, p->name,p->math,p->english,p->chengxu,p->average);
            p=p->next;
        }while(p!=NULL);
        printf("\n");
    }
    else
        printf("\n目前数据为空,还没有任何信息,请先创建成绩信息!\n\n");
}
void search(STUDENT *head,char nam[]) //根据姓名查找成绩信息
{
    STUDENT *p5;
    if(head==NULL)
    {
        printf("\n目前数据为空,还没有任何信息,请先创建成绩信息!\n\n");
        return;
    }
    p5=head;
    while(strcmp(p5->name,nam)&&p5->next!=NULL)
        p5=p5->next;
    if(strcmp(p5->name,nam)==0)
    {
        printf("\n该同学成绩信息为:\n\n");
        printf("学号\t姓名\t数学\t英语\t程序\t平均分\n");
        printf("%ld\t%s\t%d\t%d\t%d\t%d\n\n",p5->num, p5->name,p5->math,p5->english,p5->chengxu,p5->average);
    }
    else
        printf("\n没有找到该同学的成绩信息!\n\n");
}
STUDENT *del(STUDENT *head,long num)//根据学号删除学生信息
{
    STUDENT *p6,*p7;
    if(head==NULL)     
    {
        printf("\n删除失败!目前数据为空,还没有任何信息,请先创建成绩信息!\n");
        return (head);
    }
    p6=head;
    while(num!=p6->num &&p6->next!=NULL) 
    {
        p7=p6;
        p6=p6->next;
    }
    if(num==p6->num)
    {
        if(p6==head)
            head=p6->next;   
        else
            p7->next=p6->next;  
        printf ("\n已删除该名学生的成绩信息!\n");
        n--;
        
    }
    else
        printf ("\n没有找到该名学生的成绩信息!\n");
    return(head);
}
STUDENT *sort(STUDENT *head) //根据平均分排序
{
    STUDENT *temp,*t,*p3,*p4;
    temp=head;
    head=NULL;
    while(temp!=NULL)
    {
        t=temp;
        temp=temp->next;
        if(head!=NULL&&head->average<t->average)
        {
            p3=head;
            while(p3!=NULL&&p3->average<t->average)
            {
                p4=p3;
                p3=p3->next;
            }
            t->next=p3;
            p4->next=t;
        } 
        else
        {
            t->next=head;
            head=t;
        }
        
    }
    return(head);
}
STUDENT *insert( STUDENT *head, STUDENT *stud) //根据平均分插入成绩信息
{
    STUDENT *p3,*p4;
    if(head!=NULL&&head->average<stud->average)
    {
        p3=head;
        while(p3!=NULL&&p3->average<stud->average)
        {
            p4=p3;
            p3=p3->next;
        }
        stud->next=p3;
        p4->next=stud;
    } 
    else
    {
        stud->next=head;
        head=stud;
    }
    n++;
    return (head);
}
void save(STUDENT *head)  //存入文件
{
    FILE *fp;
    STUDENT *p;
    fp=fopen("d:\\student.txt","wb");
    if(fp==NULL)
    {
        printf("无法打开!");
        exit(0);
    }
    p=head;
    while(p!=NULL)
    {
        fwrite(p,LEN,1,fp);
        p=p->next;
    }
    fclose(fp);
}
STUDENT *load() //从文件中读取
{
    FILE *fp;
    STUDENT *q,*head=NULL;
    fp=fopen("d:\\student.txt","rb");
    if(fp==NULL)
    {
        return head;
    }
    while(!feof(fp))
    {
        q=(STUDENT *)malloc(LEN);
        if(fread(q,LEN,1,fp)==1)
        {
            q->next=head;
            head=q;
            n++;
        }
    }
    fclose(fp);
    return head;
}


int main(int argc, char *argv[])
{
    STUDENT *head,*stu;
    long del_num;
    char select,nam[5];
    select=0;
    head=load();
    while(select!='0')
    {
        system("cls");    
        menu();
        select=choice();
        switch(select)
        {
        case '0':
            printf("\n\n您选择的是退出,欢迎您今后再次使用,再见!\n\n\n");
            continue;
        case '1':
            printf("\n\n您选择的是成绩输入!\n");
            printf("\n请输入成绩!\n\n");
            printf("学号\t姓名\t数学\t英语\t程序\n");
            head=create();
            break;
        case '2':
            printf("\n\n您选择的是显示成绩!\n");
            print(head);
            break;
        case '3':
            printf("\n\n您选择的是成绩查询!\n");
            printf("\n请输入要查寻的姓名:");
            scanf("%s",nam);
            search(head,nam);
            break;
        case '4':
            printf("\n\n您选择的是删除成绩!\n");
            printf("\n请输入要删除同学的学号:");
            scanf("%ld",&del_num);
            head=del(head,del_num);
            printf("\n");
            break;
        case '5':
            printf("\n\n您选择的是排列成绩!\n");
            head=sort(head);
            printf("\n按平均分排列后的所有成绩为:\n");
            print(head);
            break;
        case '6':
            printf("\n\n您选择的是插入成绩!\n");
            printf("\n请输入插入成绩的信息!\n");
            printf("\n学号\t姓名\t数学\t英语\t程序\t平均分\n");
            stu=(STUDENT *)malloc(LEN);
            scanf("%ld %s %d %d %d",&stu->num,stu->name,&stu->math,&stu->english,&stu->chengxu);
            stu->average=(stu->math+stu->english+stu->chengxu)/3;
            head=insert(head,stu);
            printf("\n");
            break;
        case '7':
            printf("\n\n您选择的是在文件中保存成绩!\n");
            save(head);
            printf("\n保存成功!\n\n");
            break;
        default:
            printf("\n\n您的选择是错误的!\n\n");
        }
        system("PAUSE");
    }
    return (0);
}