鱼C论坛

 找回密码
 立即注册
查看: 2163|回复: 2

[已解决]C语言课后作业S1E45问题求助

[复制链接]
发表于 2022-8-3 23:49:54 | 显示全部楼层 |阅读模式

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

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

x
用单链表实现如下图的结果:
003606zafqoqlffjx9a1z4.png.thumb.jpg

这是代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.    
  4. struct Date
  5. {
  6.         int year;
  7.         int month;
  8.         int day;
  9. };
  10.    
  11. struct Record
  12. {
  13.         char name[16];
  14.         int age;
  15.         struct Date first;
  16.         struct Date second;
  17.         struct Record *next;
  18. };
  19. void getInput(struct Record *record);
  20. void printRecord(struct Record *head);
  21. void addRecord(struct Record **head);
  22. void releaseRecord(struct Record *head);
  23.    
  24. void getInput(struct Record *record)
  25. {
  26.         printf("请问姓名是:");
  27.         scanf("%s", record->name);
  28.         printf("请问年龄是:");
  29.         scanf("%d", &record->age);
  30.         printf("请问是否接种过疫苗(Y/N):");
  31.    
  32.         getchar();
  33.         if (getchar() != 'Y')
  34.         {
  35.                 record->first.year = 0;
  36.                 printf("请尽快接种疫苗!\n");
  37.         }
  38.         else
  39.         {
  40.                 printf("请输入第一针疫苗接种的日期(yyyy-mm-dd):");
  41.                 scanf("%d-%d-%d", &record->first.year, &record->first.month, &record->first.day);
  42.    
  43.                 printf("请问是否接种第二针疫苗(Y/N):");
  44.                 getchar();
  45.                 if (getchar() != 'Y')
  46.                 {
  47.                         record->second.year = 0;
  48.                         printf("请尽快接种第二针疫苗!\n");
  49.                 }
  50.                 else
  51.                 {
  52.                         printf("请输入第二针疫苗接种的日期(yyyy-mm-dd):");
  53.                         scanf("%d-%d-%d", &record->second.year, &record->second.month, &record->second.day);
  54.                 }
  55.         }
  56.         putchar('\n');
  57. }
  58.    
  59. void printRecord(struct Record *head)
  60. {
  61.         struct Record *record;
  62.    
  63.         record = head;
  64.    
  65.         while (record != NULL)
  66.         {
  67.                 printf("姓名:%s,年龄:%d\n", (*record).name, (*record).age);
  68.    
  69.                 if (record->first.year == 0)
  70.                 {
  71.                         printf("未接种疫苗!\n\n");
  72.                 }
  73.                 else
  74.                 {
  75.                         printf("第一针疫苗接种日期:%d-%d-%d,", (*record).first.year, (*record).first.month, (*record).first.day);
  76.                 }
  77.    
  78.                 if ((*record).first.year != 0 && (*record).second.year == 0)
  79.                 {
  80.                         printf("未接种第二针疫苗!\n\n");
  81.                 }
  82.                 else if((*record).first.year != 0)
  83.                 {
  84.                         printf("第二针疫苗接种日期:%d-%d-%d\n\n", (*record).second.year, (*record).second.month, (*record).second.day);
  85.                 }
  86.    
  87.                 record = record -> next;
  88.         }
  89. }
  90.    
  91. void addRecord(struct Record **head)
  92. {
  93.         struct Record *record, *temp;
  94.    
  95.         record = (struct Record *)malloc(sizeof(struct Record));
  96.         if (record == NULL)
  97.         {
  98.                 printf("内存分配失败!\n");
  99.                 exit(1);
  100.         }
  101.    
  102.         getInput(record);
  103.    
  104.         if (*head != NULL)
  105.         {
  106.                 temp = *head;
  107.                 *head = record;
  108.                 record->next = temp;
  109.         }
  110.         else
  111.         {
  112.                 *head = record;
  113.                 record->next = NULL;
  114.         }
  115. }
  116.    
  117. void releaseRecord(struct Record *head)
  118. {
  119.         struct Record *temp;
  120.    
  121.         while (head != NULL)
  122.         {
  123.                 temp = head;
  124.                 head = head->next;
  125.                 free(temp);
  126.         }
  127. }
  128.    
  129. int main(void)
  130. {
  131.         struct Record *head = NULL;
  132.         int ch;
  133.    
  134.         while (1)
  135.         {
  136.                 printf("请问是否需要录入(Y/N):");
  137.                 do
  138.                 {
  139.                         ch = getchar();
  140.                 } while (ch != 'Y' && ch != 'N');
  141.    
  142.                 if (ch == 'Y')
  143.                 {
  144.                         addRecord(&head);
  145.                 }
  146.                 else
  147.                 {
  148.                         break;
  149.                 }
  150.         }
  151.    
  152.         printf("请问是否需要打印已录入数据(Y/N):");
  153.         do
  154.         {
  155.                 ch = getchar();
  156.         } while (ch != 'Y' && ch != 'N');
  157.    
  158.         if (ch == 'Y')
  159.         {
  160.                 printRecord(head);
  161.         }
  162.    
  163.         releaseRecord(head);
  164.    
  165.         return 0;
  166. }
复制代码



在第59行的printRecord函数中,用了局部变量结构体指针*record,并令record = head;
我想问一下,这个局部变量结构体指针*record能省去吗?直接用head指针不好吗?

就是把printRecord函数代码写成这样:
  1. void printRecord(struct Record *head)
  2. {
  3.         while(head!=NULL)
  4.         {
  5.                 printf("姓名:%s,年龄:%d\n",head->name,head->age);
  6.                 if(head->first.year==0)
  7.                 {
  8.                         printf("未接种疫苗!\n");
  9.                 }
  10.                 else
  11.                 {
  12.                         printf("第一针疫苗接种日期:%d-%d-%d,",head->first.year,head->first.month,head->first.day);
  13.                         if(head->second.year==0)
  14.                         {
  15.                                 printf("未接种第二针疫苗!\n");
  16.                         }
  17.                         else
  18.                         {
  19.                                 printf("第二针疫苗接种日期:%d-%d-%d\n",head->second.year,head->second.month,head->second.day);
  20.                         }
  21.                 }
  22.                 putchar('\n');
  23.                
  24.                 head=head->next;
  25.         }
  26. }
复制代码


我试了试,这样程序也可以正常运行,那为什么要多设置一个指针*record呢?
最佳答案
2022-8-3 23:54:45
record 是临时指针,这样做的好处是防止改变原有的指针指向。要不要用你看情况而定。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-3 23:54:45 | 显示全部楼层    本楼为最佳答案   
record 是临时指针,这样做的好处是防止改变原有的指针指向。要不要用你看情况而定。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
治愈罗小黑 + 5 + 5 + 3

查看全部评分

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

使用道具 举报

 楼主| 发表于 2022-8-3 23:56:20 | 显示全部楼层
ba21 发表于 2022-8-3 23:54
record 是临时指针,这样做的好处是防止改变原有的指针指向。要不要用你看情况而定。

哦哦哦,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 21:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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