#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct Node {
char num[20];
char name[10];
char sex[5];
int chinese;
int math;
int english;
char birthday[10];
int age;
struct Node* next;
} Node;
Node* create_() {
Node* G;
G = (Node*)malloc(sizeof(Node));
G->next = NULL;
return G;
}
void add(Node* G) {
Node* p = G;
Node* q;
while (p->next) {
q = p;
p = p->next;
}
int i;
int count = 0;
puts("请输入添加的人数:");
scanf("%d", &count);
for (i = 0; i < count; i++) {
q = (Node*)malloc(sizeof(Node));
puts("请输入学生姓名:");
scanf("%s", q->name);
puts("请输入学生学号:");
scanf("%s", q->num);
puts("请输入学生性别:");
scanf("%s", q->sex);
puts("请输入学生年龄:");
scanf("%d", &q->age);
puts("请输入学生语文成绩:");
scanf("%d", &q->chinese);
puts("请输入学生数学成绩:");
scanf("%d", &q->math);
puts("请输入学生英语成绩:");
scanf("%d", &q->english);
puts("请输入学生出生日期:");
scanf("%s", q->birthday);
q->next = NULL;
p->next = q;
p = p->next;
}
puts("已添加!");
}
// 打印
void print(struct Node* G) {
printf("------------------------------------------------------------\n");
printf(" 学号 姓名 性别 年龄 语文 数学 英语 出生日期\n");
Node* p = G->next;
while (p) {
printf("%s %s %s %d %d %d %d ", p->num, p->name, p->sex, p->age, p->chinese, p->math, p->english);
int i;
for (i = 0; i < 4; i++) {
printf("%c", p->birthday[i]);
}
printf("-%c%c-%c%c\n", p->birthday[4], p->birthday[5], p->birthday[6], p->birthday[7]);
p = p->next;
}
printf("------------------------------------------------------------");
}
// 平均成绩
void average(struct Node* G) {
Node* p = G->next;
int count = 0;
double chinese = 0;
double math = 0;
double english = 0;
while (p) {
count++;
chinese += p->chinese;
math += p->math;
english += p->english;
p = p->next;
}
printf("语文平均成绩:%.2f\n数学平均成绩:%.2f\n英语平均成绩:%.2f", chinese / count, math / count, english / count);
}
// 删除
void delete(struct Node* G) {
Node* p = G->next;
Node* q = G;
puts("请输入要删除学生的学号:");
char num[20];
scanf("%s", num);
int flag = 0;
while (p) {
if (strcmp(p->num, num) == 0) {
q->next = p->next;
flag = 1;
}
q = p;
p = p->next;
}
if (flag) {
puts("已删除!");
print(G);
} else {
puts("未查询到该学号!");
}
}
// 按年级输出
void gradeprint(struct Node* G) {
Node* p = G->next;
int count = 0;
printf("------------------------------------------------------------\n");
printf(" 学号 姓名 性别 年龄 语文 数学 英语 出生日期\n");
while (p) {
if (strncmp(p->num, "2021", 4) == 0) {
printf("%s %s %s %d %d %d %d ", p->num, p->name, p->sex, p->age, p->chinese, p->math, p->english);
int i;
for (i = 0; i < 4; i++) {
printf("%c", p->birthday[i]);
}
printf("-%c%c-%c%c\n", p->birthday[4], p->birthday[5], p->birthday[6], p->birthday[7]);
count++;
}
p = p->next;
}
if (count) {
printf("以上为2021级学生共%d人!\n", count);
count = 0;
}
printf("------------------------------------------------------------\n");
p = G->next;
printf(" 学号 姓名 性别 年龄 语文 数学 英语 出生日期\n");
while (p) {
if (strncmp(p->num, "2020", 4) == 0) {
printf("%s %s %s %d %d %d %d ", p->num, p->name, p->sex, p->age, p->chinese, p->math, p->english);
int i;
for (i = 0; i < 4; i++) {
printf("%c", p->birthday[i]);
}
printf("-%c%c-%c%c\n", p->birthday[4], p->birthday[5], p->birthday[6], p->birthday[7]);
count++;
}
p = p->next;
}
if (count) {
printf("以上为2020级学生共%d人!\n", count);
count = 0;
}
printf("------------------------------------------------------------\n");
p = G->next;
printf(" 学号 姓名 性别 年龄 语文 数学 英语 出生日期\n");
while (p) {
if (strncmp(p->num, "2019", 4) == 0) {
printf("%s %s %s %d %d %d %d ", p->num, p->name, p->sex, p->age, p->chinese, p->math, p->english);
int i;
for (i = 0; i < 4; i++) {
printf("%c", p->birthday[i]);
}
printf("-%c%c-%c%c\n", p->birthday[4], p->birthday[5], p->birthday[6], p->birthday[7]);
count++;
}
p = p->next;
}
if (count) {
printf("以上为2019级学生共%d人!\n", count);
}
}
// 按性别输出
void sexprint(struct Node* G) {
Node* p = G->next;
int count = 0;
printf("------------------------------------------------------------\n");
printf(" 学号 姓名 性别 年龄 语文 数学 英语 出生日期\n");
while (p) {
if (strcmp(p->sex, "男") == 0) {
count++;
printf("%s %s %s %d %d %d %d ", p->num, p->name, p->sex, p->age, p->chinese, p->math, p->english);
int i;
for (i = 0; i < 4; i++) {
printf("%c", p->birthday[i]);
}
printf("-%c%c-%c%c\n", p->birthday[4], p->birthday[5], p->birthday[6], p->birthday[7]);
}
p = p->next;
}
if (count) {
printf("以上为男生共%d人!\n", count);
count = 0;
}
printf("------------------------------------------------------------\n");
printf(" 学号 姓名 性别 年龄 语文 数学 英语 出生日期\n");
p = G->next;
while (p) {
if (strcmp(p->sex, "女") == 0) {
count++;
printf("%s %s %s %d %d %d %d ", p->num, p->name, p->sex, p->age, p->chinese, p->math, p->english);
int i;
for (i = 0; i < 4; i++) {
printf("%c", p->birthday[i]);
}
printf("-%c%c-%c%c\n", p->birthday[4], p->birthday[5], p->birthday[6], p->birthday[7]);
}
p = p->next;
}
if (count) {
printf("以上为女生共%d人!\n", count);
}
}
int getLength(struct Node* G) {
Node* p = G->next;
int count = 0;
while (p) {
count++;
p = p->next;
}
return count;
}
// 按成绩排序
void sort(struct Node* G) {
Node* p;
Node* q;
Node* m;
int choice, i;
puts("1.按语文排序 2.按数学排序 3.按英语排序");
scanf("%d", &choice);
int n = getLength(G);
int num;
switch (choice) {
case 1: // 按语文
for (i = 0; i < n - 1; i++) {
num = n - i - 1;
q = G->next;
p = q->next;
m = G;
while (num--) {
if (q->chinese < p->chinese) {
q->next = p->next;
p->next = q;
m->next = p;
}
m = m->next;
q = m->next;
p = q->next;
}
}
print(G);
break;
case 2: // 按数学
for (i = 0; i < n - 1; i++) {
num = n - i - 1;
q = G->next;
p = q->next;
m = G;
while (num--) {
if (q->math < p->math) {
q->next = p->next;
p->next = q;
m->next = p;
}
m = m->next;
q = m->next;
p = q->next;
}
}
print(G);
break;
case 3: // 按数学
for (i = 0; i < n - 1; i++) {
num = n - i - 1;
q = G->next;
p = q->next;
m = G;
while (num--) {
if (q->english < p->english) {
q->next = p->next;
p->next = q;
m->next = p;
}
m = m->next;
q = m->next;
p = q->next;
}
}
print(G);
}
}
// 按姓名检索
void find(struct Node* G) {
Node* p = G->next;
char name[10];
puts("请输入要检索的学生的姓名:");
scanf("%s", name);
int flag = 0;
printf("------------------------------------------------------------\n");
while (p) {
if (strcmp(p->name, name) == 0) {
puts("该学生的信息为:");
printf(" 学号 姓名 性别 年龄 语文 数学 英语 出生日期\n");
printf("%s %s %s %d %d %d %d ", p->num, p->name, p->sex, p->age, p->chinese, p->math, p->english);
int i;
for (i = 0; i < 4; i++) {
printf("%c", p->birthday[i]);
}
printf("-%c%c-%c%c\n", p->birthday[4], p->birthday[5], p->birthday[6], p->birthday[7]);
flag = 1;
}
p = p->next;
}
printf("------------------------------------------------------------");
if (!flag) {
puts("未查询到该姓名!");
}
}
void menu() {
puts("");
printf("\t\t\t\t\t-----------------------------------\n");
printf("\t\t\t\t\t* *\n");
printf("\t\t\t\t\t* 学生信息管理系统 *\n");
printf("\t\t\t\t\t* *\n");
printf("\t\t\t\t\t-----------------------------------\n");
puts("\t\t\t\t\t 1.增加学生");
puts("\t\t\t\t\t 2.显示全部学生");
puts("\t\t\t\t\t 3.计算平均成绩");
puts("\t\t\t\t\t 4.删除一个学生");
puts("\t\t\t\t\t 5.按年级输出学生信息");
puts("\t\t\t\t\t 6.按性别输出学生信息");
puts("\t\t\t\t\t 7.按姓名检索学生");
puts("\t\t\t\t\t 8.按某一学科成绩对所有学生排序");
puts("\t\t\t\t\t 0.退出程序");
printf("\t\t\t\t\t-----------------------------------\n");
}
int main() {
struct Node* G = create_();
int choice;
while (1) {
menu();
scanf("%d", &choice);
switch (choice) {
case 1:
add(G);
break;
case 2:
print(G);
break;
case 3:
average(G);
break;
case 4:
delete (G);
break;
case 5:
gradeprint(G);
break;
case 6:
sexprint(G);
break;
case 7:
find(G);
break;
case 8:
sort(G);
break;
case 0:
exit(0);
puts("成功退出!");
}
}
return 0;
}