程序还有待改进
  有空在该下 发过去看看
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define
  LEN
  sizeof( struct LNode )
struct Subject
{
    int credit;//学分
    int mark;//单科成绩分
};
typedef struct LNode
{
    char name[12];
    int number;
    struct Subject chinese;
    struct Subject english;
    struct Subject maths;
    struct LNode *next;
}*Student;
FILE *fp = NULL;
Student L = NULL;
 void Creat_File();//读取或建立文件信息操作
void Save_File();//保存信息至文件
 void Init();//初始化链表
void Insert();//添加学生信息
void Delete();//删除学生信息
void Output();//输出全部信息
void Change();//修改学生信息
void Credit_Ranking();//按学分平均排名从高到低排
 float Count_Credit( Student p );//计算同学的评价学分成绩
void Mark_Ranking();//按总分进行排名 从高到低
 int Count_Mark( Student p );//计算每位同学的总分
void Lesson_Analysis();//选择一门课程进行分析 并画出直方图
int main()
{
    Init();
    Creat_File();
    
    while(1)
    {
        int i;
        printf("\n请按照下面提示进行相应的操作!\n");
        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("*按'9'推出系统*\n");
        scanf("%d", &i );
        switch( i )
        {
        case 1:
            Insert();
            break;
        case 2:
            Delete();
            break;
        case 3:
            Output();
            break;
        case 4:
            Change();
            break;
        case 5:
            Credit_Ranking();
            break;
        case 6:
            Mark_Ranking();
            break;
        case 7:
            Lesson_Analysis();
            break;
        case 8:
            Save_File();
            break;
        case 9:
            exit(0);
            break;
        }
    }
    return 0;
}
//读取或建立文件信息操作
void Creat_File()
{
    Student p;
    if( !(fp=fopen("d:\\studentmg.text", "r")) )
    {
        //fp=fopen("d:\\studentmg.text", "w");
        return;
    }
    else
    {
        while( !feof(fp) )
        {
            p = (Student) malloc (LEN);
            fread( p, LEN, 1, fp );
    
            p->next = L->next;
            L->next = p;
        }
    }
    fclose( fp );
}
//保存信息至文件
void Save_File()
{
    Student p = L->next;
    fp = fopen("d:\\studentmg.text", "w");
    while( p )
    {
        fwrite( p, LEN, 1, fp );
        p = p->next;
    }
    fclose( fp );
}
//初始化链表
void Init()
{
    L = (Student) malloc (LEN);
    if( !L )
        exit(0);
    L->next = NULL;
}
//添加学生信息
void Insert()
{
    Student p;
    int amount;
    printf("输入要添加学生信息的人数:");
    scanf("%d", &amount );
    while( amount-- )
    {
        p = (Student) malloc (LEN);
        printf("输入学生姓名:");
        scanf("%s", p->name );
        printf("输入学生的学号:");
        scanf("%d", &p->number );
        printf("分别输入语文学分和成绩:");
        scanf("%d%d", &p->chinese.credit, &p->chinese.mark );
        printf("分别输入英语学分和成绩:");
        scanf("%d%d", &p->english.credit, &p->english.mark );
        printf("分别输入数学学分和成绩:");
        scanf("%d%d", &p->maths.credit, &p->maths.mark );
        
        p->next = L->next;
        L->next = p;
    }
}
//删除学生信息
void Delete()
{
    Student p = L->next, f = L;
    int num;
    if( !p )
    {
        printf("系统中没有存储学生信息!");
        return;
    }
    printf("输入要删除学生的学号:");
    scanf("%d", &num );
    while( p && (p->number!=num) )
    {
        f = f->next;
        p = p->next;
    }
    if( !p )
        printf("没有查到该学生的信息!");
    else
        f->next = p->next;
    free( p );
    printf("删除成功!\n");
}
//输出全部信息
void Output()
{
    Student p = L->next;
    if( !p )
    {
        printf("系统中没有存储学生信息!");
        return;
    }
    while( p != NULL )
    {
        printf("学生姓名:%s\n", p->name );
        printf("学生的学号:%d\n", p->number );
        printf("语文学分和成绩:%d %d\n", p->chinese.credit, p->chinese.mark );
        printf("英语学分和成绩:%d %d\n", p->english.credit, p->english.mark );
        printf("数学学分和成绩:%d %d\n", p->maths.credit, p->maths.mark );
        p = p->next;
    }
    free(p);
}
    
//修改学生信息
void Change()
{
    Student p = L->next;
    int num;
    if( !p )
    {
        printf("系统中没有存储学生信息!");
        return;
    }
    printf("输入你要查找学生的学号:");
    scanf("%d", &num );
    while( p && (p->number!=num) )
        p = p->next;
    if( !p )
        printf("没有查到该学生的信息!");
    else
    {
        printf("输入修改学生姓名为:");
        scanf("%s", p->name );
        printf("输入修改学生的学号为:");
        scanf("%d", &p->number );
        printf("分别输入修改语文学分和成绩为:");
        scanf("%d%d", &p->chinese.credit, &p->chinese.mark );
        printf("分别输入修改英语学分和成绩为:");
        scanf("%d%d", &p->english.credit, &p->english.mark );
        printf("分别输入修改数学学分和成绩为:");
        scanf("%d%d", &p->maths.credit, &p->maths.mark );
    }
}
//按学分平均排名从高到低排
void Credit_Ranking()
{
    Student p = L->next, pf = p->next;
    void Exchang( Student &p1, Student &p2 );
    if( !p )
    {
        printf("系统中没有存储学生信息!");
        return;
    }
    while( p )
    {
        pf = p->next;
        while( fp )
        {
            if(
  Count_Credit(p) < Count_Credit(pf) )
                Exchang(p, pf);
            pf = pf->next;
        }
        p = p->next;
    }
}
//计算同学的平均学分成绩
float Count_Credit( Student p )
{
    float sum = 0.0;
    int total = 0;
    total += p->maths.credit * p->maths.mark;
    total += p->english.credit * p->english.mark;
    total += p->chinese.credit * p->chinese.mark;
    sum += float(p->maths.credit + p->english.credit + p->chinese.credit);
    sum = total/sum;
    return sum;
}
//按总分进行排名 从高到低
void Mark_Ranking()
{
    void Exchang( Student &p1, Student &p2 );
    Student p = L->next, pf = L->next;
    if( !p )
    {
        printf("系统中没有存储学生信息!");
        return;
    }
    while( p )
    {
        pf = p->next;
        while( pf )
        {
            if(
  Count_Mark(p) < Count_Mark(pf) )
                Exchang(p, pf);
            pf = pf->next;
        }
        p = p->next;
    }
}
//计算每位同学的总分
int Count_Mark( Student p )
{
    int total = 0;
    total +=
  p->maths.mark;
    total +=
  p->english.mark;
    total +=
  p->chinese.mark;
    return total;
}
//选择一门课程进行分析 并画出直方图
void Lesson_Analysis()
{
    char string[10];
    int a[6] = {0,0,0,0,0,0};
    Student p = L->next;
    if( !p )
    {
        printf("系统中没有存储学生信息!");
        return;
    }
    printf("输入你要统计的课程名(english, chinese, maths):");
    scanf("%s", string );
    if( strcmp(string, "english") == 0 )
    {
        while( p )
        {
            a[0]++;
            if( (90<=p->english.mark) && (p->english.mark<=100) )
                a[1]++;
            if( (80<=p->english.mark) && (p->english.mark<=89) )
                a[2]++;
            if( (70<=p->english.mark) && (p->english.mark<=79) )
                a[3]++;
            if( (60<=p->english.mark) && (p->english.mark<=69) )
                a[4]++;
            if( p->english.mark<60 )
                a[5]++;
            p = p->next;
        }
    }
    else if( strcmp(string, "maths") == 0 )
    {
        while( p )
        {
            a[0]++;
            if( (90<=p->maths.mark) && (p->maths.mark<=100) )
                a[1]++;
            if( (80<=p->maths.mark) && (p->maths.mark<=89) )
                a[2]++;
            if( (70<=p->maths.mark) && (p->maths.mark<=79) )
                a[3]++;
            if( (60<=p->maths.mark) && (p->maths.mark<=69) )
                a[4]++;
            if( p->maths.mark<60 )
                a[5]++;
            p = p->next;
        }
    }
    else if( strcmp(string, "chinese") == 0 )
    {
        while( p )
        {
            a[0]++;
            if( (90<=p->chinese.mark) && (p->chinese.mark<=100) )
                a[1]++;
            if( (80<=p->chinese.mark) && (p->chinese.mark<=89) )
                a[2]++;
            if( (70<=p->chinese.mark) && (p->chinese.mark<=79) )
                a[3]++;
            if( (60<=p->chinese.mark) && (p->chinese.mark<=69) )
                a[4]++;
            if( p->chinese.mark<60 )
                a[5]++;
            p = p->next;
        }
    }
    else 
        return;
    for(int i=1; i<6; i++)
    {
        int j = a[i];
        while( j )
        {
            --j;
            putchar(3);
        }
        printf("%4.2f%c\n", float(a[i]/a[0])*100, 37 );
    }
}
void Exchang( Student &p1, Student &p2 )
{
    struct LNode temp;
    strcpy(temp.name , p1->name);
    strcpy(p1->name, p2->name);
    strcpy(p2->name, temp.name);
    temp.number = p1->number;
    p1->number = p2->number;
    p2->number = temp.number;
    temp.chinese.credit = p1->chinese.credit;
    p1->chinese.credit = p2->chinese.credit;
    p2->chinese.credit = temp.chinese.credit;
    temp.chinese.mark = p1->chinese.mark;
    p1->chinese.mark = p2->chinese.mark;
    p2->chinese.mark = temp.chinese.mark;
    temp.english.credit = p1->english.credit;
    p1->english.credit = p2->english.credit;
    p2->english.credit = temp.english.credit;
    temp.english.mark = p1->english.mark;
    p1->english.mark = p2->english.mark;
    p2->english.mark = temp.english.mark;
    temp.maths.credit = p1->maths.credit; 
    p1->maths.credit =
     p2->maths.credit;
    p2->maths.credit = temp.maths.credit;
    temp.maths.mark = p1->maths.mark; 
    p1->maths.mark =
     p2->maths.mark;
    p2->maths.mark = temp.maths.mark;
}