我这代码如何改成链表,希望能提供思路帮助


 
#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后的撰写:
需要以下几个步骤:

  • 定义链表节点结构体 Node,包括 struct student 中的所有成员变量以及一个指向下一个节点的指针 next。
  • 在 main() 函数中,创建头节点 head 并初始化为 NULL。
  • 在输入、输出、添加、修改和查询等函数中,将结构体数组 stud 替换成链表节点指针 p,并按照链表的方式遍历节点。
  • 在输入、添加、修改等函数中,需要动态分配内存以创建新的节点,并将其插入到链表中。
  • 在修改函数中,需要按照学号或姓名查找对应的节点,如果找到需要修改节点中的成绩信息。
  • 在查询函数中,需要按照学号或姓名查找对应的节点,并输出节点中的成绩信息

该回答引用ChatGPT

这个代码可以使用链表来存储学生信息。以下是大致的思路:

定义链表节点的结构体,其中包括学生信息和指向下一个节点的指针。
在输入和读取学生信息的函数中,将每个学生信息存储在一个新的链表节点中,并将该节点插入到链表的末尾。
在输出学生信息的函数中,遍历链表并输出每个节点中的学生信息。
在修改学生成绩的函数中,根据学号或姓名查找相应的节点并修改其成绩。
在查询学生成绩的函数中,根据学号或姓名查找相应的节点并输出其成绩。
在按分数段查询学生成绩的函数中,遍历链表并根据学生成绩输出相应的学生信息

该回答引用GPTᴼᴾᴱᴺᴬᴵ
这是一个简单的学生成绩记录系统,可以通过链表来实现。你需要创建一个学生结构体节点,并将其连接起来形成链表。

以下是一种可能的思路:

  1. 定义一个结构体,包含所需的信息,例如学号、姓名和成绩等。同时,定义一个指针变量指向该结构体类型,作为链表节点。
  2. 在程序中定义一个头节点,该节点不包含实际数据,只用于指向第一个有效节点。初始化时,将其指向NULL。
  3. 在输入学生信息时,为每个学生动态地创建一个新节点,并将其插入链表的末尾。在这里,可以使用一个循环来遍历链表,找到链表的尾部,并将新节点连接到链表的最后一个节点。
  4. 输出学生信息时,可以使用一个循环来遍历整个链表,并输出每个节点中的数据。
  5. 在查询和修改学生信息时,可以遍历整个链表,并查找匹配的节点。如果找到了匹配节点,可以进行相应的操作。
  6. 当程序退出时,需要释放链表中所有节点占用的内存。可以使用一个循环来遍历链表,并释放每个节点占用的内存。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#define MAX_NAME_LEN 10

// 链表结点
struct Node {
    int num;
    char name[MAX_NAME_LEN];
    float score;
    struct Node *next;
};

// 链表头指针
struct Node *head = NULL;

// 声明函数
void save(void);
void input(void);
void output(void);
void scoremodify(void);
void namemodify(void);
void scorecheck(void);
void namecheck(void);
void Addstudent(void);
void sclsearch(void);

int main() {
    int choose, t = 0;
    long int num;

    while (true) {
        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", &choose);

        switch (choose) {
            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;
    struct Node *p = head;
    if ((fp = fopen("stu.dat", "wb")) == NULL) /* 以只写的方式打开文件*/
    {
        printf("无法打开文件!\n");
        return;
    }
    while (p != NULL) {
        if (fwrite(p,
case 8:

sclsearch();

printf("\n");

system("PAUSE");

system("CLS");

break;

case 0:

exit(0);

default: ;

}

}

void save()

{

FILE *fp;

if ((fp=fopen("stu.dat","wb"))==NULL)/以只写的方式打开文件/

{

printf("无法打开文件!\n");

return ;

}

for(i=0;i<n;i++)

if (fwrite (&stud[i],sizeof(struct student),1,fp)!=1)/写入字节为 1 的信息在文件中/

printf("文件写入错误!\n");

fclose(fp);/关闭文件/

}

void input()//录入学生成绩

{

int i;

char a;

for(i=0;i<n;i++)

{

printf("\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;i<n;i++)

{

if(stud[i].num==number)

{

printf("请输入新的c语言成绩:");

scanf("%f",&stud[i].score[0]);

printf("修改成功!\n");

break;

}

}

if(i==n)

printf("学生学号不存在!\n");

}

void namemodify()

{

char name[10];

int i,j=0;

printf("请输入要修改信息的学生姓名:");

scanf("%s",name);

for(i=0;i<n;i++)

{

if(strcmp(stud[i].name,name)==0)

{

printf("请输入新的c语言成绩:");

scanf("%f",&stud[i].score[0]);

printf("修改成功!\n");

j=1;

}

}

if(j==0)

printf("学生姓名不存在!\n");

}

void scorecheck()

{

int i,number;

printf("请输入要查询信息的学生学号:");

scanf("%d",&number);

for(i=0;i<count;i++)

{

if(student[i].number==number)

{

printf("学生姓名:%s\n",student[i].name);

printf("学生学号:%d\n",student[i].number);

printf("学生成绩:%d\n",student[i].score);

return;

}

}

printf("学生学号不存在!\n");

}

void ranklist()

{

int i,j;

struct student temp;

for(i=0;i<count-1;i++)

for(j=i+1;j<count;j++)

if(student[i].score<student[j].score)

{

temp=student[i];

student[i]=student[j];

student[j]=temp;

}

printf("成绩排名如下:\n");

for(i=0;i<count;i++)

{

printf("学生姓名:%s\n",student[i].name);

printf("学生学号:%d\n",student[i].number);

printf("学生成绩:%d\n",student[i].score);

}

}

void save()

{

int i;

FILE *fp;

if((fp=fopen("stu.txt","w"))==NULL)

{

printf("无法打开文件!\n");

return;

}

for(i=0;i<count;i++)

fprintf(fp,"%s %d %d\n",student[i].name,student[i].number,student[i].score);

fclose(fp);

printf("文件已保存!\n");

}

void read()

{

int i;

FILE *fp;

if((fp=fopen("stu.txt","r"))==NULL)

{

printf("无法打开文件!\n");

return;

}

count=0;

while(fscanf(fp,"%s %d %d\n",student[count].name,&student[count].number,&student[count].score)!=EOF)

count++;

fclose(fp);

printf("文件已读取!\n");

}

void menu()

{

printf("\n");

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("**** 0.退出系统 ****\n");

printf("*************************\n");

}