鱼C论坛

 找回密码
 立即注册
查看: 714|回复: 6

[已解决]有关链表问题的改进

[复制链接]
发表于 2020-12-23 10:33:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是我的源代码
#include <stdio.h>
#include <stdlib.h>
typedef struct stu{
   int num;
   char name[10];
   char sex;
   int age;
   struct stu *next;
}STU,*STUP;    //声明一个结构体,里面包含学号、姓名、性别、年龄,还该结构体指针。
#define LEN sizeof(STU)
int main()
{
STUP head;
STUP creat(void);  //建立链表函数。
STUP delet(STUP head,int age_temp);//删除要求年龄函数。
void print(STUP head);//输出链表函数
int age_temp;
printf("请输入学号、姓名、性别、年龄:\n");
head=creat();
print(head);
printf("请输入要删除的年龄:\n");
scanf("%d",&age_temp);
head=delet(head,age_temp);
printf("输出删除后的信息:\n");
print(head);
}
STUP creat(void)  //建立链表函数
{
  STUP p1,p2,head;
  int n=0;
  p1=p2=(STUP)malloc(LEN);
  head=NULL;
  scanf("%d %s %c %d",&p1->num,p1->name,&p1->sex,&p1->age);
  while(p1->num!=0)
  {
   n=n+1;
   if(n==1)
    head=p1;
   else p2->next=p1;
   p2=p1;
   p1=(STUP)malloc(LEN);
  scanf("%d %s %c %d",&p1->num,p1->name,&p1->sex,&p1->age);
  }
  p2->next=NULL;
  return head;

}
void print(STUP head) //输出链表函数
{
  STUP p;
  p=head;
  if(head!=NULL)
  do{
    printf("%5d%7s%4c%5d\n",p->num,p->name,p->sex,p->age);
    p=p->next;
  }while(p!=NULL);

}
STUP delet(STUP head,int age_temp)  //删除要求年龄函数
{
STUP h,p;
h=(STUP)malloc(LEN); //创建一个空结点
h->next=head;
  head=h;
for(p=head;p->next!=NULL;p=p->next)
  if(p->next->age==age_temp)
    p->next=p->next->next;
    head=head->next;
   return head;
}
问:如何定义函数link_create、link_delete、link_insert 和link_outpout,分别完成链表的创建、按照年龄删除结点、在链表头插入新结点和链表元素输出显示。在主函数中依次调用这些函数来实现本题功能。
最佳答案
2020-12-23 10:58:04
本帖最后由 一世轻尘 于 2020-12-23 10:59 编辑
  1. //学生成绩管理系统
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. #include<conio.h>
  6. #define LEN sizeof(struct student)

  7. //学生信息结构体
  8. struct student
  9. {
  10.         char name[10];//学生姓名
  11.         char id[15];//学生学号
  12.         int score[3];//学生三科成绩
  13.         struct student *next;
  14. };

  15. typedef struct student stu;

  16. //声明函数
  17. stu* enter(stu *h);//成绩录入函数
  18. stu* initialize();//初始化链表头函数
  19. void menu();//菜单
  20. void print(stu *h);//成绩打印函数
  21. void modify(stu *h);//成绩修改函数
  22. void statistics(stu *h);//查找统计信息
  23. void del(stu *h);//删除函数
  24. void quit(stu *h);//退出函数
  25. void save(stu *h);//保存文件函数
  26. void open(stu *h);//打开文件读取信息建立链表函数


  27. //主函数
  28. int main()
  29. {
  30.         stu *data;//指向链表头,建立成绩链表,所有学生信息存放 在此链表
  31.         int function;//功能选项
  32.         char flag;//判断变量
  33.         int t=0;
  34.         data=initialize();//初始化头结点
  35.         open(data);//读取文件内的数据,并建立链表
  36.         while(1)
  37.         {
  38.                 menu();//打开菜单
  39.                 printf("请选择操作:");
  40.                 scanf("%d",&function);//输入你想要实现的功能
  41.                 switch(function)//构建多个功能分支
  42.                 {
  43.                         case 1:while(1)
  44.                         {
  45.                                 enter(data);//输入一个数据并连接在链表的后面
  46.                                 printf("是否继续输入(y/n)");
  47.                                 scanf("%s",&flag);
  48.                                 if(flag=='N'||flag=='n')break;
  49.                         }system("cls");break;
  50.                         case 2:print(data);_getch();system("cls");break;
  51.                         case 3:modify(data);system("cls");break;
  52.                         case 4:statistics(data);_getch();system("cls");break;
  53.                         case 5:del(data);_getch();system("cls");break;
  54.                         case 6:quit(data);break;
  55.                         default:printf("error!!!请重新输入:");
  56.                         break;
  57.                 }//switch结束
  58.         }
  59.         return 0;
  60. }

  61. //系统界面显示
  62. void menu()
  63. {
  64.         printf("          ***********************************************             \n");
  65.         printf("            **********学生成绩管理系统*****************               \n");
  66.         printf("          ***********************************************             \n");
  67.         printf("                       1.录入和添加成绩                               \n");
  68.         printf("                       2.输出成绩                                     \n");
  69.         printf("                       3.修改成绩                                     \n");
  70.         printf("                       4.查找学生信息                                 \n");
  71.         printf("                       5.删除学生信息                                 \n");
  72.         printf("                       6.退出系统并保存                               \n");
  73.         printf("          ***********************************************             \n");
  74. }

  75. //初始化头节点函数
  76. stu* initialize()
  77. {
  78.         stu *head;
  79.         head=(stu*)malloc(LEN);
  80.         if(head==NULL)
  81.         {
  82.                 printf("error!");
  83.                 exit(1);
  84.         }
  85.         head->next=NULL;//使头结点指针域为空
  86.         return head;
  87. }



  88. //成绩录入
  89. stu* enter(stu *h)
  90. {
  91.         stu *p,*q=h;
  92.         char name[10],id[15];
  93.         int math, English,computer;
  94.         p=(stu*)malloc(LEN);//为学生信息申请节点
  95.         printf("请依次输入学生信息:\n");
  96.         printf("姓名 学号 数学 英语 计算机导论与程序设计\n");
  97.         scanf("%s %s %d %d %d",name,id,&math,&English,&computer);
  98.        
  99.         for(;q->next!=NULL;q=q->next){;}//移动到尾结点

  100. //将输入的内容赋值给链表中的相应位置
  101.         strcpy(p->name,name);
  102.         strcpy(p->id,id);
  103.         p->score[0]=math;
  104.         p->score[1]=English;
  105.         p->score[2]=computer;
  106.         p->next=NULL;
  107.         q->next=p;
  108.         q=p;
  109.         return h;
  110. }


  111. //成绩打印
  112. void print(stu *h)
  113. {
  114.         stu *p=h->next;//从头结点之后的结点开始输出
  115.         printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");//左对齐的方式输出
  116.         while(p!=NULL)//输出链表的全部内容
  117.         {
  118.                 printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
  119.                 p=p->next;
  120.         }
  121. }



  122. //成绩修改
  123. void modify(stu *h)
  124. {
  125.         stu *p=h->next;
  126.         char name[10],id[15];
  127.         int math,English,computer;
  128.         printf("请输入学生姓名:");
  129.         scanf("%s",name);
  130.         printf("请输入学生学号:");
  131.         scanf("%s",id);
  132.        
  133.         while(p)
  134.         {
  135.                 if(strcmp(p->name,name)==0&&strcmp(p->id,id)==0)
  136.                 {
  137.                         printf("当前学生信息:\n");
  138.                         printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
  139.                         printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
  140.                         printf("请输入更正后的数学成绩:");
  141.                         scanf("%d",&math);
  142.                         printf("请输入更正后的英语成绩:");
  143.                         scanf("%d",&English);
  144.                         printf("请输入更正后的计算机导论与程序设计成绩:");
  145.                         scanf("%d",&computer);
  146.                         p->score[0]=math;
  147.                         p->score[1]=English;
  148.                         p->score[2]=computer;
  149.                         printf("更改完成!\n");
  150.                         system("pause");
  151.                         break;
  152.                 }
  153.                 else
  154.                 {
  155.                         p=p->next;
  156.                 }
  157.         }//while循环结束
  158. }


  159. //查询统计
  160. void statistics(stu *h)
  161. {
  162.         while(1)
  163.         {
  164.         int z;//选项变量
  165.         system("cls");//清屏
  166.         printf("请输入查找方式:\n7.按姓名学号查找\n8.按成绩查找\n9.退出\n") ;
  167.         scanf("%d",&z);
  168.         system("cls");
  169.         switch(z)
  170.         {
  171.                 case 7:{
  172.                         stu *p=h->next;
  173.                 char name[10],id[15];
  174.                 printf("请输入学生姓名:");
  175.                 scanf("%s",name);
  176.                 printf("请输入学生学号:");
  177.                 scanf("%s",id);
  178.                 while (p)
  179.             {
  180.                      if(strcmp(p->name,name)==0&&strcmp(p->id,id)==0)//比较姓名学号
  181.                     {
  182.                         printf("当前学生信息:\n");
  183.                         printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
  184.                         printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
  185.                         break;
  186.                     }
  187.                     else
  188.                     {
  189.                         p=p->next;
  190.                     }
  191.                 }//while循环结束
  192.                 }system("pause");system("cls");break;
  193.                 case 8:{
  194.                     while(1){
  195.                         int x;//选项变量
  196.                         int num=0;//初始化满足条件的人数
  197.                         printf("请输入按哪一科成绩进行查找:\n按数学成绩查找输入10\n按英语成绩查找输入11\n按计算机导论与程序设计成绩查找输入12\n退出输入13\n");
  198.                         scanf("%d",&x);
  199.                         switch(x)
  200.                         {
  201.                                 case 10:{
  202.                             stu *p1=h->next;
  203.                                 int M1,M2;
  204.                                 printf("请依次输入所要查找的数学成绩的下界与上界:\n");
  205.                                 scanf("%d %d",&M1,&M2);
  206.                                 printf("学生信息:\n");
  207.                                 printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
  208.                                
  209.                                 while(p1){       
  210.                                         if((p1->score[0]-M1)>=0&&(p1->score[0]-M2<=0))
  211.                                         {
  212.                                     printf("%-15s%-10s%-10d%-10d%-10d\n",p1->id,p1->name,p1->score[0],p1->score[1],p1->score[2]);
  213.                                     num++;
  214.                                     p1=p1->next;
  215.                                         }
  216.                                         else
  217.                                         {
  218.                                                 p1=p1->next;
  219.                                         }
  220.                                     }//while循环结束
  221.                                     printf("人数为%d\n",num);//输出人数
  222.                                     system("pause");
  223.                                     system("cls");
  224.                                 }break;
  225.                                 case 11:{
  226.                 stu *p2=h->next;
  227.                                 int E1,E2;
  228.                                 printf("请依次输入所要查找的英语成绩的下界与上界:\n");
  229.                                 scanf("%d %d",&E1,&E2);
  230.                                 printf("学生信息:\n");
  231.                                 printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
  232.                                 while(p2){
  233.                                         if((p2->score[1]-E1)>=0&&(p2->score[2]-E2<=0))
  234.                                         {
  235.                                     printf("%-15s%-10s%-10d%-10d%-10d\n",p2->id,p2->name,p2->score[0],p2->score[1],p2->score[2]);
  236.                                     num++;
  237.                                     p2=p2->next;
  238.                                         }
  239.                                         else
  240.                                         {
  241.                                                 p2=p2->next;
  242.                                         }
  243.                                 }//while循环结束
  244.                                 printf("人数为%d\n",num);
  245.                                 system("pause");
  246.                                 system("cls");
  247.                             }
  248.                                 break;
  249.                                 case 12:{
  250.                                 stu *p3=h->next;
  251.                                 int C1,C2;
  252.                                 printf("请依次输入所要查找的计算机导论与程序设计成绩的下界与上界:\n");
  253.                                 scanf("%d %d",&C1,&C2);
  254.                                 printf("学生信息:\n");
  255.                                 printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
  256.                                 while(p3){
  257.                                         if((p3->score[2]-C1)>=0&&(p3->score[2]-C2<=0))
  258.                                         {
  259.                                     printf("%-15s%-10s%-10d%-10d%-10d\n",p3->id,p3->name,p3->score[0],p3->score[1],p3->score[2]);
  260.                                     num++;
  261.                                     p3=p3->next;
  262.                                         }
  263.                                         else
  264.                                         {
  265.                                                 p3=p3->next;
  266.                                         }
  267.                                 }//while循环结束
  268.                                 printf("人数为%d\n",num);
  269.                                 system("pause");
  270.                                 system("cls");
  271.                             }
  272.                                 break;
  273.                                 case 13:goto label2;//跳出双重循环
  274.                                 default:break;
  275.                         }
  276.                 }
  277.                 label2:printf("已退出");
  278.                 }system("pause");system("cls");break;
  279.                 case 9:goto label1;//跳出双重循环
  280.                 default:break;
  281.         }
  282.     }
  283.     label1:printf("已退出\n");
  284. }



  285. //删除函数
  286. void del(stu *h)
  287. {
  288.         stu *p=h,*q;
  289.         q=p->next;
  290.         char name[10],id[15];
  291.         printf("请输入学生姓名:");
  292.         scanf("%s",name);
  293.         printf("请输入学生学号:");
  294.         scanf("%s",id);
  295.         while(q)
  296.         {
  297.                 if(strcmp(q->name,name)==0&&strcmp(q->id,id)==0)
  298.                 {
  299.                         p->next=q->next;
  300.                         free(q);//删除p结点
  301.                         printf("删除成功\n");
  302.                         break;
  303.                 }
  304.                 else
  305.                 {
  306.                         p=p->next;
  307.                         q=q->next;
  308.                 }
  309.          }//while循环结束
  310. }



  311. //退出系统
  312. void quit(stu *h)
  313. {
  314.         save(h);//退出时保存信息
  315.         exit(0);
  316. }



  317. //打开文件
  318. void open(stu *h)
  319. {
  320.         stu *p=h;
  321.         stu *q;//临时变量,用于保存从文件中提取的信息
  322.         FILE*file=fopen("./Information.txt","rb");
  323.         if(!file)
  324.         {
  325.                 printf("文件打开失败!");
  326.                 return ;
  327.         }
  328.        
  329.        
  330.         q=(stu*)malloc(LEN);//开辟内存
  331.         fread(q,LEN,1,file);//进入循环前先读取一个结点
  332.         while(!feof(file))//判断是否到达文件结尾,如果没有就进入或继续循环
  333.         //否则,就绕过或结束循环
  334.         {
  335.                 //代码执行到这里,说明没有到达文件结尾,本次读取的节点数据有效
  336.                 p->next=q;//更新链表数据,把新的节点纳入链表
  337.                 p=q;//更新链表数据,把新的节点纳入链表
  338.                 q=(stu*)malloc(LEN);//分配内存,准备读取下一个结点
  339.                 fread(q,LEN,1,file);//读取下一个结点,执行完此句,返回到while循环入口
  340.         }//while循环结束
  341.          
  342.         p->next=NULL;//使尾结点指向空,结束链表
  343.         fclose(file);
  344. }


  345. //保存信息到文件中
  346. void save(stu *h)
  347. {
  348.         stu *p=h->next;
  349.         int flag;
  350.         FILE *file=fopen("./information.txt","wb");
  351.         if(!file)
  352.         {
  353.                 printf("文件打开失败!");
  354.                 return ;
  355.         }
  356.         while (p!=NULL)
  357.         {
  358.                 flag=fwrite(p,LEN,1,file);//依次将p所指向的链表中的内容写入到文件中
  359.                 if(flag!=1)
  360.                 {
  361.                         break;
  362.                 }
  363.                 p=p->next;
  364.         }
  365.         fclose(file);
  366. }
复制代码

给,我们的作业,除了要求输入的内容不一样外所有要求都实现了,稍微把函数名改一下,然后把文件那部分删了就行了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-23 10:58:04 | 显示全部楼层    本楼为最佳答案   
本帖最后由 一世轻尘 于 2020-12-23 10:59 编辑
  1. //学生成绩管理系统
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. #include<conio.h>
  6. #define LEN sizeof(struct student)

  7. //学生信息结构体
  8. struct student
  9. {
  10.         char name[10];//学生姓名
  11.         char id[15];//学生学号
  12.         int score[3];//学生三科成绩
  13.         struct student *next;
  14. };

  15. typedef struct student stu;

  16. //声明函数
  17. stu* enter(stu *h);//成绩录入函数
  18. stu* initialize();//初始化链表头函数
  19. void menu();//菜单
  20. void print(stu *h);//成绩打印函数
  21. void modify(stu *h);//成绩修改函数
  22. void statistics(stu *h);//查找统计信息
  23. void del(stu *h);//删除函数
  24. void quit(stu *h);//退出函数
  25. void save(stu *h);//保存文件函数
  26. void open(stu *h);//打开文件读取信息建立链表函数


  27. //主函数
  28. int main()
  29. {
  30.         stu *data;//指向链表头,建立成绩链表,所有学生信息存放 在此链表
  31.         int function;//功能选项
  32.         char flag;//判断变量
  33.         int t=0;
  34.         data=initialize();//初始化头结点
  35.         open(data);//读取文件内的数据,并建立链表
  36.         while(1)
  37.         {
  38.                 menu();//打开菜单
  39.                 printf("请选择操作:");
  40.                 scanf("%d",&function);//输入你想要实现的功能
  41.                 switch(function)//构建多个功能分支
  42.                 {
  43.                         case 1:while(1)
  44.                         {
  45.                                 enter(data);//输入一个数据并连接在链表的后面
  46.                                 printf("是否继续输入(y/n)");
  47.                                 scanf("%s",&flag);
  48.                                 if(flag=='N'||flag=='n')break;
  49.                         }system("cls");break;
  50.                         case 2:print(data);_getch();system("cls");break;
  51.                         case 3:modify(data);system("cls");break;
  52.                         case 4:statistics(data);_getch();system("cls");break;
  53.                         case 5:del(data);_getch();system("cls");break;
  54.                         case 6:quit(data);break;
  55.                         default:printf("error!!!请重新输入:");
  56.                         break;
  57.                 }//switch结束
  58.         }
  59.         return 0;
  60. }

  61. //系统界面显示
  62. void menu()
  63. {
  64.         printf("          ***********************************************             \n");
  65.         printf("            **********学生成绩管理系统*****************               \n");
  66.         printf("          ***********************************************             \n");
  67.         printf("                       1.录入和添加成绩                               \n");
  68.         printf("                       2.输出成绩                                     \n");
  69.         printf("                       3.修改成绩                                     \n");
  70.         printf("                       4.查找学生信息                                 \n");
  71.         printf("                       5.删除学生信息                                 \n");
  72.         printf("                       6.退出系统并保存                               \n");
  73.         printf("          ***********************************************             \n");
  74. }

  75. //初始化头节点函数
  76. stu* initialize()
  77. {
  78.         stu *head;
  79.         head=(stu*)malloc(LEN);
  80.         if(head==NULL)
  81.         {
  82.                 printf("error!");
  83.                 exit(1);
  84.         }
  85.         head->next=NULL;//使头结点指针域为空
  86.         return head;
  87. }



  88. //成绩录入
  89. stu* enter(stu *h)
  90. {
  91.         stu *p,*q=h;
  92.         char name[10],id[15];
  93.         int math, English,computer;
  94.         p=(stu*)malloc(LEN);//为学生信息申请节点
  95.         printf("请依次输入学生信息:\n");
  96.         printf("姓名 学号 数学 英语 计算机导论与程序设计\n");
  97.         scanf("%s %s %d %d %d",name,id,&math,&English,&computer);
  98.        
  99.         for(;q->next!=NULL;q=q->next){;}//移动到尾结点

  100. //将输入的内容赋值给链表中的相应位置
  101.         strcpy(p->name,name);
  102.         strcpy(p->id,id);
  103.         p->score[0]=math;
  104.         p->score[1]=English;
  105.         p->score[2]=computer;
  106.         p->next=NULL;
  107.         q->next=p;
  108.         q=p;
  109.         return h;
  110. }


  111. //成绩打印
  112. void print(stu *h)
  113. {
  114.         stu *p=h->next;//从头结点之后的结点开始输出
  115.         printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");//左对齐的方式输出
  116.         while(p!=NULL)//输出链表的全部内容
  117.         {
  118.                 printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
  119.                 p=p->next;
  120.         }
  121. }



  122. //成绩修改
  123. void modify(stu *h)
  124. {
  125.         stu *p=h->next;
  126.         char name[10],id[15];
  127.         int math,English,computer;
  128.         printf("请输入学生姓名:");
  129.         scanf("%s",name);
  130.         printf("请输入学生学号:");
  131.         scanf("%s",id);
  132.        
  133.         while(p)
  134.         {
  135.                 if(strcmp(p->name,name)==0&&strcmp(p->id,id)==0)
  136.                 {
  137.                         printf("当前学生信息:\n");
  138.                         printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
  139.                         printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
  140.                         printf("请输入更正后的数学成绩:");
  141.                         scanf("%d",&math);
  142.                         printf("请输入更正后的英语成绩:");
  143.                         scanf("%d",&English);
  144.                         printf("请输入更正后的计算机导论与程序设计成绩:");
  145.                         scanf("%d",&computer);
  146.                         p->score[0]=math;
  147.                         p->score[1]=English;
  148.                         p->score[2]=computer;
  149.                         printf("更改完成!\n");
  150.                         system("pause");
  151.                         break;
  152.                 }
  153.                 else
  154.                 {
  155.                         p=p->next;
  156.                 }
  157.         }//while循环结束
  158. }


  159. //查询统计
  160. void statistics(stu *h)
  161. {
  162.         while(1)
  163.         {
  164.         int z;//选项变量
  165.         system("cls");//清屏
  166.         printf("请输入查找方式:\n7.按姓名学号查找\n8.按成绩查找\n9.退出\n") ;
  167.         scanf("%d",&z);
  168.         system("cls");
  169.         switch(z)
  170.         {
  171.                 case 7:{
  172.                         stu *p=h->next;
  173.                 char name[10],id[15];
  174.                 printf("请输入学生姓名:");
  175.                 scanf("%s",name);
  176.                 printf("请输入学生学号:");
  177.                 scanf("%s",id);
  178.                 while (p)
  179.             {
  180.                      if(strcmp(p->name,name)==0&&strcmp(p->id,id)==0)//比较姓名学号
  181.                     {
  182.                         printf("当前学生信息:\n");
  183.                         printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
  184.                         printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
  185.                         break;
  186.                     }
  187.                     else
  188.                     {
  189.                         p=p->next;
  190.                     }
  191.                 }//while循环结束
  192.                 }system("pause");system("cls");break;
  193.                 case 8:{
  194.                     while(1){
  195.                         int x;//选项变量
  196.                         int num=0;//初始化满足条件的人数
  197.                         printf("请输入按哪一科成绩进行查找:\n按数学成绩查找输入10\n按英语成绩查找输入11\n按计算机导论与程序设计成绩查找输入12\n退出输入13\n");
  198.                         scanf("%d",&x);
  199.                         switch(x)
  200.                         {
  201.                                 case 10:{
  202.                             stu *p1=h->next;
  203.                                 int M1,M2;
  204.                                 printf("请依次输入所要查找的数学成绩的下界与上界:\n");
  205.                                 scanf("%d %d",&M1,&M2);
  206.                                 printf("学生信息:\n");
  207.                                 printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
  208.                                
  209.                                 while(p1){       
  210.                                         if((p1->score[0]-M1)>=0&&(p1->score[0]-M2<=0))
  211.                                         {
  212.                                     printf("%-15s%-10s%-10d%-10d%-10d\n",p1->id,p1->name,p1->score[0],p1->score[1],p1->score[2]);
  213.                                     num++;
  214.                                     p1=p1->next;
  215.                                         }
  216.                                         else
  217.                                         {
  218.                                                 p1=p1->next;
  219.                                         }
  220.                                     }//while循环结束
  221.                                     printf("人数为%d\n",num);//输出人数
  222.                                     system("pause");
  223.                                     system("cls");
  224.                                 }break;
  225.                                 case 11:{
  226.                 stu *p2=h->next;
  227.                                 int E1,E2;
  228.                                 printf("请依次输入所要查找的英语成绩的下界与上界:\n");
  229.                                 scanf("%d %d",&E1,&E2);
  230.                                 printf("学生信息:\n");
  231.                                 printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
  232.                                 while(p2){
  233.                                         if((p2->score[1]-E1)>=0&&(p2->score[2]-E2<=0))
  234.                                         {
  235.                                     printf("%-15s%-10s%-10d%-10d%-10d\n",p2->id,p2->name,p2->score[0],p2->score[1],p2->score[2]);
  236.                                     num++;
  237.                                     p2=p2->next;
  238.                                         }
  239.                                         else
  240.                                         {
  241.                                                 p2=p2->next;
  242.                                         }
  243.                                 }//while循环结束
  244.                                 printf("人数为%d\n",num);
  245.                                 system("pause");
  246.                                 system("cls");
  247.                             }
  248.                                 break;
  249.                                 case 12:{
  250.                                 stu *p3=h->next;
  251.                                 int C1,C2;
  252.                                 printf("请依次输入所要查找的计算机导论与程序设计成绩的下界与上界:\n");
  253.                                 scanf("%d %d",&C1,&C2);
  254.                                 printf("学生信息:\n");
  255.                                 printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
  256.                                 while(p3){
  257.                                         if((p3->score[2]-C1)>=0&&(p3->score[2]-C2<=0))
  258.                                         {
  259.                                     printf("%-15s%-10s%-10d%-10d%-10d\n",p3->id,p3->name,p3->score[0],p3->score[1],p3->score[2]);
  260.                                     num++;
  261.                                     p3=p3->next;
  262.                                         }
  263.                                         else
  264.                                         {
  265.                                                 p3=p3->next;
  266.                                         }
  267.                                 }//while循环结束
  268.                                 printf("人数为%d\n",num);
  269.                                 system("pause");
  270.                                 system("cls");
  271.                             }
  272.                                 break;
  273.                                 case 13:goto label2;//跳出双重循环
  274.                                 default:break;
  275.                         }
  276.                 }
  277.                 label2:printf("已退出");
  278.                 }system("pause");system("cls");break;
  279.                 case 9:goto label1;//跳出双重循环
  280.                 default:break;
  281.         }
  282.     }
  283.     label1:printf("已退出\n");
  284. }



  285. //删除函数
  286. void del(stu *h)
  287. {
  288.         stu *p=h,*q;
  289.         q=p->next;
  290.         char name[10],id[15];
  291.         printf("请输入学生姓名:");
  292.         scanf("%s",name);
  293.         printf("请输入学生学号:");
  294.         scanf("%s",id);
  295.         while(q)
  296.         {
  297.                 if(strcmp(q->name,name)==0&&strcmp(q->id,id)==0)
  298.                 {
  299.                         p->next=q->next;
  300.                         free(q);//删除p结点
  301.                         printf("删除成功\n");
  302.                         break;
  303.                 }
  304.                 else
  305.                 {
  306.                         p=p->next;
  307.                         q=q->next;
  308.                 }
  309.          }//while循环结束
  310. }



  311. //退出系统
  312. void quit(stu *h)
  313. {
  314.         save(h);//退出时保存信息
  315.         exit(0);
  316. }



  317. //打开文件
  318. void open(stu *h)
  319. {
  320.         stu *p=h;
  321.         stu *q;//临时变量,用于保存从文件中提取的信息
  322.         FILE*file=fopen("./Information.txt","rb");
  323.         if(!file)
  324.         {
  325.                 printf("文件打开失败!");
  326.                 return ;
  327.         }
  328.        
  329.        
  330.         q=(stu*)malloc(LEN);//开辟内存
  331.         fread(q,LEN,1,file);//进入循环前先读取一个结点
  332.         while(!feof(file))//判断是否到达文件结尾,如果没有就进入或继续循环
  333.         //否则,就绕过或结束循环
  334.         {
  335.                 //代码执行到这里,说明没有到达文件结尾,本次读取的节点数据有效
  336.                 p->next=q;//更新链表数据,把新的节点纳入链表
  337.                 p=q;//更新链表数据,把新的节点纳入链表
  338.                 q=(stu*)malloc(LEN);//分配内存,准备读取下一个结点
  339.                 fread(q,LEN,1,file);//读取下一个结点,执行完此句,返回到while循环入口
  340.         }//while循环结束
  341.          
  342.         p->next=NULL;//使尾结点指向空,结束链表
  343.         fclose(file);
  344. }


  345. //保存信息到文件中
  346. void save(stu *h)
  347. {
  348.         stu *p=h->next;
  349.         int flag;
  350.         FILE *file=fopen("./information.txt","wb");
  351.         if(!file)
  352.         {
  353.                 printf("文件打开失败!");
  354.                 return ;
  355.         }
  356.         while (p!=NULL)
  357.         {
  358.                 flag=fwrite(p,LEN,1,file);//依次将p所指向的链表中的内容写入到文件中
  359.                 if(flag!=1)
  360.                 {
  361.                         break;
  362.                 }
  363.                 p=p->next;
  364.         }
  365.         fclose(file);
  366. }
复制代码

给,我们的作业,除了要求输入的内容不一样外所有要求都实现了,稍微把函数名改一下,然后把文件那部分删了就行了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 17:01:56 | 显示全部楼层
一世轻尘 发表于 2020-12-23 10:58
给,我们的作业,除了要求输入的内容不一样外所有要求都实现了,稍微把函数名改一下,然后把文件那部分删 ...

好家伙,我都觉得咱们一个学校的了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-23 17:20:15 | 显示全部楼层
zxgt5y 发表于 2020-12-23 17:01
好家伙,我都觉得咱们一个学校的了


擦,你哪个学校的,要一个就尴尬了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 17:45:19 | 显示全部楼层
一世轻尘 发表于 2020-12-23 17:20
擦,你哪个学校的,要一个就尴尬了

我在山西,你了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-23 18:17:51 | 显示全部楼层
zxgt5y 发表于 2020-12-23 17:45
我在山西,你了

那不是,我山东
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 20:01:00 From FishC Mobile | 显示全部楼层
一世轻尘 发表于 2020-12-23 18:17
那不是,我山东

好家伙
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-4 06:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表