vlambda博客
学习文章列表

C语言写的一个学生成绩管理系统

总第三篇


今天想分享一下前几周用C语言写的一个简易学生成绩管理系统,主要是想提高链表的运用熟练度,所用到的知识包括单链表的遍历、增删以及替换等。


下图是整个程序界面的大致情况,接下来笔者就按功能逐一阐述。



C语言写的一个学生成绩管理系统


C语言写的一个学生成绩管理系统


首先是定义一个储存学生信息的结构体,笔者定义了学生的姓名、学号、语文成绩、数学成绩、英语成绩以及平均成绩。


   
     
     
   
  1. struct student{
  2.     int name[10];
  3.     int id;
  4.     int chinese;
  5.     int math;
  6.     int english;
  7.     double average;
  8. };


接着再定义链表的结点,数据域定义为学生信息结构体的一个变量,这里推荐重新定义一个变量表示结点结构体,以免将其与学生信息结构体混淆。


   
     
     
   
  1. typedef struct stu{
  2.     struct student data;
  3.     struct stu *next;
  4. }Student;



   
     
     
   
  1. Student *createlist(){
  2.     Student *head = (Student*)malloc(sizeof(Student));
  3.     head->next = NULL;
  4.     return head;
  5. }



第一个功能是学生的增添,也即链表的插入,一般链表的插入分为头插、中间插、尾插,笔者采用头插。


   
     
     
   
  1. Student *Add(Student *head,struct student datas){    //链表插入

  2.     Student *node = (Student*)malloc(sizeof(Student));

  3.     node->next = head->next;

  4.     head->next = node;

  5.     node->data = datas;

  6.     return node;

  7. }



   
     
     
   
  1. void Delete(Student *head,int id){  //链表结点的删除

  2.     Student *pMoveFront = head;

  3.     Student *pMove = head->next;

  4.     if(pMove==NULL){

  5.         printf("系统为空,删除失败\n\n");

  6.     }else{

  7.         while(pMove->data.id!=id){

  8.         pMoveFront = pMove;

  9.         pMove = pMove->next;

  10.     }

  11.     if(pMove==NULL){

  12.         printf("查无结果\n\n");

  13.     }else{

  14.         pMoveFront->next = pMove->next;

  15.         free(pMove);

  16.         printf("已删除\n\n");

  17.         }

  18.     }

  19. }


查询和打印功能比较简单。打印关键是链表的遍历,查询说到底也是,而且查询与删除功能不同的是,查询时不需要用到上一个结点,所以直接遍历就可,程序要求传入学生的学号,若查询成功则返回该学生所有信息,失败则返回查询失败。


排序输出是笔者花费较长时间思考的一个环节。笔者共设置了按学号、单科成绩以及平均成绩的排序输出,本来想着按照删除链表结点的方式更改结点的指针,多次尝试失败后改用修改结点的数据,至于排序算法则是复杂度较高的选择排序(可用冒泡排序、插入排序等尝试)


   
     
     
   
  1. while(pMoveFront->next!=NULL){  //链表排序
  2.     while(pMove!=NULL){
  3.     if(i==1){    //按学号排序
  4.         int j = pMove->data.id;
  5.         int k = pMoveFront->data.id;
  6.         if(j<k){
  7.             struct student datas = pMove->data;
  8.             pMove->data = pMoveFront->data;
  9.             pMoveFront->data = datas;
  10.             }
  11.         }
  12.     if(pMoveFront->next==NULL){
  13.         break;
  14.     }
  15.     pMoveFront = pMoveFront->next;
  16.     pMove = pMoveFront->next;
  17.     }
  18. }


最后是修改功能。修改功能和查询功能类似,就是遍历链表,修改既定结点的数据。


 (完)