功能有增删查改,排序,输出
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#define mian main
const int N = 1e5 + 5;
typedef struct stu {
char no[20], name[20];//学号,姓名
int Chinese, English, Math, C, Java;//几科的成绩
int totalScore;//总成绩
double avgScore;//平均成绩
struct stu* next;
}Node;
typedef struct _list {
Node* head;
Node* tail;
}List;
void swap_int(int *a,int *b)//交换两个int变量的函数
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void addStudent(List* pList) {//添加学生数据
Node *p = (Node*)malloc(sizeof(Node));
scanf("%s%s", &p->no, &p->name);
scanf("%d%d%d%d%d", &p->Chinese, &p->English, &p->Math, &p->C, &p->Java);
p->totalScore = p->Chinese + p->English + p->Math + p->C + p->Java;
p->avgScore = p->totalScore / 5.0;
p->next = NULL;
Node* last = pList->tail;
if (last) {
pList->tail->next = p;
pList->tail = p;
}else {
pList->head = p;
pList->tail = p;
}
}
void printStudent(List* pList) {//输出学生信息
Node *p = pList->head;
printf("*---------------------------------------------------------------------------------------*\n");
printf("|学号 |姓名 |语文 |数学 |英语 |C |Java |总成绩 |平均成绩|\n");
while (p != NULL) {
printf("*---------------------------------------------------------------------------------------*\n");
printf("|%-14s|%-9s|", p->no, p->name);
printf("%-8d|%-8d|%-8d|%-8d|%-8d|%-8d|%-8.2f|\n", p->Chinese, p->English, p->Math, p->C, p->Java, p->totalScore, p->avgScore);
p = p->next;
}
printf("*---------------------------------------------------------------------------------------*\n");
}
void changeStudent(List* pList) {//依据学号修改学生信息
int flag = 0;
char x[20];
printf("请输入要修改的学生学号\n");
scanf("%s", x);
Node* p = pList->head;
while (p != NULL) {
if (!strcmp(p->no, x)) {
printf("请输修改后的学生信息\n");
printf("依次输入学号,姓名,语文成绩,数学成绩,英语成绩,C语言成绩,Java语言成绩,用空格隔开。其他数据我将帮您自动完成\n");
scanf("%s%s", p->no, p->name);
scanf("%d%d%d%d%d", &p->Chinese, &p->English, &p->Math, &p->C, &p->Java);
p->totalScore = p->Chinese + p->English + p->Math + p->C + p->Java;
p->avgScore = p->totalScore / 5.0;
flag = 1;
break;
}
p = p->next;
}
if (flag) printf("修改成功!\n");
else printf("修改失败!找不到该学号的学生\n");
}
void sortStudent(List* pList){//依据不同依据排序
int op = 0, len = 0;
printf("请输入排序依据!\n");
printf("1.按总成绩升序\n");
printf("2.按总成绩降序\n");
printf("3.按姓名排序\n");
scanf("%d", &op);
Node* p = pList->head;
while(p){
len++;
p = p->next;
}
for(int i = 0; i < len - 1; i++){
p = pList->head;
for(int j = 0; j < len - i - 1; j++){
if((op == 1 && p->totalScore > p->next->totalScore) || (op == 2 && p->totalScore < p->next->totalScore) || (op == 3 && strcmp(p->name, p->next->name) > 0)){
char t[20];
strcpy(t, p->no);
strcpy(p->no, p->next->no);
strcpy(p->next->no, t);
strcpy(t, p->name);
strcpy(p->name, p->next->name);
strcpy(p->next->name, t);
swap_int(&p->Chinese, &p->next->Chinese);
swap_int(&p->Math, &p->next->Math);
swap_int(&p->English, &p->next->English);
swap_int(&p->C, &p->next->C);
swap_int(&p->Java, &p->next->Java);
swap_int(&p->totalScore, &p->next->totalScore);
double temp = p->avgScore;
p->avgScore = p->next->avgScore;
p->next->avgScore = temp;
}
p = p->next;
}
}
printf("排序完成!\n");
}
void searchStudent(List *pList){//依据学号查找学生信息
int flag = 0;
char x[20];
printf("请输入要查找的学生学号\n");
scanf("%s", x);
Node* p = pList->head;
while (p != NULL) {
if (!strcmp(p->no, x)) {
printf("找到了!该学生信息为:\n");
printf("*---------------------------------------------------------------------------------------*\n");
printf("|学号 |姓名 |语文 |数学 |英语 |C |Java |总成绩 |平均成绩|\n");
printf("*---------------------------------------------------------------------------------------*\n");
printf("|%-14s|%-9s|", p->no, p->name);
printf("%-8d|%-8d|%-8d|%-8d|%-8d|%-8d|%-8.2f|\n", p->Chinese, p->English, p->Math, p->C, p->Java, p->totalScore, p->avgScore);
printf("*---------------------------------------------------------------------------------------*\n");
flag = 1;
break;
}
p = p->next;
}
if (!flag) printf("失败了!找不到该学号的学生\n");
}
void deleteStudent(List* pList) {//依据学号删除指定学生信息
int flag = 0;
char na[20];
printf("请输入要删除的学生的学号!\n");
scanf("%s", na);
Node *p = pList->head, *temp = NULL, *prev = NULL;
while (p != NULL) {
if (!strcmp(p->no, na)) {
if(p == pList->head){
free(pList->head);
pList->head = p->next;
}else{
if(p == pList->tail) pList->tail = prev;
temp = p;
p = p->next;
prev->next = p;
free(temp);
}
flag = 1;
break;
}
prev = p;
p = p->next;
}
if (flag) printf("删除成功!\n");
else printf("删除失败!找不到该学号的学生\n");
}
int main() {
List list;
list.head = list.tail = NULL;
int order = 0;
printf("*----------------------------------------------------------------*\n");
printf("| |\n");
printf("| 欢迎使用学生信息管理系统!请输入您想要进行的操作的指令 |\n");
printf("| |\n");
printf("*----------------------------------------------------------------*\n");
printf("| 1.添加学生信息 | 2.修改学生信息 |\n");
printf("*----------------------------------------------------------------*\n");
printf("| 3.排序 | 4.查找学生 |\n");
printf("*----------------------------------------------------------------*\n");
printf("| 5.删除学生 | 6.查看所有学生信息 |\n");
printf("*----------------------------------------------------------------*\n");
printf("| 0.退出管理程序 |\n");
printf("*----------------------------------------------------------------*\n");
printf(" ~☆made by moWhite\n");
while (1) {
printf("请输入操作指令!\n");
scanf("%d", &order);
switch (order) {
case 0:{
printf("系统已退出,欢迎下次使用!\n");
exit(0);
}
case 1: {
int cnt = 0;
printf("请输入要添加的学生数量\n");
scanf("%d", &cnt);
printf("请输入学生信息\n");
printf("依次输入学号,姓名,语文成绩,数学成绩,英语成绩,C语言成绩,Java语言成绩,用空格隔开。其他数据我将帮您自动完成\n");
while (cnt--) addStudent(&list);
printf("添加完成!\n");
break;
}
case 2: {
changeStudent(&list);
break;
}
case 3: {
sortStudent(&list);
break;
}
case 4: {
searchStudent(&list);
break;
}
case 5: {
deleteStudent(&list);
break;
}
case 6: {
printStudent(&list);
break;
}
}
printf("\n");
}
return 0;
}