其中最核心的部分是排序部分。(交换的是节点,我认为是清晰易懂)
#include<stdio.h>
#define number 12
int fflush(FILE*);
struct student *head = NULL, *next = NULL, *guochen = NULL;
struct student
{
char name[20];
int id;
int chinese;
int math;
int c;
struct student *end;
};
void fuzhi()
{
guochen = (struct student *)malloc(sizeof(struct student));
head = guochen;
guochen->name[0] = 'y';
guochen->name[1] = 'y';
guochen->name[2] = 'k';
guochen->name[3] = '\0';
guochen->id = 2017211199;
guochen->chinese = 98;
guochen->math = 99;
guochen->c = 60;
guochen->end = NULL;
next = guochen;
guochen = (struct student *)malloc(sizeof(struct student));
next->end = guochen;
guochen->name[0] = 'w';
guochen->name[1] = 'm';
guochen->name[2] = 'y';
guochen->name[3] = '\0';
guochen->id = 2017211156;
guochen->chinese = 96;
guochen->math = 92;
guochen->c = 95;
guochen->end = NULL;
next = guochen;
}
void fuction()//函数初始化
{
void fuzhi();
void show();
void jieguo();
void shanchu();
int tianjia();
void pinjun();
void maopao();
}
int main()
{
int choice;
int connst = 2;
fuction();
fuzhi();
show();
while (scanf("%d", &choice) == 1)
{
switch (choice)
{
case 1:jieguo(); break;
case 2:shanchu(); break;
case 3:maopao(connst); break;
case 4:pinjun(); break;
case 5:connst=tianjia(); break;
case 0: {
printf("\n\n\n\n\t\t\t\t\t\t【欢迎再次使用】\n\n\n");
system("pause");
exit(0); }; break;
default:printf("请按要求输入\a\n");
}
show();
}
system("pause");
}
void show()//初始界面
{
for (int i = 0; i < 8; i++)
{
printf("------------------------");
}
printf("\n\n");
printf("\t\t\t\t\t\t\t\t\t\t\t学生信息管理系统\n\n");
for (int i = 0; i < 8; i++)
{
printf("------------------------");
}
printf("\n");
printf("【欢迎使用学生成绩管理系统】\n");
printf("[1] [显示所有学生信息]\n");
printf("[2] [删除学生信息]\n");
printf("[3] [对学生信息进行排序]\n");
printf("[4] [求平均分]\n");
printf("[5] [录入学生信息]\n");
printf("[0] [退出程序]\n");
printf("[请输入您的选择](0 - 5):");
}
void jieguo()//显示结果
{
printf("\n【姓名】\t\t【学号】\t\t【语文成绩】\t【数学成绩】\t【C语言】\n");
guochen = head;
while (guochen != NULL)
{
printf("%s\t\t\t%d\t\t %d\t\t %d \t\t%d\n", guochen->name, guochen->id, guochen->chinese, guochen->math, guochen->c);
guochen = guochen->end;
}
}
void shanchu()//删除某个成员
{
char str[20] = { NULL };
struct student *y, *u, *prep;
guochen = head;
prep = guochen;
y = guochen;
u = prep;
char *q = NULL, *p = NULL;
int xc = 0, k = 0, c, *m=0, i = 0, n = 0, l;
p = guochen->name;
l = guochen->id;
printf("[1] [按姓名删除某个学生信息]\n");
printf("[2] [按学号删除某个学生信息]\n");
scanf("%d", &c); fflush(stdin);
switch (c)
{
case 1: {
printf("[请输入你所要删除的信息的学生的名字!]:");
scanf("%s", str); fflush(stdin);
q = str;
while (guochen != NULL)
{
while ((!(xc = *p - *q)) && *p)
{
*q++;
*p++;
}
if (xc == 0)
{
if (guochen == head)
{
prep = guochen->end;
y = prep;
}
else
{
prep->end = guochen->end;
i++;
}
}
if (i == 0 && n > 0)
{
prep = prep->end;
}
guochen = guochen->end;
p = guochen->name;
q = str;
i = 0;
n++;
}
head = y;
jieguo();
}break;
case 2:
{
printf("[请输入你所要删除的信息的学生的学号]:");
scanf("%d", &k); fflush(stdin);
m = &k;
while (guochen != NULL)
{
if (l == *m)
{
if (guochen == head)
{
prep = guochen->end;
y = prep;
}
else
{
prep->end = guochen->end;
i++;
}
}
if (i == 0 && n > 0)
{
prep = prep->end;
}
guochen = guochen->end;
if (guochen == NULL)break;//防止出现内存错误
l = guochen->id;
i = 0;
n++;
}
head = y;
jieguo();
}break;
default:printf("[输入错误,已返回主菜单!]\n\a");
}
}
int tianjia()//添加某个信息
{
int i=0, b;
printf("你想要添加几组学生的信息?\n");
guochen = head;
scanf("%d", &b); fflush(stdin);
while(guochen!=NULL)
{
i++;
guochen = guochen->end;
}
printf("\n\t\t【姓名】 【学号】 【语文成绩】 【数学成绩】 【C语言】\n");
for (int j = i; j<i + b; j++)
{
guochen = (struct student *)malloc(sizeof(struct student));
if (head == NULL)
head = guochen;
else
next->end = guochen;
guochen->end = NULL;
printf("第[%d]组:\t", j + 1);
scanf("%s", guochen->name);
scanf("%d", &guochen->id);
scanf("%d", &guochen->chinese);
scanf("%d", &guochen->math);
scanf("%d", &guochen->c);
next = guochen;
}
printf("[添加成功!!!]\n");
return i;
}
void maopao(int x)//排序,最核心的部分
{
struct student *p, *q, *temp = NULL, *prep, *tail, *subHead, *b, *v = NULL, *t;
int c;
printf("[1] [按学号对学生排序]\n");
printf("[2] [按语文成绩对学生排序]\n");
printf("[3] [按数学成绩对学生排序]\n");
printf("[4] [按c语言成绩对学生排序]\n");
scanf("%d", &c); fflush(stdin);
prep = head;
b = head;
p = prep;
q = prep->end;
for (int i = 0; i < x + 1; i++)
{
while (q != NULL)
{
switch (c)
{
case 1:
{
if (p->id > q->id)
{
if (p == b)
{
p->end = q->end;
q->end = p;
head = q;
prep = head;
p = head;
b = head;
q = head->end;
}
else if (p != b)
{
p->end = q->end;
q->end = p;
head->end = q;
head = head->end;
p = head;
q = head->end;
}
}
}break;
case 2:
{
if (p->chinese > q->chinese)
{
if (p == b)//开头排序情况
{
p->end = q->end;
q->end = p;
head = q;
prep = head;
p = head;
b = head;
q = head->end;
}
else if (p != b)//中间过程
{
p->end = q->end;
q->end = p;
head->end = q;
head = head->end;
p = head;
q = head->end;
}
} }break;
case 3:
{
if (p->math > q->math)
{
if (p == b)
{
p->end = q->end;
q->end = p;
head = q;
prep = head;
p = head;
b = head;
q = head->end;
}
else if (p != b)
{
p->end = q->end;
q->end = p;
head->end = q;
head = head->end;
p = head;
q = head->end;
}
} }break;
case 4:
{
if (p->c > q->c)
{
if (p == b)
{
p->end = q->end;
q->end = p;
head = q;
prep = head;
p = head;
b = head;
q = head->end;
}
else if (p != b)
{
p->end = q->end;
q->end = p;
head->end = q;
head = head->end;
p = head;
q = head->end;
}
}
}break;
default:printf("[输入错误,已返回主菜单!]\a\n");
}
p = p->end;
q = q->end;
}
head = prep;
p = prep;
q = prep->end;
}
jieguo();
}
void pinjun()//求平均值
{
float guide = 0;
int k = 0,c;
printf("[1] [语文平均分]\n");
printf("[2] [数学平均分]\n");
printf("[3] [C语言平均分]\n");
scanf("%d", &c); fflush(stdin);
guochen = head;
while (guochen != NULL)
{
k++;
switch (c)
{
case 1:
{
guide = guochen->chinese + guide;
}break;
case 2:
{
guide = guochen->math + guide;
}break;
case 3:
{
guide = guochen->c + guide;
}break;
}
guochen = guochen->end;
}
if (c == 1)printf("语文成绩的总平均为[%f]\n", guide / k);
else if (c == 2)printf("数学成绩的总平均为[%f]\n", guide / k);
else if (c == 3)printf("C语言成绩的总平均为[%f]\n", guide / k);
else cv:printf("[输入错误,已返回主菜单!]\a\n");
}