以下为完整代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void menu()
{
printf("|---------------------------------------|\n");
printf("|\t XXX学生成绩管理系统 |\n");
printf("|---------------------------------------|\n");
printf("|\t请选择功能菜单,按0退出程序: |\n");
printf("|---------------------------------------|\n");
printf("|\t1、从文件中导入原始数据 |\n");
printf("|---------------------------------------|\n");
printf("|\t2、添加学生信息 |\n");
printf("|---------------------------------------|\n");
printf("|\t3、删除学生信息 |\n");
printf("|---------------------------------------|\n");
printf("|\t4、统计每位同学的平均分 |\n");
printf("|---------------------------------------|\n");
printf("|\t5、统计每门课程的平均分 |\n");
printf("|---------------------------------------|\n");
printf("|\t6、分段统计人数 |\n");
printf("|---------------------------------------|\n");
printf("|\t7、查询学生 |\n");
printf("|---------------------------------------|\n");
printf("|\t8、报表输出 |\n");
printf("|---------------------------------------| \n");
}
struct student
{
char num[30];
char name[20];
int score[3];
};
struct node
{
struct student date;
struct node* next;
};
struct node* creatlist()
{
struct node* headnode = (struct node*)malloc(sizeof(struct node*));
headnode->next = NULL;
return headnode;
}
struct node* creatnode(struct student date)
{
struct node* newnode = (struct node*)malloc(sizeof(struct node*));
newnode->date = date;
newnode->next = NULL;
return newnode;
}
void insertnode(struct node* headnode, struct student date)
{
struct node* newnode = creatnode(date);
newnode->next = headnode->next;
headnode->next = newnode;
}
void findnode(struct node* headnode, char* num)
{
struct node* posnodefront = headnode;
struct node* posnode = headnode->next;
if (posnode == NULL)
{
printf("no find\n");
}
else
{
while (strcmp(posnode->date.num, num))
{
posnodefront = posnode;
posnode = posnodefront->next;
if (posnode == NULL)
{
printf("no found\n");
}
}
printf("学号:%s\t姓名:%s\t高数成绩:%d\tC语言成绩:%d\t英语成绩:%d\t", posnode->date.num, posnode->date.name, posnode->date.score[0], posnode->date.score[1], posnode->date.score[2]);
printf("\n");
}
}
void deletenode(struct node* headnode, char* num)
{
struct node* posnodefront = headnode;
struct node* posnode = headnode->next;
if (posnode == NULL)
{
printf("no find\n");
}
else
{
while (strcmp(posnode->date.num, num))
{
posnodefront = posnode;
posnode = posnodefront->next;
if (posnode == NULL)
{
printf("no found\n");
}
}
posnodefront->next = posnode->next;
posnode = NULL;//不加这个会报错野指针
free(posnode);
printf("delete\n");
}
}
void printlist(struct node* headnode)
{
struct node* pmove = headnode->next;
while (pmove)
{
printf("学号:%s\t姓名:%s\t高数成绩:%d\tC语言成绩:%d\t英语成绩:%d\t", pmove->date.num, pmove->date.name, pmove->date.score[0], pmove->date.score[1], pmove->date.score[2]);
printf("\n");
pmove = pmove->next;
}
}
void stuaver(struct node* headnode, struct student date)
{
struct node* pmove = headnode->next;
while (pmove)
{
int sum = 0;
float aver;
sum = pmove->date.score[0] + pmove->date.score[1] + pmove->date.score[2];
aver = sum / 3.0;
printf("%s的平均分=%f\n", pmove->date.name, aver);
pmove = pmove->next;
}
}
void courseaver(struct node* headnode, struct student date)
{
int sum1 = 0, sum2 = 0, sum3 = 0, count = 0;
struct node* pmove = headnode->next;
while (pmove)
{
sum1 += pmove->date.score[0];
sum2 += pmove->date.score[1];
sum3 += pmove->date.score[2];
count++;
pmove = pmove->next;
}
float aver1 = float(sum1) / count;
float aver2 = float(sum2) / count;
float aver3 = float(sum3) / count;
printf("高数平均分=%f\nC语言平均分=%f\n英语平均分=%f\n", aver1, aver2, aver3);
}
void readlistfromfile(struct node* headnode)
{
FILE* fp;
fp = fopen("C:\\Users\\ligang\\source\\repos\\Project6\\Project6\\filename.txt","r");
if (fp == NULL)
{
printf("文件打开失败\n");
}
else
{
printf("文件打开成功\n");
struct student date = {0,0,0,0,0};
do
{
fscanf(fp, "%s%s%d%d%d", date.num, date.name, &date.score[0], &date.score[1], &date.score[2]);
insertnode(headnode, date);
} while (!feof(fp));
}
rewind(fp);
fclose(fp);
}
void savelistfromfile(struct node* headnode)
{
FILE* fp;
fp = fopen("C:\\Users\\ligang\\source\\repos\\Project6\\Project6\\filename.txt", "w");
struct node* pmove=headnode->next ;
while (pmove)
{
fprintf(fp, "%s\r\n%s\r\n%d\r\n%d\r\n%d\r\n", pmove->date.num, pmove->date.name, pmove->date.score[0], pmove->date.score[1], pmove->date.score[2]);
pmove = pmove->next;
}
fclose(fp);
}
struct node* list = creatlist();
int main()
{
struct student date = {0,0,0,0,0};
menu();
int a;
do {
printf("请输入功能键\n");
scanf("%d", &a);
switch (a)
{
case 0:printf("[你退出了程序]\n"); break;
case 1: {printf("[从文件中导入原始数据]\n");
readlistfromfile(list);
printlist(list);
break; }
break;
case 2: {printf("[添加学生信息]\n");
printf("请输入学生信息\n");
printf("学号\t 姓名\t 高数成绩\t C语言成绩\t 英语成绩\n");
scanf("%s%s%d%d%d", date.num, date.name, &date.score[0], &date.score[1], &date.score[2]);
insertnode(list, date);
break; }break;
case 3: {printf("[删除学生]\n");
printf("请输入要删除学生的学号\n");
scanf("%s", date.num);
deletenode(list, date.num);
break; } break;
case 4: {printf("[统计每位同学的平均分]\n");
stuaver(list, date);
break; } break;
case 5: {printf("[统计每门课程的平均分]\n");
courseaver(list, date);
break; } break;
case 6:printf("[分段统计人数]\n"); break;
case 7: {printf("[查询学生]\n");
printf("请输入要查找学生的学号\n");
scanf("%s", date.num);
findnode(list, date.num);
break; } break;
case 8: {printf("[报表输出]\n");
printlist(list);
break; }break;
default:printf("[error]\n");
}
} while (a != 0);
savelistfromfile(list);
return 0;
}
########
以下为文件内的内容
202211105
小强
98
98
98
202211101
小华
98
98
98
202211102
小红
98
98
98
202211103
小蓝
98
98
98
202211109
小金
98
98
98
运行到某一功能就停止了
应该是文件导入和写入有问题
让程序正常运行,能够成功读取和写入文件。
struct node* headnode = (struct node*)malloc(sizeof(struct node*))
改为
struct node* headnode = (struct node*)malloc(sizeof(struct node))
分配的空间是节点结构的大小,不能是指针的大小,否则空间不够,数据的越界操作了
第159行 第185行,struct student date = {0,0,0,0,0}; 修改为:struct student date; 就可以了。