#include"stdio.h"
#include"stdlib.h"
#include"string.h" //用于调用一些函数
struct person {
char name[20];
int ID;
int chinese;
int english;
int math;
struct person *next; //连接处的指针
}; //由于create里面就有initialize所以先把initialize放在前面
void initialize(struct person *p, int num) { //初始化链表里面的值
printf("innitialize person %d
name is:", num); //num用于计入输入的第几个同学
scanf_s("%s", &p->name, sizeof(p->name));
getchar();
printf("ID:");
scanf_s("%d", &p->ID);
getchar();
printf("chinese:");
scanf_s("%d", &p->chinese);
getchar();
printf("math:");
scanf_s("%d", &p->math);
getchar();
printf("english:");
scanf_s("%d", &p->english);
getchar();
}
struct person *create(int len) {
int num = 0;
struct person *h = 0, *c, *pre = 0;
while (num < len) {
c = (struct person*)malloc(sizeof(struct person)); //malloc取内存 sizeof为这个内存的大小 然后转化成指针
if (num == 0) { h = c; pre = c; } // 如果num=0 h存下了首地址 为以后拿做准备
c->next = NULL;
if (num) {
pre->next = c; //pre为前一块内存的地址 把后一块的首地址赋给前一块的尾
pre = c; //收尾连接后 pre指前一块的功能就完成了 然后再指向现在的内存 为下一次拿内存、赋地址做准备
}
initialize(c, num); //每取一块地址就去输入一次
++num;
}return h;
}
void traverse(struct person *head) {
int index = 1; // 用于计数第几个学生
while (head != NULL) { //同样一直到后面没有地址结束
printf("name is: %s ID is:%d chinese is:%d englishi is:%d math is:%d
", head->name, head->ID, head->chinese, head->english, head->math);
head = head->next; //前一个输完后就要指向下一块地址
++index;
}
}
int getlength(struct person *head) {
int num = 0;
while (head != NULL) { //当head指向后面没有了 它就是NULL 结束
++num;
head = head->next; //如果head 不是NULL ++num后要把head指针指向最后
}return num;
}
//增加学生信息
void append_node(struct person *h) {
struct person *t = h, *p;
while (t->next != NULL) {
t = t->next;
}p = (struct person *)malloc(sizeof(struct person));
initialize(p, 0);
p->next = NULL;
t->next = p;
traverse(h);
}
//删除
struct person * delete_ID(struct person *head, int ID, int len) {
struct person *t = head;
struct person *temp;
for (int i = 0; i < (len - 1); ++i) {
if (i == 0) {
if (head->ID == ID) { head = head->next; free(t); traverse(head); return head; }
if ((t->next)->ID == ID) {
temp = t->next;
t->next = (t->next)->next;
free(temp); traverse(head); return head;
}
}
if (i != 0) {
if ((t->next)->ID == ID) {
temp = t->next;
t->next = (t->next)->next;
free(temp); traverse(head); return head;
}t = t->next;
}
}return head;
}
//学号查询
void search_ID(struct person *head, int ID) {
while (head != NULL) {
if (head->ID == ID) {
printf("name is: %s ID is:%d chinese is:%d englishi is:%d math is:%d
", head->name, head->ID, head->chinese, head->english, head->math);
}head = head->next;
}
}
//姓名查询
void search_name(struct person *head, char name[20]) {
while (head != NULL) {
if ((strcmp(head->name, name)) == 0) { printf("name is: %s ID is:%d chinese is:%d englishi is:%d math is:%d
", head->name, head->ID, head->chinese, head->english, head->math); }
head = head->next;
}
}
//指定学生修改
void change(struct person *head, char name[20]) {
while (head != NULL) {
if (strcmp(head->name, name) == 0) {
printf(" name is:");
scanf_s("%s", &head->name, sizeof(head->name));
getchar();
printf("ID:");
scanf_s("%d", &head->ID);
getchar();
printf("chinese:");
scanf_s("%d", &head->chinese);
getchar();
printf("english:");
scanf_s("%d", &head->english);
getchar();
printf("math:");
scanf_s("%d", &head->math);
getchar();
}
head = head->next;
}
traverse(head);
}
//数学分数平均数
int average_math(struct person *head, int len) {
int i = 0, sum = 0, average;
struct person *t = head;
while (t != NULL) {
sum += t->math;
t = t->next;
}
average = (sum / len);
return average;
}
//英语分数平均数
int average_english(struct person *head, int len) {
int i = 0, sum = 0, average;
struct person *t = head;
while (t != NULL) {
sum += t->english;
t = t->next;
}
average = (sum / len);
return average;
}
//语文分数平均数
int average_chinese(struct person *head, int len) {
int sum = 0, average;
struct person *t = head;
while (t != NULL) {
sum += t->chinese;
t = t->next;
}
average = (sum / len);
return average;
}
//成绩区间统计
int statistics_math(struct person*head, int min, int max) {
int conter = 0;
while (head!= NULL) {
if (head->math >= min&&head->math <= max) {
++conter;
printf("name:%s math score:%d
", head->name, head->math);
}head = head->next;
}return conter;
}
int statistics_chinese(struct person*head, int min, int max) {
int conter = 0;
while (head != NULL) {
if (head->chinese >= min&&head->chinese <= max) {
++conter;
printf("name:%s chinese score:%d
", head->name, head->chinese);
}head = head->next;
}return conter;
}
int statistics_english(struct person*head, int min, int max) {
int conter = 0;
while (head != NULL) {
if (head->english >= min&&head->english <= max) {
++conter;
printf("name:%s english score:%d
", head->name, head->english);
}head = head->next;
}return conter;
}
//某名学生的平均成绩
int average_name(struct person*head, char name[20]) {
int av = 0;
while (head != NULL) {
if (strcmp(head->name, name) == 0) { av += head->math; av += head->chinese; av += head->english; }
head = head->next;
}
av = av / 3;
return av;
}
//排序数学
void rank_math(struct person *h, int len) {
struct person *t = h, *pre = h;
int i, math, chinese, english,ID;
char name[20];
t = t->next;
for (i = 0; i < (len - 1); ++i) {
while (t != NULL) {
if ((t->math) >(pre->math)) {
ID = t->ID; t->ID = pre->ID; pre->ID = ID;
math = t->math; t->math = pre->math; pre->math = math;
strcpy_s(name, t->name); strcpy_s(t->name, pre->name); strcpy_s(pre->name, name);
chinese = t->chinese; t->chinese = pre->chinese; pre->chinese = chinese;
english = t->english; t->english = pre->english; pre->english = english;
}
t = t->next;
}pre = pre->next; t = pre->next;
}
traverse(h);
}
//排序语文
void rank_chinese(struct person *h, int len) {
struct person *t = h, *pre = h;
int i, math, chinese, english,ID;
char name[20];
t = t->next;
for (i = 0; i < (len - 1); ++i) {
while (t != NULL) {
if ((t->chinese) >(pre->chinese)) {
ID = t->ID; t->ID = pre->ID; pre->ID = ID;
math = t->math; t->math = pre->math; pre->math = math;
strcpy_s(name, t->name); strcpy_s(t->name, pre->name); strcpy_s(pre->name, name);
chinese = t->chinese; t->chinese = pre->chinese; pre->chinese = chinese;
english = t->english; t->english = pre->english; pre->english = english;
}
t = t->next;
}pre = pre->next; t = pre->next;
}
traverse(h);
}
//排序英语
void rank_english(struct person *h, int len) {
struct person *t = h, *pre = h;
int i, math, chinese, english,ID;
char name[20];
t = t->next;
for (i = 0; i < (len - 1); ++i) {
while (t != NULL) {
if ((t->english) >(pre->english)) {
ID = t->ID; t->ID = pre->ID; pre->ID = ID;
math = t->math; t->math = pre->math; pre->math = math;
strcpy_s(name, t->name); strcpy_s(t->name, pre->name); strcpy_s(pre->name, name);
chinese = t->chinese; t->chinese = pre->chinese; pre->chinese = chinese;
english = t->english; t->english = pre->english; pre->english = english;
}
t = t->next;
}pre = pre->next; t = pre->next;
}
traverse(h);
}
void release(struct person *head) {
struct person *n; //需要一个指针存着下一个地址
while (head != NULL) {
n = head->next; //把n指向下一块要释放的地址
free(head);
head = n; //然后再把head从前一个地址移到下一个地址
}
}
//取长度
int getlen(struct person *head) {
int conter = 0;
struct person*t = head;
while (t != NULL) {
++conter;
t = t->next;
}
return conter;
}
//存入文件
void openfile(struct person *head, int len) {
FILE *fp;
struct person*t = head;
errno_t err;
int temp;
char str[100];
char s[10];
if ((err = fopen_s(&fp, "D:\学生信息", "w")) != 0)
{
printf("文件打开错误
");
}
else
{
printf("文件打开成功
");
}
for (int i = 0; i < len; ++i) {
strcpy_s(str, t->name);
fputs("name:", fp);
fputs(str, fp);
fputs(": ", fp);
fputs("ID:", fp);
sprintf_s(s, "%d", t->ID);
fputs(s, fp);
fputs(" ", fp);
sprintf_s(s, "%d", t->chinese);
fputs("chinese:", fp);
fputs(s, fp);
fputs(" ", fp);
sprintf_s(s, "%d", t->math);
fputs("math:", fp);
fputs(s, fp);
fputs(" ", fp);
sprintf_s(s, "%d", t->english);
fputs("english:", fp);
fputs(s, fp);
fputs("
", fp);
t = t->next;
}
return;
}
void menu(struct person *head, int len) {
int m = 0;
int min, max;
int ID = 0;
int conter = 0;
char name[20];
while (1) {
printf(" 请选择您需要的操作:
");
printf(" 0. 遍历学生信息
");
printf(" 1. 增加学生信息
");
printf(" 2. 删除学生信息
");
printf(" 3. 修改学生信息
");
printf(" 4. 按姓名查询
");
printf(" 5. 按学号查询
");
printf(" 6. 语文成绩在某个区间段的人数以及学生
");
printf(" 7. 数学成绩在某个区间段的人数以及学生
");
printf(" 8. 英语成绩在某个区间段的人数以及学生
");
printf(" 9. 语文平均分
");
printf(" 10. 数学平均分
");
printf(" 11. 英语平均分
");
printf(" 12. 某个学生的三科平均成绩
");
printf(" 13. 按语文成绩从高到低排序
");
printf(" 14. 按数学成绩从高到低排序
");
printf(" 15. 按英语成绩从高到底排序
");
printf(" 16. 结束功能并把信息写入文件中
");
scanf_s("%d", &m);
switch (m) {
case 0: traverse(head); break;
case 1: append_node(head); break;
case 2: {printf("要删除学生信息的学号:");
scanf_s("%d", &ID);
head=delete_ID(head, ID, getlen(head)); }break;
case 3: {printf("需要修改学生信息的同学姓名:");
scanf_s("%s", &name, sizeof(name));
change(head, name); }break;
case 4: {printf("search by name:");
scanf_s("%s", &name, sizeof(name));
search_name(head, name); }break;
case 5: {printf("学号查询:");
scanf_s("%d", &ID);
search_ID(head, ID); }break;
case 6: {printf("请输入语文成绩的区间:");
printf("min=");
scanf_s("%d", &min);
printf("max=");
scanf_s("%d", &max);
printf("语文成绩在区间%d到%d之间的学生:%d人
", min, max, statistics_chinese(head, min, max)); }break;
case 7: {printf("请输入数学成绩的区间:");
printf("min=");
scanf_s("%d", &min);
printf("max=");
scanf_s("%d", &max);
printf("数学成绩在区间%d到%d之间的学生:%d人
", min, max, statistics_math(head, min, max)); }break;
case 8: {printf("请输入英语成绩的区间:");
printf("min=");
scanf_s("%d", &min);
printf("max=");
scanf_s("%d", &max);
printf("英语成绩在区间%d到%d之间的学生:共有%d人
", min, max, statistics_english(head, min, max)); }break;
case 9: { printf("average of chinese is%d", average_chinese(head, getlen(head))); }break;
case 10: { printf("average of math is%d", average_math(head, getlen(head))); }break;
case 11: { printf("average of english is%d", average_english(head, getlen(head))); }break;
case 12: {printf("请输入学生的姓名:");
scanf_s("%s", &name, sizeof(name));
printf("%s 的平均成绩为:%d", name, average_name(head, name)); }break;
case 13: {printf("按照语文成绩从高到底排序:");
rank_chinese(head, getlen(head)); }break;
case 14: {printf("按照数学成绩从高到底排序:");
rank_math(head, getlen(head)); }break;
case 15: {printf("按照英语成绩从高到底排序:");
rank_english(head, getlen(head)); }break;
case 16: openfile(head, getlen(head)); return;
}
}
}
int main() {
struct person *head;
int len;
int min, max;
int ID = 0;
char name[20];
printf("请输入学生信息");
printf("学生人数:");
scanf_s("%d", &len); //输入要取的地址多少
head = create(len); // 创建地址 在create里面就有初始复制函数嵌套
traverse(head); //遍历
menu(head, getlen(head));
release(head); //释放内存
system("pause");
return 0;
}