学生成绩管理系统完整程序,调试

为什么保存,读取,平均功能都不行


#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一直是空的

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^