c语言学生成绩管理系统链表

请问如何将代码修改成链表,可以储存到磁盘文件

 
 
#include 
#include 
#include //字符串处理  
#include 
int n=4; 
struct student 
{ 
int num; //学号 
char name[10]; //名字 
float score[3]; //成绩 
}stud[100];
int i,choose,a,t=0; 
long int num;
 
int main () 
{ 
void save(void); 
void input(void); 
void output(void); 
void scoremodify();
void namemodify(); 
void scorecheck();
void namecheck(); 
void Addstudent(); 
void sclsearch(); 
while(1) 
{ 
printf(" ********************************************************* \n"); 
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(" 【0】-------------------------- 退出 \n");
printf(" ********************************************************* \n");
printf(" 请输入相应菜单编号: ");
scanf("%d",&a);
switch(a)
{ 
case 1: 
input(); //输入 
save(); //保存 
break; 
case 2: 
output(); //输出 
printf("\n"); 
system("PAUSE"); 
system("CLS"); //清屏 
break; 
case 3: 
Addstudent(); 
printf("\n"); 
system("PAUSE"); 
system("CLS"); 
break; 
case 4: 
scorecheck(); 
printf("\n"); 
system("PAUSE"); 
system("CLS"); 
break;
case 5: 
namecheck(); 
printf("\n"); 
system("PAUSE"); 
system("CLS"); 
break; 
case 6: 
scoremodify(); 
printf("\n"); 
system("PAUSE"); 
system("CLS"); 
break;
case 7: 
namemodify(); 
printf("\n"); 
system("PAUSE"); 
system("CLS"); 
break;  
case 8: 
sclsearch(); 
printf("\n"); 
system("PAUSE"); 
system("CLS"); 
break;
case 0:exit(0); 
default: ; 
} 
} 
return 0; 
} 
 
void save() 
{ 
FILE *fp; 
if ((fp=fopen("stu.dat","wb"))==NULL)/*以只写的方式打开文件*/   
{ 
printf("无法打开文件!\n"); 
return ; 
} 
for(i=0;iif (fwrite (&stud[i],sizeof(struct student),1,fp)!=1)/*写入字节为 1 的信息在文件中*/ 
printf("文件写入错误!\n"); 
fclose(fp);/*关闭文件*/ 
} 
void input()//录入学生成绩
{ 
int i; 
char a; 
for(i=0;iprintf("\n 请输入学生成绩信息:\n"); 
printf("\n 请依次输入 学号 姓名 c语言成绩:\n"); 
scanf("%d%s%f",&stud[i].num,stud[i].name,&stud[i].score[0]); 
printf("输入:y(继续),n(终止)!\n"); 
fflush(stdin);   //清除输入缓存 
scanf("%c",&a); 
if(a=='n' || a=='N') 
break; 
} 
n=i+1; 
} 
void Addstudent() 
{ 
FILE *fp; 
struct student s; 
fp=fopen("stu.dat","ab"); 
if((fp=fopen("stu.dat","ab"))==NULL) 
printf("File open error!\n"); 
else 
{ 
printf("请输入所增加学生的 学号 姓名 c语言成绩:\n"); 
scanf("%d",&s.num ); 
scanf("%s",s.name); 
scanf("%f",&s.score[0]); 
fwrite (&s,sizeof(struct student),1,fp); 
fclose(fp);/*关闭文件*/ 
} 
printf("写入成功!\n"); 
}//end function Addstudent; 
void output() 
{ 
int i; 
//float s; 
FILE *fp; 
if((fp=fopen("stu.dat","rb"))==NULL) 
{ 
printf("cannot open file\n"); 
exit(0); 
} 
printf("\n 学号 姓名 c语言成绩\n"); 
for(i=0;fread(&stud[i],sizeof(struct student),1,fp)==1;i++) 
{ 
printf("%d %10s % 10.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
} 
fclose(fp); 
n=i; 
} 
void scoremodify() 
{ 
int number,i; 
printf("请输入要修改信息的学生学号:"); 
scanf("%d",&number); 
for(i=0;iif(number==stud[i].num) 
break;/*查找判断*/ 
if(i/*查找判断*/ 
{ 
printf("请输入修改后的学生的信息:"); 
printf("\n 请输入学生的 c语言成绩:"); 
scanf("%f",&stud[i].score[0]);
printf("\n学号 姓名 c语言成绩\n");
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
save(); 
} 
else 
printf("没找到该学生的信息\n"); 
system("pause");system("cls"); 
} 
void namemodify() 
{ 
int i;
char name[10];
printf("请输入要修改信息的学生姓名:"); 
scanf("%s",&name); 
for(i=0;iif(strcmp(stud[i].name,name)==0) 
break;/*查找判断*/ 
if(i/*查找判断*/ 
{ 
printf("请输入修改后的学生的信息:"); 
printf("\n 请输入学生的 c语言成绩:"); 
scanf("%f",&stud[i].score[0]);
printf("\n学号 姓名 c语言成绩\n");
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
save(); 
} 
else 
printf("没找到该学生的信息\n"); 
system("pause");system("cls"); 
} 
void namecheck() 
{ 
char name[10]; 
printf("按照姓名查询请按\n"); 
printf("\n 请输入姓名:"); 
scanf("%s",&name); 
printf("查询结果\n"); 
printf("学号 姓名 c语言成绩\n");
for(i=0;iif(strcmp(stud[i].name,name)==0) 
{ 
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
} 
} 
void scorecheck() 
{ 
int b; 
printf("按照学号查询请按\n"); 
{ 
printf("\n 请输入学号:"); 
scanf("%d",&b); 
printf("查询结果\n"); 
printf("学号 姓名 c语言成绩\n"); 
for(i=0;iif(stud[i].num ==b) 
{ 
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
} 
} 
} 
void sclsearch() 
{ 
int i; 
printf("90 分以上:\n"); 
printf("学号 姓名 c语言成绩\n"); 
for(i=0;iif(stud[i].score[0]>=90) 
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
} 
printf("80~89:\n"); 
printf("学号 姓名 c语言成绩\n"); 
for(i=0;iif(stud[i].score[0]>=80&&stud[i].score[0]<90) 
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
} 
printf("70~79:\n"); 
printf("学号 姓名 c语言成绩\n"); 
for(i=0;iif(stud[i].score[0]>=70&&stud[i].score[0]<80) 
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
} 
printf("60~69:\n"); 
printf("学号 姓名 c语言成绩\n"); 
for(i=0;iif(stud[i].score[0]>=60&&stud[i].score[0]<70) 
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
} 
printf("60 分以下:\n"); 
printf("学号 姓名 c语言成绩\n"); 
for(i=0;iif(stud[i].score[0]<60) 
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
} 
}

“Devil组”引证GPT后的撰写:
需要将其修改为链表结构,可以储存到磁盘文件中。修改后的代码应该可以实现以下功能:

1.创建学生记录;
2.将学生记录存储到磁盘文件中;
3.从磁盘文件中读取学生记录;
4.在链表中添加学生记录;
5.按学号查询学生记录;
6.按姓名查询学生记录;
7.按学号修改学生记录;
8.按姓名修改学生记录;
9.按分数段显示学生记录;
10.退出程序。

定义链表结构体,包括成绩信息和指向下一个节点的指针。

struct node {
    int num; // 学号
    char name[10]; // 姓名
    float score[3]; // 成绩
    struct node *next; // 指向下一个节点的指针
};


将原代码中的 stud 数组改为指向链表头结点的指针。

struct node *head = NULL;


修改录入函数 input(),使用 malloc() 函数为每个节点分配内存空间,同时使用指针操作将节点连接起来,最后释放不需要的内存空间。

void input()
{ 
    char a;
    struct node *p, *q;
    p = (struct node*)malloc(sizeof(struct node));
    printf("\n请输入学生成绩信息:\n");
    printf("\n请依次输入 学号 姓名 c语言成绩:\n");
    scanf("%d%s%f", &p->num, p->name, &p->score[0]);
    head = p;
    printf("输入:y(继续),n(终止)!\n");
    fflush(stdin);   //清除输入缓存 
    scanf("%c", &a);
    while (a != 'n' && a != 'N')
    {
        q = (struct node*)malloc(sizeof(struct node));
        printf("\n请依次输入 学号 姓名 c语言成绩:\n");
        scanf("%d%s%f", &q->num, q->name, &q->score[0]);
        p->next = q;
        p = q;
        printf("输入:y(继续),n(终止)!\n");
        fflush(stdin);   //清除输入缓存 
        scanf("%c", &a);
    }
    p->next = NULL;
}


修改输出函数 output(),使用指针遍历链表输出每个节点的信息。

void output()
{
    struct node *p;
    FILE *fp;
    if ((fp = fopen("stu.dat", "rb")) == NULL)
    {
        printf("cannot open file\n");
        exit(0);
    }
    printf("\n学号\t姓名\tc语言成绩\n");
    p = head;
    while (p != NULL)
    {
        printf("%d\t%s\t%.2f\n", p->num, p->name, p->score[0]);
        p = p->next;
    }
    fclose(fp);
}


修改其他函数中的变量类型,将结构体数组中的元素改为链表节点中的元素,使用指针遍历链表进行相关操作。