Linux尺度IOday1

打印 上一主题 下一主题

主题 1036|帖子 1036|积分 3108

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
1:头脑导图

2:将 student.c这个练习题,改成链表后实现
头文件link.h
  1. #ifndef __STRUCT_H__
  2. #define __STRUCT_H__
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. typedef struct Student{
  6.     char name[20];
  7.     double math;
  8.     double chinese;
  9.     double english;
  10.     double physical;
  11.     double chemical;
  12.     double biological;
  13. }student;
  14. typedef struct node
  15. {
  16.         union
  17.         {
  18.                 student data;
  19.                 int len;
  20.         };
  21.         struct node *next;
  22. }link,*linkptr;
  23. //创建链表
  24. linkptr create_link();
  25. //创建节点
  26. linkptr create_node(student arr[],linkptr H);
  27. //插入
  28. void insert(student arr[],int n,linkptr H);
  29. //将链表的信息保存到文件中
  30. void save(linkptr H,const char *filename);
  31. //读取文件,写入数组
  32. void load(linkptr H,const char *filename,student brr[]);
  33. //展示信息
  34. void show(linkptr H);
  35. //修改数学成绩
  36. void setMath(linkptr H,const char *filename);
  37. //释放链表
  38. void myfree(linkptr H);
  39. #endif
复制代码
源文件link.c
  1. #include "link.h"
  2. //创建链表
  3. linkptr create_link()
  4. {
  5.         linkptr H=(linkptr)malloc(sizeof(link));
  6.         if(NULL==H)
  7.         {
  8.                 printf("申请头结点失败!\n");
  9.                 return NULL;
  10.         }
  11.         H->len=0;
  12.         H->next=NULL;
  13.         return H;
  14. }
  15. //创建节点
  16. linkptr create_node(student arr[],linkptr H)
  17. {
  18.         linkptr p=(linkptr)malloc(sizeof(link));
  19.         if(NULL==p)
  20.         {
  21.                 printf("创建节点失败!\n");
  22.                 return NULL;
  23.         }
  24.         p->data=arr[H->len];
  25.         p->next=NULL;
  26.         return p;
  27. }
  28. //插入
  29. void insert(student arr[],int n,linkptr H)
  30. {
  31.         if(NULL==H)
  32.         {
  33.                 printf("插入失败!\n");
  34.                 return;
  35.         }
  36.         linkptr q=H;
  37.         for(int i=0;i<n;i++)
  38.         {
  39.                 while(q->next)
  40.                 {
  41.                         q=q->next;
  42.                 }
  43.                 linkptr p=create_node(arr,H);
  44.                 p->next=q->next;
  45.                 q->next=p;
  46.                 H->len++;
  47.         }
  48. }
  49. //将链表的信息保存到文件中
  50. void save(linkptr H,const char *filename)
  51. {
  52.         FILE* fp=fopen(filename,"w");
  53.         linkptr q=H;
  54.         while(q->next)
  55.         {
  56.                 q=q->next;
  57.                 fprintf(fp,"%s %lf %lf %lf %lf %lf %lf\n",q->data.name,q->data.math,q->data.chinese,q->data.english,q->data.physical,q->data.chemical,q->data.biological);
  58.         }
  59.         fclose(fp);
  60. }
  61. //读取文件,写入数组
  62. void load(linkptr H,const char *filename,student brr[])
  63. {
  64.         int i=0;
  65.         FILE* fp=fopen(filename,"r");
  66.         linkptr q=H;
  67.         while(q->next)
  68.         {
  69.                 q=q->next;
  70.                 fscanf(fp,"%s %lf %lf %lf %lf %lf %lf\n",brr[i].name,&brr[i].math,&brr[i].chinese,&brr[i].english,&brr[i].physical,&brr[i].chemical,&brr[i].biological);
  71.                 i++;
  72.         }
  73.         fclose(fp);
  74. }
  75. //展示信息
  76. void show(linkptr H)
  77. {
  78.         linkptr q=H;
  79.         while(q->next)
  80.         {
  81.                 q=q->next;
  82.                 printf("姓名=%s\n",q->data.name);
  83.                 printf("数学=%lf\n",q->data.math);
  84.                 printf("语文=%lf\n",q->data.chinese);
  85.                 printf("英语=%lf\n",q->data.english);
  86.                 printf("物理=%lf\n",q->data.physical);
  87.                 printf("化学=%lf\n",q->data.chemical);
  88.                 printf("生物=%lf\n",q->data.biological);
  89.                 printf("-------------------\n");
  90.         }
  91. }
  92. //修改数学成绩
  93. void setMath(linkptr H,const char *filename)
  94. {
  95.         int i=1;
  96.         linkptr q=H;
  97.         while(q->next)
  98.         {
  99.                 double num=0;
  100.                 q=q->next;
  101.                 printf("请输入第%d个同学的数学成绩\n",i);
  102.                 scanf("%lf",&num);
  103.                 q->data.math=num;
  104.                 i++;
  105.         }
  106.         save(H,filename);
  107. }
  108. //释放链表
  109. void myfree(linkptr H)
  110. {
  111.         linkptr q=H;
  112.         while(q->next)
  113.         {
  114.                 while(q->next)
  115.                 {
  116.                         q=q->next;
  117.                 }
  118.                 free(q);
  119.                 q=NULL;
  120.         }
  121.         free(H);
  122.         H=NULL;
  123. }
复制代码
测试文件main.c
  1. #include "link.h"
  2. int main(int argc, const char *argv[])
  3. {
  4.         student arr[3]={{"lisi",99,77,55,78,67,66},
  5.                                         {"wangwu",90,67,78,45,23,99},
  6.                                         {"xiaol",67,45,99,78,56,90}};
  7.         student brr[3]={0};
  8.         linkptr H=create_link();
  9.         insert(arr,3,H);
  10.         save(H,"1.txt");
  11.         load(H,"1.txt",brr);
  12.         show(H);
  13.         setMath(H,"filename");
  14.         show(H);
  15.         return 0;
  16. }
复制代码
代码截屏

测试效果
  1. 姓名=lisi
  2. 数学=99.000000
  3. 语文=77.000000
  4. 英语=55.000000
  5. 物理=78.000000
  6. 化学=67.000000
  7. 生物=66.000000
  8. -------------------
  9. 姓名=wangwu
  10. 数学=90.000000
  11. 语文=67.000000
  12. 英语=78.000000
  13. 物理=45.000000
  14. 化学=23.000000
  15. 生物=99.000000
  16. -------------------
  17. 姓名=xiaol
  18. 数学=67.000000
  19. 语文=45.000000
  20. 英语=99.000000
  21. 物理=78.000000
  22. 化学=56.000000
  23. 生物=90.000000
  24. -------------------
  25. 请输入第1个同学的数学成绩
  26. 12
  27. 请输入第2个同学的数学成绩
  28. 23
  29. 请输入第3个同学的数学成绩
  30. 34
  31. 姓名=lisi
  32. 数学=12.000000
  33. 语文=77.000000
  34. 英语=55.000000
  35. 物理=78.000000
  36. 化学=67.000000
  37. 生物=66.000000
  38. -------------------
  39. 姓名=wangwu
  40. 数学=23.000000
  41. 语文=67.000000
  42. 英语=78.000000
  43. 物理=45.000000
  44. 化学=23.000000
  45. 生物=99.000000
  46. -------------------
  47. 姓名=xiaol
  48. 数学=34.000000
  49. 语文=45.000000
  50. 英语=99.000000
  51. 物理=78.000000
  52. 化学=56.000000
  53. 生物=90.000000
  54. -------------------
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

河曲智叟

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表