汉诺塔实现问题:swap_disk函数为何无法正确更新指针?
汉诺塔递归实现问题修复方案
1. 解决swap_disk无法更新指针变量的问题
你定义的tower_1、tower_2、tower_3是全局指针,但如果swap_disk函数的参数是传值传递指针,函数内部修改的只是指针的副本,不会影响全局的指针变量。要让函数能修改全局指针,有两种可行方案:
- 方案一:将
swap_disk的参数改为指针的指针(二级指针),示例代码:
调用时传入全局指针的地址:void swap_disk(Stack **from_tower, Stack **to_tower) { // 取出源塔栈顶元素 Disk *disk = pop(*from_tower); // 将元素推入目标塔 push(*to_tower, disk); // 若需直接交换指针指向,可执行以下操作 // Stack *temp = *from_tower; // *from_tower = *to_tower; // *to_tower = temp; }swap_disk(&tower_1, &tower_3); - 方案二:既然
tower_1等是全局变量,swap_disk可直接操作这些全局变量,无需传递指针参数,从根源避免传值导致的副本问题。
2. 为push和pop添加异常/错误处理
栈操作必须处理边界情况,否则会出现越界访问或无效操作:
push函数:检查栈当前高度是否等于最大容量,若已满则返回错误码或提示信息,示例:int push(Stack *stack, Disk *disk) { if (stack->height >= stack->max_size) { printf("错误:栈已满,无法推入新元素\n"); return -1; } stack->disks[stack->height++] = disk; return 0; }pop函数:检查栈当前高度是否为0,若为空则返回空指针或提示信息,示例:Disk* pop(Stack *stack) { if (stack->height == 0) { printf("错误:栈为空,无法弹出元素\n"); return NULL; } return stack->disks[--stack->height]; }
3. 修复递归基例无法触发的问题
递归基例(通常是n == 1时直接移动盘子)无法触发的根本原因是指针未正确更新,导致函数无法感知栈的状态变化。解决第一个问题后,swap_disk能正确修改栈的内容或指针,递归过程中栈的高度会正常变化,当n == 1时基例代码会执行,将盘子移到目标塔,第三个塔的高度才会逐步增加,递归逻辑就能正常收尾。
内容的提问来源于stack exchange,提问作者Jonathan Isozaki
相关产品推荐
相关产品推荐

