鱼C论坛

 找回密码
 立即注册
查看: 2327|回复: 3

关于递归函数的问题,急需大佬解答

[复制链接]
发表于 2022-12-8 10:02:58 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 壳970527 于 2022-12-8 10:29 编辑
#include <stdio.h>

struct cityLN {
  char name[20];
  int population;
  struct cityLN *next;
};

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

int main(){
        struct cityLN c1 = {"Hiratsuka", 258, NULL},
                c2 = {"Odawara", 190, NULL},
                c3 = {"Yokosuka", 396, NULL},
                c4 = {"Kamakura", 172, NULL},
                c5 = {"Chigasaki", 242, NULL},
                c6 = {"Fujisawa", 434, NULL};
        struct cityLN *head = NULL;
        head = &c1; c1.next = &c2;  c2.next = &c3; c3.next = &c4; c4.next = &c5; c5.next = &c6; 
        printf("Original: \n"); 
        printCities(head); 
        printf("reverse: \n"); 
        head = reverseCitiesRecursive(head, NULL);
        printCities(head); 
        return 0;
}
void printCities(struct cityLN *ct){
        if (ct != NULL) {
                printf("(%-10s: population = %3d)", ct->name, ct->population);
                printf("%s", (ct->next != NULL) ? " ->\n" : "");
                printCities(ct->next);
        }
        else
                putchar('\n');
}
struct cityLN * reverseCitiesRecursive(struct cityLN *ct, struct cityLN *dt){

        
}
最后一行的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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-12-8 10:29:05 | 显示全部楼层
struct cityLN * reverseCitiesRecursive(struct cityLN *ct, struct cityLN *dt){
    if (dt == NULL) {
            return ct;

        }

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


}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-8 11:10:21 | 显示全部楼层
壳970527 发表于 2022-12-8 10:29
struct cityLN * reverseCitiesRecursive(struct cityLN *ct, struct cityLN *dt){
    if (dt == NULL) { ...
head = reverseCitiesRecursive(head, NULL);
你这个函数不对吧,调用的时候dt 就是NULL, 你这个什么也没干就 return ct了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-8 11:29:41 | 显示全部楼层
struct cityLN * reverseCitiesRecursive(struct cityLN * ct , struct cityLN * dt)
{
        struct cityLN * next , * r                          ;
        r = dt                                              ;
        if(ct) {
                next = ct -> next                           ;
                ct -> next = dt                             ;
                r = reverseCitiesRecursive(next , ct)       ;
        }
        return r                                            ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 20:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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