主程序:
#define _CRT_SECURE_NO_WARNINGS//跳过安全警告
#include "nodes.h"
int main() {
C* class0 = Clacreat();// 新建班级
while(1){
menu();//菜单
func(class0);//功能选择
system("pause");//暂停
system("cls"); //清屏
}
return 0;
}
具体功能实现:
#include <stdio.h>
#include <stdlib.h>
#define Maxnum 50//班级最大容量
typedef struct Student {//学生信息
char name[20];
int num;
int age;
int math;
int english;
int physics;
int sumsco;
}S;
typedef struct Class {//班级信息
S studat;
struct Class* next;
}C;
/*
menu
func
creat:0
add:1
delect:2
search:3
update:4
fwrite
fread
*/
void menu() {
printf(" \n");
printf(" **************系统菜单**************\n");
printf(" * 0.增加学生信息 * * 1.删除学生信息*\n");
printf(" * * * *\n");
printf(" *--------------- * * --------------*\n");
printf(" * * * *\n");
printf(" * 2.查询学生信息 * * 3.修改学生信息*\n");
printf(" * * * *\n");
printf(" *--------------- * * --------------*\n");
printf(" * * * *\n");
printf(" * 4.浏览学生信息 * * 5.按照学号排序*\n");
printf(" * * * *\n");
printf(" *--------------- * * --------------*\n");
printf(" * * * *\n");
printf(" * 6.写入文件 * * 7.读取文件 *\n");
printf(" * * * *\n");
printf(" *--------------- * * --------------*\n");
printf(" * * * *\n");
printf(" * 8.退出系统 * * *\n");
printf(" ************************************\n");
}
struct Class* Clacreat() {//创建班级体
C* newClass = (C*)malloc(sizeof(C));
newClass->next = NULL;
return newClass;
}
struct Class* Claadd(S stu) {//增加班级学生
C* newStudent = (C*)malloc(sizeof(C));
newStudent->studat = stu;
newStudent->next = NULL;
return newStudent;
}
struct Student stuadd() {//创建学生信息
S newStudent;
printf("请输入学生姓名:");
scanf("%s", newStudent.name);
printf("请输入学生学号:");
scanf("%d", &(newStudent.num));
printf("请输入学生年龄:");
scanf("%d", &newStudent.age);
printf("请输入学生数学成绩:");
scanf("%d",&newStudent.math);
printf("请输入学生英语成绩:");
scanf("%d",&newStudent.english);
printf("请输入学生物理成绩:");
scanf("%d",&newStudent.physics);
newStudent.sumsco = newStudent.math + newStudent.english + newStudent.physics;
return newStudent;
}
void delstu(C* class0,int tem) {//删去
if (class0->next == NULL) {
printf("班级为空!\n");
return;
}
C* p = class0;
while (p->next != NULL && (p->next->studat.num != tem)) {
p = p->next;
}
if (p->next == NULL) {
printf("该班级无此学生!\n");
return;
}
p->next = p->next->next;
}
void searstu(C* class0, int tem) {//查找
if (class0->next == NULL) {
printf("班级为空!\n");
return;
}
C* p = class0;
while (p->next != NULL && (p->next->studat.num!=tem)) {
p = p->next;
}
if (p->next == NULL) {
printf("该班级无此学生!\n");
return;
}
p = p->next;
printf("姓名\t学号\t年龄\t\t数学成绩\t英语成绩\t物理成绩\t总成绩\n");
printf("%s\t%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n", p->studat.name, p->studat.num, p->studat.age, (p->studat.math), (p->studat.english), (p->studat.physics), (p->studat.sumsco));
}
void updstu(C* class0, int tem) {//更新
if (class0->next == NULL) {
printf("班级为空!\n");
return;
}
C* p = class0;
while (p->next != NULL && (p->next->studat.num != tem)) {
p = p->next;
}
if (p->next == NULL) {
printf("该班级无此学生!\n");
return;
}
p = p->next;
printf("请输入学生姓名:");
scanf("%s", p->studat.name);
printf("请输入学生学号:");
scanf("%d", &(p->studat.num));
printf("请输入学生年龄:");
scanf("%d", &p->studat.age);
printf("请输入学生数学成绩:");
scanf("%d", &p->studat.math);
printf("请输入学生英语成绩:");
scanf("%d", &p->studat.english);
printf("请输入学生物理成绩:");
scanf("%d", &p->studat.physics);
p->studat.sumsco = p->studat.math + p->studat.english + p->studat.physics;
}
void allOut(C* class0) {//输出整个链表
if (class0->next == NULL) {
printf("班级为空!\n");
return;
}
C* p = class0->next;
printf("姓名\t学号\t年龄\t\t数学成绩\t英语成绩\t物理成绩\t总成绩\n");
do {
printf("%s\t%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",p->studat.name,p->studat.num,p->studat.age, p->studat.math, p->studat.english, p->studat.physics, p->studat.sumsco);
p = p->next;
} while (p!=NULL);
}
void allSort(C* class0) {//按照学号排序
if (class0->next == NULL) {
printf("班级为空!\n");
return;
}
for (int i = 0; i < Maxnum; i++) {
C* pc = class0->next;
S tem;
while (pc->next != NULL) {
if ((pc->studat.num) > (pc->next->studat.num)) {
tem = pc->studat;
pc->studat = pc->next->studat;
pc->next->studat = tem;
}
pc = pc->next;
}
}
}
void writeFile(C* class0, char* filename) {
if (class0->next == NULL) {
printf("班级为空!\n");
return;
}
FILE *fp;
C* tem = class0;
allSort(tem);
C* p = tem->next;
fp = fopen(filename,"w");
fprintf(fp, "姓名\t学号\t年龄\t数学成绩\t英语成绩\t物理成绩\t总成绩\n");//为文件添加表头
while (p != NULL) {
fprintf(fp, "%s\t%d\t%d\t%d\t%d\t%d\t%d\n", p->studat.name, p->studat.num, p->studat.age, p->studat.math, p->studat.english, p->studat.physics, p->studat.sumsco);
p = p->next;
}
fclose(fp);
}
void readFile(C* class0, char* filename) {
FILE* fp;
fp = fopen(filename, "r");
if (fp==NULL) {
printf("文件不存在!");
return;
}
//struct Class* Claadd(S stu)
C* last = class0;
fseek(fp,sizeof("姓名\t学号\t年龄\t数学成绩\t英语成绩\t物理成绩\t总成绩\n"), SEEK_SET);//读取文件时跳过第一行的表头
while (1) {
S studat;
if (fscanf(fp, "%s\t%d\t%d\t%d\t%d\t%d\t%d\n", studat.name, &studat.num, &studat.age, &studat.math, &studat.english, &studat.physics, &studat.sumsco) != EOF) {
C* p = Claadd(studat);
last->next = p;
last = p;
}
else {
break;
}
}
allSort(class0);
fclose(fp);
}
void func(C* class0) {
int Func;
printf("\n 功能选择:");
scanf_s("%d", &Func);
printf("\n");
switch (Func) {
case 0: {
C* claS = Claadd(stuadd());
claS->next = class0->next;
class0->next = claS;
printf("\nadd success!\n");
break; }
case 1: {
int tem;
printf("请输入需要删除的学生学号:");
scanf("%d",&tem);
delstu(class0, tem);
printf("\ndelect success!\n");
break; }
case 2: {
int tem;
printf("请输入需要查找的学生学号:");
scanf("%d", &tem);
searstu(class0, tem);
printf("\nsearch success!\n");
break; }
case 3: {
int tem;
printf("请输入需要修改的学生的学号:");
scanf("%d", &tem);
updstu(class0, tem);
printf("\nupdate success!\n");
break; }
case 4: {
allOut(class0);
printf("\nout success!\n");
break; }
case 5: {
allSort(class0);
printf("\nresort success!\n");
break; }
case 6: {
char filename[20];
printf("输入文件名称:");
scanf("%s", filename);
writeFile(class0,filename);
printf("\nsave success!\n");
break; }
case 7: {
char filename[20];
printf("输入文件名称:");
scanf("%s", filename);
readFile(class0, filename);
printf("\nread success!\n");
break;}
case 8: {
printf("\nexit success!\n");
exit(1); }
default: {printf("\n无此项功能!\n"); }
}
}