C语言写的一个学生成绩管理系统
总第三篇
今天想分享一下前几周用C语言写的一个简易学生成绩管理系统,主要是想提高链表的运用熟练度,所用到的知识包括单链表的遍历、增删以及替换等。
下图是整个程序界面的大致情况,接下来笔者就按功能逐一阐述。
首先是定义一个储存学生信息的结构体,笔者定义了学生的姓名、学号、语文成绩、数学成绩、英语成绩以及平均成绩。
struct student{
int name[10];
int id;
int chinese;
int math;
int english;
double average;
};
接着再定义链表的结点,数据域定义为学生信息结构体的一个变量,这里推荐重新定义一个变量表示结点结构体,以免将其与学生信息结构体混淆。
typedef struct stu{
struct student data;
struct stu *next;
}Student;
Student *createlist(){
Student *head = (Student*)malloc(sizeof(Student));
head->next = NULL;
return head;
}
第一个功能是学生的增添,也即链表的插入,一般链表的插入分为头插、中间插、尾插,笔者采用头插。
Student *Add(Student *head,struct student datas){ //链表插入
Student *node = (Student*)malloc(sizeof(Student));
node->next = head->next;
head->next = node;
node->data = datas;
return node;
}
void Delete(Student *head,int id){ //链表结点的删除
Student *pMoveFront = head;
Student *pMove = head->next;
if(pMove==NULL){
printf("系统为空,删除失败\n\n");
}else{
while(pMove->data.id!=id){
pMoveFront = pMove;
pMove = pMove->next;
}
if(pMove==NULL){
printf("查无结果\n\n");
}else{
pMoveFront->next = pMove->next;
free(pMove);
printf("已删除\n\n");
}
}
}
查询和打印功能比较简单。打印关键是链表的遍历,查询说到底也是,而且查询与删除功能不同的是,查询时不需要用到上一个结点,所以直接遍历就可,程序要求传入学生的学号,若查询成功则返回该学生所有信息,失败则返回查询失败。
排序输出是笔者花费较长时间思考的一个环节。笔者共设置了按学号、单科成绩以及平均成绩的排序输出,本来想着按照删除链表结点的方式更改结点的指针,多次尝试失败后改用修改结点的数据,至于排序算法则是复杂度较高的选择排序(可用冒泡排序、插入排序等尝试)。
while(pMoveFront->next!=NULL){ //链表排序
while(pMove!=NULL){
if(i==1){ //按学号排序
int j = pMove->data.id;
int k = pMoveFront->data.id;
if(j<k){
struct student datas = pMove->data;
pMove->data = pMoveFront->data;
pMoveFront->data = datas;
}
}
if(pMoveFront->next==NULL){
break;
}
pMoveFront = pMoveFront->next;
pMove = pMoveFront->next;
}
}
最后是修改功能。修改功能和查询功能类似,就是遍历链表,修改既定结点的数据。
(完)