为什么保存,读取,平均功能都不行
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _Student
{
unsigned int num;
char name[20];
int english;
int java;
int c;
} Student;
typedef struct _Node
{
Student stu;
struct _Node *next;
} Node;
Node *head = NULL;
FILE *fp;
char filename[127];
int menu()
{
printf(" * 学生成绩管理系统 *\n");
printf(" * 1:录入学生信息 *\n");
printf(" * 2:显示学生信息 *\n");
printf(" * 3:保存学生信息 *\n");
printf(" * 4:读取学生信息 *\n");
printf(" * 5:统计学生人数 *\n");
printf(" * 6:查找学生信息 *\n");
printf(" * 7:修改学生信息 *\n");
printf(" * 8:删除学生信息 *\n");
printf(" * 9:学生平均分 *\n");
printf(" * 0:退出系统 *\n");
printf(" *******************************************\n");
return 0;
}
void Head()
{
Node *head = (Node *)malloc(sizeof(Node));
head->next = NULL;
}
void luru()
{
Node *p = (Node *)malloc(sizeof(Node));
p->next = NULL;
system("cls");
printf("请输入学生姓名:");
scanf("%s", p->stu.name);
printf("请输入学生学号:");
scanf("%d", &p->stu.num);
printf("请输入学生english:");
scanf("%d", &p->stu.english);
printf("请输入学生java:");
scanf("%d", &p->stu.java);
printf("请输入学生c:");
scanf("%d", &p->stu.c);
if (head == NULL)
{
head = p;
}
else
{
p->next = head;
head = p;
}
system("pause");
system("cls");
}
void xianshi()
{
system("cls");
printf("|\t学号\t|\t姓名\t|\t英语\t|\tjava\t|\t c \t|\n");
Node *p = head;
while (p != NULL)
{
printf("|\t%d\t|\t%s\t|\t%d\t|\t%d\t|\t%d\t|\n", p->stu.num, p->stu.name, p->stu.english, p->stu.java, p->stu.c);
p = p->next;
}
if (head == NULL)
{
printf("|\t\t\t\t没有学生信息\t\t\t\t\t|\n");
}
system("pause");
}
void baocun()
{
system("cls");
printf("请输入要保存的文件名:");
scanf("%s", filename);
Node *p = head;
if ((fp = fopen(filename, "w")) == NULL)
{
printf("\n保存失败\n");
system("pause");
return;
}
while (p != NULL)
{
fprintf(fp, "%s %d %d %d %d\n", p->stu.name, p->stu.num, p->stu.english, p->stu.java, p->stu.c);
fprintf(fp,"\n");
p = p->next;
}
fclose(fp);
system("cls");
printf("\t学生信息保存成功\t\n");
system("pause");
system("cls");
}
void duqu()
{
system("cls");
printf("请输入保存有学生信息的文件名:");
scanf("%s", filename);
if ((fp = fopen(filename, "a+")) == NULL)
{
printf("\n文件打开失败\n");
system("pause");
return;
}
if (head == NULL)
{
Head();
}
while (1)
{
Node* p = (Node*)malloc(sizeof(Node));
p->next = NULL;
if (fscanf(fp, "%s %d %d %d %d\n", p->stu.name, &p->stu.num, &p->stu.english, &p->stu.java, &p->stu.c) != 5)
{
break;
}
p->next = head;
head = p;
}
fclose(fp);
system("cls");
printf(" \t学生信息加载成功\t\n");
system("pause");
system("cls");
}
void renshu()
{
system("cls");
Node *p = head;
int count = 0;
while (p != NULL)
{
count++;
p = p->next;
}
printf("|\t\t\t\t学生人数:%d\t\t\t\t\t|\n", count);
system("pause");
}
void chaxun()
{
while (1)
{
system("cls");
printf("请选择查询方式:1.学号 | 2.姓名 | 3.退出\n请选择:");
int k;
Node *p = head;
scanf("%d", &k);
switch (k)
{
case 1:
printf("请输入学生学号:");
int num;
scanf("%d", &num);
while (p->next != NULL)
{
if (p->stu.num == num)
{
printf("|\t学号\t|\t姓名\t|\t英语\t|\tjava\t|\t c \t|\n");
printf("|\t%d\t|\t%s\t|\t%d\t|\t%d\t|\t%d\t|\n", p->stu.num, p->stu.name, p->stu.english, p->stu.java, p->stu.c);
p = p->next;
}
else
{
system("pause");
printf("\t\t\t\t未查询到该生信息!\t\t\t\t\t");
return;
}
}
system("pause");
return;
case 2:
printf("请输入学生姓名:");
char name[20];
scanf("%s", name);
while (p && (strcmp(p->stu.name, name) != 0 )){p = p->next;}
if (p)
{
printf("|\t学号\t|\t姓名\t|\t英语\t|\tjava\t|\t c \t|\n");
printf("|\t%d\t|\t%s\t|\t%d\t|\t%d\t|\t%d\t|\n", p->stu.num, p->stu.name, p->stu.english, p->stu.java, p->stu.c);
}
else
{
printf("\t\t\t\t未查询到该生信息!\t\t\t\t\t");
}
system("pause");
return;
case 3:
return;
default:
printf("请重新选择!");
system("pause");
break;
}
}
}
void xiugai()
{
system("cls");
printf("请输入要修改的学生学号:");
int num;
scanf("%d", &num);
Node *p = head;
while (p && (p->stu.num != num))
{
p = p->next;
}
if (p)
{
printf("|\t学号\t|\t姓名\t|\t英语\t|\tjava\t|\t c \t|\n");
printf("|\t%d\t|\t%s\t|\t%d\t|\t%d\t|\t%d\t|\n", p->stu.num, p->stu.name, p->stu.english, p->stu.java, p->stu.c);
printf("请输入修改后的学号:");
scanf("%d", &p->stu.num);
printf("请输入修改后的姓名:");
scanf("%s", p->stu.name);
printf("请输入修改后的english:");
scanf("%s", &p->stu.english);
printf("请输入修改后的java:");
scanf("%d", &p->stu.java);
printf("请输入修改后的c:");
scanf("%d", &p->stu.c);
system("cls");
printf("\t学生信息修改成功\t\n");
system("pause");
system("cls");
return;
}
else
{
system("cls");
printf("\t找不到该学生\t\n");
system("pause");
system("cls");
return;
}
}
void shanchu()
{
system("cls");
printf("请输入要删除的学生学号:");
int num;
scanf("%d", &num);
Node *p = head;
while (1)
{
if (p->next && (p->next->stu.num == num))
{
Node *useless = p->next;
p->next = p->next->next;
printf("此学生已被删除:\n");
printf("|\t学号\t|\t姓名\t|\t英语\t|\tjava\t|\t c \t|\n");
printf("|\t%d\t|\t%s\t|\t%d\t|\t%d\t|\t%d\t|\n", useless->stu.num, useless->stu.name, useless->stu.english, useless->stu.java, useless->stu.c);
system("pause");
free(useless);
return;
}
else
{
if (p->next != NULL)
{
p = p->next;
}
else
{
system("cls");
printf("\t 学生信息删除失败\t\n");
system("pause");
return;
}
}
}
}
void pingjun()
{
system("cls");
Node *p=head;
float aver,sum=0;
int n,m=0;
printf("\n请选择需求平均数值:1.english |2.java |3.c |\n");
scanf("%d",&n);
switch(n)
{
case 1:
if(p!=NULL)
do
{
sum=p->stu.english+sum;
p=p->next;
m++;
}
while(p!=NULL);
aver=sum/m;
printf("%f\n",aver);
case 2:
if(p!=NULL)
do
{
sum=p->stu.java+sum;
p=p->next;
m++;
}
while(p!=NULL);
aver=sum/m;
printf("%f\n",aver);
case 3:
if(p!=NULL)
do
{
sum=p->stu.c+sum;
p=p->next;
m++;
}
while(p!=NULL);
aver=sum/m;
printf("%f\n",aver);
break;
default:
break;
}
}
int main()
{
while (1)
{
system("cls");
menu();
printf("请输入数字:");
char ch = _getch();
switch (ch)
{
case '1':
luru();
break;
case '2':
xianshi();
break;
case '3':
baocun();
break;
case '4':
duqu();
break;
case '5':
renshu();
break;
case '6':
chaxun();
break;
case '7':
xiugai();
break;
case '8':
shanchu();
break;
case '9':
pingjun();
break;
case '0':
exit(0);
break;
default:
break;
}
}
return 0;
}
改为:
void Head()
{
head = (Node *)malloc(sizeof(Node));
head->next = NULL;
}
你在Head函数里又重新定义了一个head变量,而不是使用全局变量,自然不行啊。全局变量head一直是空的
不知道你这个问题是否已经解决, 如果还没有解决的话: