比我的学生系统你吧,你改下就差不多少~~~
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
typedef struct Student{
            //链表的数据结构
    int number ;
    char name[20] ;
    char grad[20] ;
    char profess[30] ;
    float score[5] ;
    struct Student *next ;
  
}Student,*LinkList;
void CreateList(LinkList &T){
        //初始化链表
    T = (LinkList)malloc(sizeof(Student)) ;
    T->next = NULL; 
        
}
void print(LinkList T){
    //把链表的数据输出
    LinkList p = T ;
    int j=0 ; 
    if(p->next){
        while(p->next){
            p = p->next ;
            printf("学号: %d,姓名: %s,年级: %s,专业: %s 成绩 :(%3.2f
  %3.2f
  %3.2f)
  \n",
                            p->number,p->name,p->grad,p->profess,p->score[0],p->score[1],p->score[2]) ;
        }
    }else{
        printf("没有数据可输出!!!\n") ;
    }
}
void RearInsert(LinkList &T){
        //尾插入结点
    int number ;
    char chars[3][20] ;
    float score[3] ;
    LinkList p = T;
    printf("请输入要添加的记录: \n") ;
    printf("\n请以(25 梁卓文 大二 计算机 100 89 87)的形式输入学生资料: \n") ;
                scanf("%d %s %s %s %f %f %f",&number,chars[0],chars[1],chars[2],&score[0],&score[1],&score[2]) ;
    while(p->next){
    //找到最后一个结点
        p=p->next ;
    }
    LinkList q = (LinkList)malloc(sizeof(Student)) ;
    strcpy(q->name,chars[0]) ; strcpy(q->grad,chars[1]) ;strcpy(q->profess,chars[2]) ;
    q->number = number ;
    q->score[0] = score[0] ;
    q->score[1] = score[1] ;
    q->score[2] = score[2] ;
    q->score[3] = (q->score[0]+q->score[1]+q->score[2])/3 ;
    q->score[4] = (q->score[0]+q->score[1]+q->score[2]) ;
    p->next = q ;
    q->next = NULL ;
    printf("添加后为: \n") ;
    print(T) ;
}
void NumberDelete(LinkList &T){
    //删除给出学号的结点,找不到则不做任何操作
    int number ;
    printf("\n请输入要删除的学号 :") ;
    scanf("%d",&number) ;
    if (T->next){
        if (number>0){
            LinkList p = T ;
            if (T->next->next==NULL&&T->next->number==number){
                free(T->next) ;
                T->next =NULL ;
                return ;
        //删了就跳出函数
            }
            while (p->next){
                if (p->next->number==number){
                    LinkList q = p->next ;
        //记录下p->next结点
                    p->next = q ->next ;
                    free(q) ;
                    return ;
        //删了就跳出函数
                }
                p = p->next ;
        
            }
            printf("没有可删除的学号!!!") ;
        }else
            printf("学号有错误!!!") ;
    }else 
        printf("链表为空!!!") ;
}
void NameDelete(LinkList &T){
    //删除给出姓名的结点,找不到则不做任何操作
    char name[20] ;
    printf("\n请输入要删除的姓名 :") ;
    scanf("%s",name) ;
    if (T->next){
        
        LinkList p = T ;
        if (T->next->next==NULL&&strcmp(T->next->name,name)==0){
            free(T->next) ;
            T->next =NULL ;
            return ;
        //删了就跳出函数
        }
        while (p->next){
            if (strcmp(T->next->name,name)==0){
                LinkList q = p->next ;
        //记录下p->next结点
                p->next = q ->next ;
                free(q) ;
                return ;
        //删了就跳出函数
            }
            p = p->next ;
        
        }//while
        printf("没有可删除的姓名!!!") ;
        
    }else 
        printf("链表为空!!!") ;
}
void Delete(LinkList &T){
        //调用上面两个删除函数
    int n=0 ;
    printf("请选择查找的方法: 1.学号 2.姓名 : ") ;
    scanf("%d",&n) ;
    if (n==1){
        NumberDelete(T) ;
    }
    if (n==2){
        NameDelete(T) ;
    }
    printf("\n删除后为: \n") ; 
    print(T) ; 
}
void SeachNumber(LinkList T){
    //按学号查找并修改
    if (T->next==NULL){
        printf("链表为空没有数据!!!\n") ;
        return
  ;
    }
    int n,m,number ;
    char chars[20] ;
    float score=0.0 ;
    LinkList p = T ;
    printf("\n请输入要修改的学生学号 :") ;
    scanf("%d",&number) ;
    while (p->next){
                
            p=p->next ;
            if (p->number==number){
    
                printf("找到的资料: \n") ;
                printf("学号: %d,姓名: %s,年级: %s, 专业: %s,三门成绩:(%3.2f,%3.2f,%3.2f)\n",
                            p->number,p->name,p->grad,p->profess,p->score[0],p->score[1],p->score[2]) ;
                do{
                    printf("------------------------\n") ;
                    printf("
    你要修改?
        \n") ;
                    printf("
    1.学号
   2.姓名
    \n") ;
                    printf("
    3.年级
   4.专业
        \n") ;
                    printf("
    5.成绩1
  6.成绩2
     \n") ;
                    printf("
    7.成绩3
              \n") ;
                    printf("
    0.退出修改
            \n") ;
        
                    printf("------------------------\n") ;
                    printf("输入你要选择的操作: ");
                    scanf("%d",&n) ;
                    switch(n){
                        case 1: printf("改为: ") ;scanf("%d",&m) ;p->number = m ;break ;
                        case 2: printf("改为: ") ;scanf("%s",chars) ;strcpy(p->name,chars) ;break ;
                        case 3: printf("改为: ") ;scanf("%s",chars) ;strcpy(p->grad,chars) ;break ;
                        case 4: printf("改为: ") ;scanf("%s",chars) ;strcpy(p->profess,chars) ;break ;
                        case 5: printf("改为: ") ;scanf("%f",&score) ;p->score[0] = score ;break ;
                        case 6: printf("改为: ") ;scanf("%f",&score) ;p->score[1] = score ;break ;
                        case 7: printf("改为: ") ;scanf("%f",&score) ;p->score[2] = score ;break ;
                        case 0: return ;
                        default: printf("请正确输入!!!");break ;
                    }
                    printf("\n改后为: \n") ;printf("学号: %d,姓名: %s,年级: %s, 专业: %s,三门成绩:(%3.2f,%3.2f,%3.2f)\n",
                    p->number,p->name,p->grad,p->profess,p->score[0],p->score[1],p->score[2]) ;
                    
                }while (1);
            }
        }
        printf("找不到数据!!!") ;
}
void SeachName(LinkList T){
    //按姓名查找并修改
    if (T->next==NULL){
        printf("链表为空没有数据!!!\n") ;
        return
  ;
    }
    int n,m ;
    char chars[20],name[20] ;
    float score=0.0 ;
    LinkList p = T ;
    printf("\n请输入要修改的学生的姓名 :") ;
    scanf("%s",name) ;
    while (p->next){
                
            p=p->next ;
            if (strcmp(p->name,name)==0){
    
                printf("找到的资料: \n") ;
                printf("学号: %d,姓名: %s,年级: %s, 专业: %s,三门成绩:(%3.2f,%3.2f,%3.2f)\n",
                            p->number,p->name,p->grad,p->profess,p->score[0],p->score[1],p->score[2]) ;
                do{
                    
                    printf("------------------------\n") ;
                    printf("
    你要修改?
        \n") ;
                    printf("
    1.学号
    2.姓名
    \n") ;
                    printf("
    3.年级
    4.专业
    \n") ;
                    printf("
    5.成绩1
   6.成绩2
     \n") ;
                    printf("
    7.成绩3
              \n") ;
                    printf("
    0.退出修改
            \n") ;
        
                    printf("------------------------\n") ;
                    printf("输入你要选择的操作: ");
                    scanf("%d",&n) ;
                    switch(n){
                        case 1: printf("改为: ") ;scanf("%d",&m) ;p->number = m ;break ;
                        case 2: printf("改为: ") ;scanf("%s",chars) ;strcpy(p->name,chars) ;break ;
                        case 3: printf("改为: ") ;scanf("%s",chars) ;strcpy(p->grad,chars) ;break ;
                        case 4: printf("改为: ") ;scanf("%s",chars) ;strcpy(p->profess,chars) ;break ;
                        case 5: printf("改为: ") ;scanf("%f",&score) ;p->score[0] = score ;break ;
                        case 6: printf("改为: ") ;scanf("%f",&score) ;p->score[1] = score ;break ;
                        case 7: printf("改为: ") ;scanf("%f",&score) ;p->score[2] = score ;break ;
                        case 0: return ;
                        default: printf("请正确输入!!!");break ;
                    }
                    printf("\n改后为: \n") ;printf("学号: %d,姓名: %s,年级: %s, 专业: %s,三门成绩:(%3.2f,%3.2f,%3.2f)\n",
                    p->number,p->name,p->grad,p->profess,p->score[0],p->score[1],p->score[2]) ;
                }
                while (1);
            }
            
        }
        printf("找不到数据!!!") ;
}
void Revise(LinkList &T){
    //修改函数,调用上面两个函数
    int n=0 ;
    printf("请选择查找的方法: 1.学号 2.姓名 : ") ;scanf("%d",&n) ;
    if (n==1){
    SeachNumber(T) ;
    }
    if (n==2){
        SeachName(T) ;
    } 
    printf("\n修改后为: \n") ; 
    print(T) ;
}
void ScoreSort(LinkList &L){
    //按成绩排序(交换指针排序)
    if (L->next){
        LinkList p1,p10,p2,p20;
        
        LinkList pt,pm0,pm;
        float x;
        p10=L;
        p1=L->next;
    
        while(p1->next){
            x=p1->score[3];
            p20=p1;
            p2=p1->next;
     
            while(p2){
                
                if(x-p2->score[3]<0.01){
        
                    x=p2->score[3];
                    pm0=p20;
                    pm=p2;
                }
                p20=p20->next;
                p2=p20->next;
            }//whlie
            if(x-(p1->score[3])<-0.01||x-(p1->score[3])>0.01){
                if(pm==p1->next){
                    p10->next=pm;
                    pt=pm->next;
                    pm->next=p1;
     
                    p1->next=pt;
                }else{
                    p10->next=pm;
                    pt=pm->next;
                    pm->next=p1->next;
                    pm0->next=p1;
                    p1->next=pt;
    
                }
            }//if
            p10=p10->next;
            p1=p10->next;
        }//while
    } //if
}
void Write(LinkList T){
  //写入文件
    FILE *fp ;
    LinkList p = T->next;
    char stud[20] ;
    printf("请输入保存文件名: ") ;
    scanf("%s",stud) ;
    if((fp=fopen(stud,"w"))==NULL){
        printf("无法打开文件!!!") ;
        fclose(fp) ;
        return ;
        //退出函数
    }
    printf("\n你存入的数据为: \n") ;
    while (p){
        fprintf(fp,"%d %s %s %s %3.2f %3.2f %3.2f\n",
                    p->number,p->name,p->grad,p->profess,p->score[0],p->score[1],p->score[2]) ;
    
        printf("学号: %d,姓名: %s,年级: %s, 专业: %s,三门成绩:(%3.2f,%3.2f,%3.2f)\n",
                            p->number,p->name,p->grad,p->profess,p->score[0],p->score[1],p->score[2]) ;
        p = p->next ;
    }
    fclose(fp) ;
}
int sum;
    //用num来记录链表个数
void Read(float yun[]){
        //读取文件
    sum=0 ;
    FILE *out ;
    LinkList p = (LinkList)malloc(sizeof(Student)) ;//新建一个链表来存放读取的数据
    p->next = NULL ;
    char stud[20] ;
    printf("请输入要打开的文件名: ") ;
    scanf("%s",stud) ;
    if((out=fopen(stud,"r"))==NULL){
        printf("无法打开文件!!!") ;
        fclose(out) ;
        return ;
        //退出函数
    }
    printf("\n文件数据为: \n") ;
    while(!feof(out)){
        fscanf(out,"%d %s %s %s %f %f %f\n",
                    &p->number,p->name,p->grad,p->profess,&p->score[0],&p->score[1],&p->score[2])
    ;
    
        printf("学号: %d,姓名: %s,年级: %s, 专业: %s,三门成绩:(%3.2f,%3.2f,%3.2f)\n",
                            p->number,p->name,p->grad,p->profess,p->score[0],p->score[1],p->score[2]) ;
        yun[sum] = p->score[0]+p->score[1]+p->score[2] ;
        sum++ ;
    }
    fclose(out) ;
    
}
void HalfSort(float yun[],float score){
    //折半查找一个数据
    int i,m,low,high ;
    
    low = 0 ; high=sum ;
    //sum为读取数据时统计元素的个数
    
    while (low<=high){
        m= (low+high)/2 ;
        if (yun[m]==score){
            printf("总分为%3.2f的有一个人!!!",score) ;
            return ;
    //退出函数
        }
        if (yun[m]<score){
            high = m-1 ;
        }
        if (yun[m]>score){
            low = m+1 ;
        }
    }
    printf("没有人总分为: %3.2f",score) ;
}
void ReadAndSave(LinkList &T,float yun[]){
    //显示,保存
    int n=0 ;
    printf("现在有数据: \n") ;
    print(T) ;
    printf("\n请选择; 1.保存数据 2.打开数据") ;
    scanf("%d",&n) ;
    if (n==1)Write(T) ;
    if (n==2)Read(yun) ;
    if (n!=1&&n!=2)printf("输入错误!!!") ;
}
void SortAndSave(LinkList &T){
    //排序并保存
    int n =0 ;
    printf("请选择: 1.按平均分排序 2.按总分排序 : ") ;scanf("%d",&n) ;
    if (n==1){
        printf("\n按平均分排序后: \n") ;ScoreSort(T) ;print(T) ;Write(T) ;
    }
    if (n==2){
        printf("\n按总分排序后: \n") ;ScoreSort(T) ;print(T) ;Write(T) ;
    }
}
void Seach(LinkList &T,float yun[]){
    //查找给定的分数
    float score ;
    printf("请输入你要找的分数: ") ;
    scanf("%f",&score);printf("\n") ;
    Read(yun) ;
    HalfSort(yun,score) ;
}
void Enter(){
        //密码函数
    int number,i ;
    int mima=25 ;
    
    for (i=0;i<3 ;i++ ){
        printf("请输入密码: ") ;
        scanf("%d",&number) ;
        if (number==mima){
            printf("
  欢迎进入系统 \n") ;
            return ;
        }
        printf("你第%d次输入密码错误!!!\n",i+1) ;
    }
    exit(1) ;
}
void main(){
    float yun[MAX] ; //用于存放读取链表中的总分
    int c ;
    Enter() ;
    
    LinkList T ;
    CreateList(T) ;
    
    do{
        printf("--------------------------------\n") ;
        printf("(五)学生成绩管理系统
            \n") ;
        printf("
    1.添加记录
                    \n") ;
        printf("
    2.删除记录
                    \n") ;
        printf("
    3.修改记录
                    \n") ;
        printf("
    4.显示、保存记录
            \n") ;
        printf("
    5.排序并保存
                \n") ;
        printf("
    6.查询功能
                    \n") ;
        printf("
    7.输出全部
                    \n") ;
        printf("
    0.退出系统
                    \n") ;
        
        printf("--------------------------------\n") ;
        
        printf("输入你要选择的操作: ");
        scanf("%d",&c) ;
        
        switch (c){
        case 1: RearInsert(T) ;break ;
        case 2:
    Delete(T) ;break ;
        case 3:
    Revise(T) ;break ;
        case 4:
    ReadAndSave(T,yun) ;break ;
                
        case 5:
    SortAndSave(T) ;break ;
                         
        case 6: Seach(T,yun) ;break ;
        case 7: print(T) ;break ;
        case 0: return ;
        default :printf("请正确输入!!") ;break ;
        }
        putchar(10) ;
        getchar() ;
    }while (1);
}