请问如何将代码修改成链表,可以储存到磁盘文件
#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);
}
修改其他函数中的变量类型,将结构体数组中的元素改为链表节点中的元素,使用指针遍历链表进行相关操作。