struct student
#include"stdio.h" #include"stdlib.h" #define NULL 0 struct student { long num; char name[20]; int score[6]; struct student *next; }; void show() { printf("\nthere is a cataloge as follow.\n"); printf("***************************************\n"); printf("* *\n"); printf("* 1. create *\n"); printf("* 2. Insert *\n"); printf("* 3. print *\n"); printf("* 4. delete *\n"); printf("* 5. modify *\n"); printf("* 6. save_to_file *\n"); printf("* 7. lode from file *\n"); printf("* 8. exit *\n"); printf("***************************************\n"); printf("please input 1--8 to choice what you want:\n"); } struct student *create() { struct student *head,*p,*last; int i; int temp2; char name[20]; p=head=(struct student *)malloc(sizeof(struct student)); head->next=NULL; last=p; while(1) { last->next=p; last=p; p=(struct student *)malloc(sizeof(struct student)); /*last->next=p; last=p;*/ p->next=NULL; printf("number:"); scanf("%ld",&p->num); if(p->num==0)break; getchar(); printf("name:"); scanf("%s",p->name); printf("score:"); for(i=0;i<6;i++) { scanf("%d",&temp2); p->score[i]=temp2; } printf("next student's information.\n"); } free(p); return head; } void Insert(struct student *head) { struct student *p,*q; int score; long num; int i; printf("\nEnter the student's information you want to insert.\n"); printf("number:"); scanf("%ld",&num); q->num=num; getchar(); printf("name:"); scanf("%s",q->name); printf("score:(chinese,math,english,biology,physics,chemistry)\n"); for(i=0;i<6;i++) { scanf("%d",&score); q->score[i]=score; } q->next=NULL; p=head; while(p->next->num<q->num&&p->next!=NULL) p=p->next; q->next=p->next; p->next=q; if(p->next==NULL) p->next=q; } void delete(struct student *head) { struct student *p,*q; long num; printf("enter the student's information you want to delete.\n"); printf("number:"); scanf("%ld",&num); getchar(); p=head; while(p->next!=NULL&&p->next->num!=num) p=p->next; q=p->next; p->next=p->next->next; free(q); } void print(struct student *head) { struct student *p; int i; p=head->next; if(p==NULL) { printf("\nthere is no information.\n"); exit(0); } printf("\nnumber\tnamme\tchinese\tmath\tenglish\tbiology\tphysics\tchemistry\n"); while(p!=NULL) { printf("\n%ld\t%s",p->num,p->name); for(i=0;i<6;i++) printf("\t%d",p->score[i]); p=p->next; } } void modify(struct student *head) { struct student *p; int choice,i; long num; char name[20]; int score[6]; printf("\nEnter what student's information you want to modify.\n"); printf("number:"); scanf("%ld",&num); getchar(); printf("\nname:"); scanf("%s",name); printf("\n"); p=head->next; while(p->num!=num&&p->name[20]!=name[20]&&p!=NULL) p=p->next; printf("\nplease choice what you want to modify:1-number 2-name 3-score.\n"); scanf("%d",&choice); switch(choice) { case 1:printf("\nEnter the true number:"); scanf("%ld",&num); p->num=num; break; case 2:printf("\nEnter the true name:"); scanf("%s",p->name); break; case 3:printf("\nEnter the right score:"); for(i=0;i<6;i++) { scanf("%d",&score[i]); p->score[i]=score[i]; } break; } } void save_in(struct student *head) { struct student *p; FILE *fp; char file_name[30]; printf("please enter the file name you want to save.\n"); scanf("%s",file_name); printf("save to file:%s",file_name); if((fp=fopen(file_name,"w"))==NULL) { printf("can't open the file.\n"); exit(0); } p=head; while(p->next!=NULL) { fwrite((void*)p->next,sizeof(struct student),1,fp); p=p->next; } fclose(fp); } struct student *load_from_file() { struct student *head,*p,*last; FILE *fp; char file_name[30]; head=(struct student *)malloc(sizeof(struct student)); last=head; head->next=NULL; printf("please enter the file name you want to save.\n"); scanf("%s",file_name); printf("save to file:%s",file_name); if((fp=fopen(file_name,"r"))==NULL) { printf("can't open the file.\n"); exit(0); } p=(struct student *)malloc(sizeof(struct student)); p->next=NULL; while(fp=fread((void *)p,sizeof(struct student),1,fp)==1) { last->next=p; last=p; p=(struct student *)malloc(sizeof(struct student)); p->next=NULL; } free(p); fclose(fp); return head; } void main() { struct student *la; int choice; /*char Yes_No;*/ la=(struct student *)malloc(sizeof(struct student)); la->next=NULL; while(1) { show(); scanf("%d",&choice); switch(choice) { case 1:la=create(); break; case 2:Insert(la); break; case 3:print(la); break; case 4:delete(la); break; case 5:modify(la); break; case 6:save_in(la); break; case 7:la=load_from_file(); break; case 8:exit(0); } } } 根据给定的文件标题、描述、标签以及部分内容,本文将详细解析有关 `struct student` 的定义及相关的功能函数实现。 ### 1. 结构体 `struct student` 的定义 ```c struct student { long num; // 学生编号 char name[20]; // 学生姓名 int score[6]; // 成绩数组,假设存储六门科目的成绩 struct student *next; // 链表指针,用于连接下一个学生节点 }; ``` 该结构体定义了学生的基本信息,包括学号(`long num`)、姓名(`char name[20]`)、成绩数组(`int score[6]`)以及指向下一个学生的指针(`struct student *next`),用于构建链表。 ### 2. 功能函数概述 #### (a) `show()`: 显示功能菜单 该函数显示了一个包含八项操作的功能菜单,用户可以根据菜单选择不同的操作。 #### (b) `create()`: 创建学生信息 该函数通过循环创建多个学生节点,并将它们链接成一个单向链表。用户可以输入学生的学号、姓名和成绩,直到输入学号为0时停止输入并返回链表头结点。 #### (c) `Insert()`: 插入学生信息 该函数允许用户在链表中插入新的学生节点。它首先提示用户输入待插入的学生信息,然后根据学生的学号将其插入到正确的位置,保持链表的有序性。 #### (d) `delete()`: 删除学生信息 该函数允许用户删除指定学号的学生信息。如果找到对应学号的学生,则从链表中移除该学生节点,并释放内存。 #### (e) `print()`: 打印所有学生信息 该函数遍历链表并打印出所有学生的信息,包括学号、姓名和各科目成绩。 #### (f) `modify()`: 修改学生信息 该函数允许用户修改指定学号的学生信息。用户可以更新学号、姓名或成绩等信息。 #### (g) `save_in()`: 将学生信息保存到文件 该函数允许用户将当前链表中的学生信息保存到指定的文件中。文件采用二进制格式存储,便于后续读取。 #### (h) `load_from_file()`: 从文件加载学生信息 该函数可以从指定的文件中读取学生信息,并重建链表。文件应为之前使用 `save_in()` 函数保存的文件。 ### 3. 主函数 `main()` 主函数通过循环调用 `show()` 函数显示菜单,并根据用户的输入执行相应的功能。用户可以选择创建、插入、打印、删除、修改学生信息,或者将数据保存到文件和从文件加载数据等功能。 ### 总结 这个程序通过使用结构体和链表来管理学生信息,并提供了一系列实用的功能,如创建、插入、删除、修改学生记录以及将数据保存到文件和从文件加载数据等。这些功能不仅方便了对数据的操作,还提高了数据的安全性和持久性。此外,通过菜单驱动的方式,使得整个系统易于理解和使用。