鱼C论坛

 找回密码
 立即注册
查看: 3576|回复: 7

[已解决]关于递归的问题,请大佬进来看看

[复制链接]
发表于 2022-12-6 17:10:41 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <stdio.h>

  2. struct cityLN {
  3.   char name[20];
  4.   int population;
  5.   struct cityLN *next;
  6. };

  7. void printCities(struct cityLN *ct);
  8. struct cityLN * reverseCitiesRecursive(struct cityLN *ct, struct cityLN *dt);

  9. int main(){
  10.         struct cityLN c1 = {"Hiratsuka", 258, NULL},
  11.                 c2 = {"Odawara", 190, NULL},
  12.                 c3 = {"Yokosuka", 396, NULL},
  13.                 c4 = {"Kamakura", 172, NULL},
  14.                 c5 = {"Chigasaki", 242, NULL},
  15.                 c6 = {"Fujisawa", 434, NULL};
  16.         struct cityLN *head = NULL;
  17.         head = &c1; c1.next = &c2;  c2.next = &c3; c3.next = &c4; c4.next = &c5; c5.next = &c6;
  18.         printf("Original: \n");
  19.         printCities(head);
  20.         printf("reverse: \n");
  21.         head = reverseCitiesRecursive(head, NULL);
  22.         printCities(head);
  23.         return 0;
  24. }
  25. void printCities(struct cityLN *ct){
  26.         if (ct != NULL) {
  27.                 printf("(%-10s: population = %3d)", ct->name, ct->population);
  28.                 printf("%s", (ct->next != NULL) ? " ->\n" : "");
  29.                 printCities(ct->next);
  30.         }
  31.         else
  32.                 putchar('\n');
  33. }
  34. struct cityLN * reverseCitiesRecursive(struct cityLN *ct, struct cityLN *dt){

  35.        
  36. }
复制代码

最后一行的reverseCitiesRecursive(struct cityLN *ct, struct cityLN *dt)函数设计,他原来的顺序是c1->c2->c3->c4->c5->c6这样依次打印出来,而这个函数的作用是让他变成c6->c5->c4->c3->c2->c1
但是问题就出在于必须使用递归,他的输入值时head,head是c1,如果把c1->next更改为NULL,那么这个递归就无法继续下去。卡在这里想了好久都不知道怎么解。我也思考了很多比如先倒过来但是不知道怎么下手,下面的图片是完成后运行代码的输出内容,请问下这个函数应该如何设计。
截屏2022-12-06 18.09.15.png
最佳答案
2022-12-8 10:23:46
壳970527 发表于 2022-12-8 09:47
大佬这个函数存在问题,第一个的时候dt是NULL,就执行不下去了- -
  1. //当时考虑不周
  2. struct cityLN * reverseCitiesRecursive(struct cityLN *ct, struct cityLN *dt){
  3.     if (dt == NULL) {
  4.             return ct;

  5.         }

  6.         struct cityLN * tmp=dt->next;
  7.         dt->next=ct;
  8.         return reverseCitiesRecursive(dt,tmp);


  9. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-6 19:27:16 | 显示全部楼层
本帖最后由 jhq999 于 2022-12-6 19:37 编辑
  1. #include <stdio.h>

  2. struct cityLN {
  3.   char name[20];
  4.   int population;
  5.   struct cityLN *next;
  6. };

  7. void printCities(struct cityLN *ct);
  8. struct cityLN * reverseCitiesRecursive(struct cityLN *ct, struct cityLN *dt);

  9. int main(){
  10.         struct cityLN c1 = {"Hiratsuka", 258, NULL},
  11.                 c2 = {"Odawara", 190, NULL},
  12.                 c3 = {"Yokosuka", 396, NULL},
  13.                 c4 = {"Kamakura", 172, NULL},
  14.                 c5 = {"Chigasaki", 242, NULL},
  15.                 c6 = {"Fujisawa", 434, NULL};
  16.         struct cityLN *head = NULL;
  17.         head = &c1; c1.next = &c2;  c2.next = &c3; c3.next = &c4; c4.next = &c5; c5.next = &c6;
  18.         printf("Original: \n");
  19.         printCities(head);
  20.         printf("reverse: \n");
  21.         struct cityLN * tmp=head;
  22.         head = reverseCitiesRecursive(head, head->next);
  23.         tmp->next=NULL;
  24.         printCities(head);
  25.         return 0;
  26. }
  27. void printCities(struct cityLN *ct){
  28.         if (ct != NULL) {
  29.                 printf("(%-10s: population = %3d)", ct->name, ct->population);
  30.                 printf("%s", (ct->next != NULL) ? " ->\n" : "");
  31.                 printCities(ct->next);
  32.         }
  33.         else
  34.                 putchar('\n');
  35. }
  36. struct cityLN * reverseCitiesRecursive(struct cityLN *ct, struct cityLN *dt){
  37.     if (dt->next == NULL) {
  38.             dt->next=ct;
  39.             return dt;

  40.         }

  41.         struct cityLN * tmp=dt->next;
  42.         dt->next=ct;
  43.         return reverseCitiesRecursive(dt,tmp);


  44. }
复制代码
  1. struct cityLN * reverseCitiesRecursive(struct cityLN *head){
  2.     struct cityLN *p=head->next,*tmp;
  3.     head->next=NULL;
  4.     while(p->next)
  5.     {
  6.         tmp=p->next;
  7.         p->next=head;
  8.         head=p;
  9.         p=tmp;
  10.     }
  11.     p->next=head;
  12.     return p;

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

使用道具 举报

发表于 2022-12-6 20:18:45 | 显示全部楼层
本帖最后由 Sagiri 于 2022-12-6 20:25 编辑

函数形式一定要这样吗? struct cityLN * reverseCitiesRecursive(struct cityLN *ct, struct cityLN *dt);
-----------
取巧了
  1. struct cityLN * reverseCitiesRecursive(struct cityLN *ct, struct cityLN *dt = nullptr){  
  2.         if (ct->next == nullptr) return ct;
  3.         cityLN *lastCity = reverseCitiesRecursive(ct->next);
  4.         ct->next->next = ct;
  5.         ct->next = nullptr;
  6.         return lastCity;
  7. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-8 09:47:13 | 显示全部楼层
  1. struct cityLN * reverseCitiesRecursive(struct cityLN *ct, struct cityLN *dt){
  2.     if (dt->next == NULL) {
  3.             dt->next=ct;
  4.             return dt;

  5.         }

  6.         struct cityLN * tmp=dt->next;
  7.         dt->next=ct;
  8.         return reverseCitiesRecursive(dt,tmp);


  9. }
复制代码

大佬这个函数存在问题,第一个的时候dt是NULL,就执行不下去了- -
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-8 09:48:07 | 显示全部楼层
Sagiri 发表于 2022-12-6 20:18
函数形式一定要这样吗? struct cityLN * reverseCitiesRecursive(struct cityLN *ct, struct cityLN *dt); ...

大佬,不能更改- -就好像考试总不能吧题目改了吧,我到现在还是不知道怎么做
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-8 10:23:46 | 显示全部楼层    本楼为最佳答案   
壳970527 发表于 2022-12-8 09:47
大佬这个函数存在问题,第一个的时候dt是NULL,就执行不下去了- -
  1. //当时考虑不周
  2. struct cityLN * reverseCitiesRecursive(struct cityLN *ct, struct cityLN *dt){
  3.     if (dt == NULL) {
  4.             return ct;

  5.         }

  6.         struct cityLN * tmp=dt->next;
  7.         dt->next=ct;
  8.         return reverseCitiesRecursive(dt,tmp);


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

使用道具 举报

 楼主| 发表于 2022-12-8 10:30:33 | 显示全部楼层

感谢大佬,真的我想了好久,感觉怎么想都是有点祖父悖论的感觉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-8 10:51:51 | 显示全部楼层
本帖最后由 jhq999 于 2022-12-8 10:53 编辑
壳970527 发表于 2022-12-8 10:30
感谢大佬,真的我想了好久,感觉怎么想都是有点祖父悖论的感觉


我把三楼的改了改,应该是你要的

  1. #include <stdio.h>

  2. struct cityLN {
  3.   char name[20];
  4.   int population;
  5.   struct cityLN *next;
  6. };

  7. void printCities(struct cityLN *ct);
  8. struct cityLN * reverseCitiesRecursive(struct cityLN *ct, struct cityLN *dt);

  9. int main(){
  10.         struct cityLN c1 = {"Hiratsuka", 258, NULL},
  11.                 c2 = {"Odawara", 190, NULL},
  12.                 c3 = {"Yokosuka", 396, NULL},
  13.                 c4 = {"Kamakura", 172, NULL},
  14.                 c5 = {"Chigasaki", 242, NULL},
  15.                 c6 = {"Fujisawa", 434, NULL};
  16.         struct cityLN *head = NULL;
  17.         head = &c1; c1.next = &c2;  c2.next = &c3; c3.next = &c4; c4.next = &c5; c5.next = &c6;
  18.         printf("Original: \n");
  19.         printCities(head);
  20.         printf("reverse: \n");
  21.         head = reverseCitiesRecursive(head, NULL);
  22.         printCities(head);
  23.         return 0;
  24. }
  25. void printCities(struct cityLN *ct){
  26.         if (ct != NULL) {
  27.                 printf("(%-10s: population = %3d)", ct->name, ct->population);
  28.                 printf("%s", (ct->next != NULL) ? " ->\n" : "");
  29.                 printCities(ct->next);
  30.         }
  31.         else
  32.                 putchar('\n');
  33. }
  34. struct cityLN * reverseCitiesRecursive(struct cityLN *ct, struct cityLN *dt ){
  35.         if (ct== NULL) return dt;
  36.         struct cityLN *lastCity = reverseCitiesRecursive(ct->next,ct);
  37.         ct->next=dt;
  38.         return lastCity;
  39. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 01:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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