鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 1613551

[已解决]有没有大佬帮忙看看我的程序哪里出错了

[复制链接]
发表于 2023-12-12 21:47:28 | 显示全部楼层
1613551 发表于 2023-12-12 21:46
我用的vscode,我一直都写的c程序呀

vscode是编辑器,你用的哪个编译器?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-13 02:26:48 | 显示全部楼层
递归转迭代的方法,我大概是真的弄明白了
参考:https://www.zhihu.com/question/20418254
我一开始是写入栈的时候发现 刚进入函数的时候和递归返回之后 这是两个状态,执行的代码是不一样的
于是我弄了一个vector来保存这个状态,如果当前节点在vector里面,那就是 递归返回之后 的状态
但是当我写到中序遍历的时候,发现递归返回之后,还分两种情况,一种是输出当前节点,然后右孩子入栈,另一种是右孩子也递归返回
于是我又给栈里面多弄了一个status变量来区分这两种情况
然后我又发现,其实给这个栈里面添加了一个状态之后,这个状态就完全能够表示递归函数里面的全部情况,所以我就删除了vector,只用栈实现了 前序遍历、中序遍历和后序遍历
下面是代码,你可以先看看能不能看懂
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <string.h>

  5. typedef size_t tree_elem_t;

  6. typedef struct tree_node_tag {
  7.     struct tree_node_tag *lchild, *rchild;
  8.     tree_elem_t e;
  9. } tree_t;


  10. typedef struct {
  11.     const tree_t *tree;
  12.     size_t status;
  13. } stack_elem_t;

  14. typedef struct {
  15.     stack_elem_t *data;
  16.     size_t size, top;
  17. } stack_t;

  18. stack_t *stack_init(void) {
  19.     stack_t *stack = malloc(sizeof(*stack));
  20.     stack->data = NULL;
  21.     stack->size = stack->top = 0;
  22.     return stack;
  23. }

  24. void stack_deinit(stack_t *stack) {
  25.     free(stack->data);
  26.     free(stack);
  27. }

  28. size_t stack_size(const stack_t *stack) {
  29.     return stack->top;
  30. }

  31. bool stack_empty(const stack_t *stack) {
  32.     return stack_size(stack) == 0;
  33. }

  34. void stack_push(stack_t *stack, stack_elem_t e) {
  35.     if(stack->top == stack->size)
  36.         stack->data = realloc(stack->data, sizeof(stack_elem_t) * (stack->size += 10));
  37.     stack->data[stack->top++] = e;
  38. }

  39. void stack_pop(stack_t *stack) {
  40.     if(stack_empty(stack)) return;
  41.     --stack->top;
  42. }

  43. stack_elem_t stack_top(const stack_t *stack) {
  44.     if(stack_empty(stack)) abort();
  45.     return stack->data[stack->top - 1];
  46. }

  47. typedef const tree_t *vector_elem_t;

  48. typedef struct {
  49.     vector_elem_t *data;
  50.     size_t size;
  51. } vector_t;

  52. vector_t *vector_init(void) {
  53.     vector_t *vector = malloc(sizeof(*vector));
  54.     vector->data = NULL;
  55.     vector->size = 0;
  56.     return vector;
  57. }

  58. void vector_deinit(vector_t *vector) {
  59.     free(vector->data);
  60.     free(vector);
  61. }

  62. size_t vector_size(const vector_t *vector) {
  63.     return vector->size;
  64. }

  65. size_t vector_empty(const vector_t *vector) {
  66.     return vector_size(vector) == 0;
  67. }

  68. void vector_set(vector_t *vector, size_t index, vector_elem_t e) {
  69.     if(index >= vector->size)
  70.         vector->data = realloc(vector->data, sizeof(vector_elem_t) * (vector->size = index + 1));
  71.     vector->data[index] = e;
  72. }

  73. vector_elem_t vector_get(const vector_t *vector, size_t index) {
  74.     if(index >= vector->size) abort();
  75.     return vector->data[index];
  76. }

  77. void vector_append(vector_t *vector, vector_elem_t e) {
  78.     vector_set(vector, vector_size(vector), e);
  79. }

  80. bool vector_find(const vector_t *vector, vector_elem_t e) {
  81.     for(size_t i = 0; i < vector_size(vector); ++i) {
  82.         if(vector_get(vector, i) == e) return true;
  83.     }
  84.     return false;
  85. }

  86. tree_t *tree_init(FILE *fp) {
  87.     tree_elem_t value;
  88.     fscanf(fp, "%zu", &value);
  89.     if(value == -1) return NULL;
  90.     tree_t *root = malloc(sizeof(*root));
  91.     root->e = value;
  92.     root->lchild = tree_init(fp);
  93.     root->rchild = tree_init(fp);
  94.     return root;
  95. }

  96. void tree_deinit(tree_t *tree) {
  97.     if(!tree) return;
  98.     tree_deinit(tree->lchild);
  99.     tree_deinit(tree->rchild);
  100.     free(tree);
  101. }

  102. void tree_traversal_recursion_preorder(const tree_t *tree) {
  103.     if(!tree) return;
  104.     printf("%zu\n", tree->e);
  105.     tree_traversal_recursion_preorder(tree->lchild);
  106.     tree_traversal_recursion_preorder(tree->rchild);
  107. }

  108. void tree_traversal_iteration_preorder(const tree_t *tree) {
  109.     stack_t *stack = stack_init();
  110.     vector_t *vector = vector_init();
  111.     stack_elem_t se = {tree, 0};
  112.     stack_push(stack, se);
  113.     while(!stack_empty(stack)) {
  114.         se = stack_top(stack);
  115.         if(!vector_find(vector, se.tree)) {
  116.             vector_append(vector, se.tree);
  117.             printf("%zu\n", se.tree->e);
  118.             if(se.tree->rchild) stack_push(stack, (stack_elem_t){se.tree->rchild, 0});
  119.             if(se.tree->lchild) stack_push(stack, (stack_elem_t){se.tree->lchild, 0});
  120.         } else stack_pop(stack);
  121.     }
  122.     vector_deinit(vector);
  123.     stack_deinit(stack);
  124. }

  125. void tree_traversal_recursion_inorder(const tree_t *tree) {
  126.     if(!tree) return;
  127.     tree_traversal_recursion_inorder(tree->lchild);
  128.     printf("%zu\n", tree->e);
  129.     tree_traversal_recursion_inorder(tree->rchild);
  130. }

  131. void tree_traversal_iteration_inorder(const tree_t *tree) {
  132.     stack_t *stack = stack_init();
  133.     vector_t *vector = vector_init();
  134.     stack_elem_t se = {tree, 0};
  135.     stack_push(stack, se);
  136.     while(!stack_empty(stack)) {
  137.         se = stack_top(stack);
  138.         if(!vector_find(vector, se.tree)) {
  139.             vector_append(vector, se.tree);
  140.             if(se.tree->lchild) stack_push(stack, (stack_elem_t){se.tree->lchild, 0});
  141.         } else {
  142.             if(se.status == 0) {
  143.                 printf("%zu\n", se.tree->e);
  144.                 stack_pop(stack);
  145.                 stack_push(stack, (stack_elem_t){se.tree, 1});
  146.                 if(se.tree->rchild) stack_push(stack, (stack_elem_t){se.tree->rchild, 0});
  147.             } else stack_pop(stack);
  148.         }
  149.     }
  150.     vector_deinit(vector);
  151.     stack_deinit(stack);
  152. }

  153. void tree_traversal_recursion_postorder(const tree_t *tree) {
  154.     if(!tree) return;
  155.     tree_traversal_recursion_postorder(tree->lchild);
  156.     tree_traversal_recursion_postorder(tree->rchild);
  157.     printf("%zu\n", tree->e);
  158. }

  159. void tree_traversal_iteration_postorder(const tree_t *tree) {
  160.     stack_t *stack = stack_init();
  161.     vector_t *vector = vector_init();
  162.     stack_elem_t se = {tree, 0};
  163.     stack_push(stack, se);
  164.     while(!stack_empty(stack)) {
  165.         se = stack_top(stack);
  166.         if(!vector_find(vector, se.tree)) {
  167.             vector_append(vector, se.tree);
  168.             if(se.tree->rchild) stack_push(stack, (stack_elem_t){se.tree->rchild, 0});
  169.             if(se.tree->lchild) stack_push(stack, (stack_elem_t){se.tree->lchild, 0});
  170.         } else {
  171.             printf("%zu\n", se.tree->e);
  172.             stack_pop(stack);
  173.         }
  174.     }
  175.     vector_deinit(vector);
  176.     stack_deinit(stack);
  177. }

  178. int main(void) {
  179.     tree_t *tree = tree_init(stdin);
  180.     tree_traversal_recursion_postorder(tree);
  181.     printf("\n");
  182.     tree_traversal_iteration_postorder(tree);
  183.     printf("\n");
  184.     tree_traversal_recursion_inorder(tree);
  185.     printf("\n");
  186.     tree_traversal_iteration_inorder(tree);
  187.     printf("\n");
  188.     tree_traversal_recursion_preorder(tree);
  189.     printf("\n");
  190.     tree_traversal_iteration_preorder(tree);
  191.     tree_deinit(tree);
  192.     return 0;
  193. }
复制代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <string.h>

  5. typedef size_t tree_elem_t;

  6. typedef struct tree_node_tag {
  7.     struct tree_node_tag *lchild, *rchild;
  8.     tree_elem_t e;
  9. } tree_t;


  10. typedef struct {
  11.     const tree_t *tree;
  12.     size_t status;
  13. } stack_elem_t;

  14. typedef struct {
  15.     stack_elem_t *data;
  16.     size_t size, top;
  17. } stack_t;

  18. stack_t *stack_init(void) {
  19.     stack_t *stack = malloc(sizeof(*stack));
  20.     stack->data = NULL;
  21.     stack->size = stack->top = 0;
  22.     return stack;
  23. }

  24. void stack_deinit(stack_t *stack) {
  25.     free(stack->data);
  26.     free(stack);
  27. }

  28. size_t stack_size(const stack_t *stack) {
  29.     return stack->top;
  30. }

  31. bool stack_empty(const stack_t *stack) {
  32.     return stack_size(stack) == 0;
  33. }

  34. void stack_push(stack_t *stack, stack_elem_t e) {
  35.     if(stack->top == stack->size)
  36.         stack->data = realloc(stack->data, sizeof(stack_elem_t) * (stack->size += 10));
  37.     stack->data[stack->top++] = e;
  38. }

  39. void stack_pop(stack_t *stack) {
  40.     if(stack_empty(stack)) return;
  41.     --stack->top;
  42. }

  43. stack_elem_t stack_top(const stack_t *stack) {
  44.     if(stack_empty(stack)) abort();
  45.     return stack->data[stack->top - 1];
  46. }

  47. tree_t *tree_init(FILE *fp) {
  48.     tree_elem_t value;
  49.     fscanf(fp, "%zu", &value);
  50.     if(value == -1) return NULL;
  51.     tree_t *root = malloc(sizeof(*root));
  52.     root->e = value;
  53.     root->lchild = tree_init(fp);
  54.     root->rchild = tree_init(fp);
  55.     return root;
  56. }

  57. void tree_deinit(tree_t *tree) {
  58.     if(!tree) return;
  59.     tree_deinit(tree->lchild);
  60.     tree_deinit(tree->rchild);
  61.     free(tree);
  62. }

  63. void tree_traversal_recursion_preorder(const tree_t *tree) {
  64.     if(!tree) return;
  65.     printf("%zu\n", tree->e);
  66.     tree_traversal_recursion_preorder(tree->lchild);
  67.     tree_traversal_recursion_preorder(tree->rchild);
  68. }

  69. void tree_traversal_iteration_preorder(const tree_t *tree) {
  70.     stack_t *stack = stack_init();
  71.     stack_elem_t se = {tree, 0};
  72.     stack_push(stack, se);
  73.     while(!stack_empty(stack)) {
  74.         se = stack_top(stack);
  75.         switch(se.status) {
  76.             case 0:
  77.                 printf("%zu\n", se.tree->e);
  78.                 stack_pop(stack);
  79.                 stack_push(stack, (stack_elem_t){se.tree, 1});
  80.                 if(se.tree->rchild) stack_push(stack, (stack_elem_t){se.tree->rchild, 0});
  81.                 if(se.tree->lchild) stack_push(stack, (stack_elem_t){se.tree->lchild, 0});
  82.                 break;
  83.             case 1:
  84.                 stack_pop(stack);
  85.         }
  86.     }
  87.     stack_deinit(stack);
  88. }

  89. void tree_traversal_recursion_inorder(const tree_t *tree) {
  90.     if(!tree) return;
  91.     tree_traversal_recursion_inorder(tree->lchild);
  92.     printf("%zu\n", tree->e);
  93.     tree_traversal_recursion_inorder(tree->rchild);
  94. }

  95. void tree_traversal_iteration_inorder(const tree_t *tree) {
  96.     stack_t *stack = stack_init();
  97.     stack_elem_t se = {tree, 0};
  98.     stack_push(stack, se);
  99.     while(!stack_empty(stack)) {
  100.         se = stack_top(stack);
  101.         switch(se.status) {
  102.             case 0:
  103.                 stack_pop(stack);
  104.                 stack_push(stack, (stack_elem_t){se.tree, 1});
  105.                 if(se.tree->lchild) stack_push(stack, (stack_elem_t){se.tree->lchild, 0});
  106.                 break;
  107.             case 1:
  108.                 printf("%zu\n", se.tree->e);
  109.                 stack_pop(stack);
  110.                 stack_push(stack, (stack_elem_t){se.tree, 2});
  111.                 if(se.tree->rchild) stack_push(stack, (stack_elem_t){se.tree->rchild, 0});
  112.                 break;
  113.             case 2:
  114.                 stack_pop(stack);
  115.         }
  116.     }
  117.     stack_deinit(stack);
  118. }

  119. void tree_traversal_recursion_postorder(const tree_t *tree) {
  120.     if(!tree) return;
  121.     tree_traversal_recursion_postorder(tree->lchild);
  122.     tree_traversal_recursion_postorder(tree->rchild);
  123.     printf("%zu\n", tree->e);
  124. }

  125. void tree_traversal_iteration_postorder(const tree_t *tree) {
  126.     stack_t *stack = stack_init();
  127.     stack_elem_t se = {tree, 0};
  128.     stack_push(stack, se);
  129.     while(!stack_empty(stack)) {
  130.         se = stack_top(stack);
  131.         switch(se.status) {
  132.             case 0:
  133.                 stack_pop(stack);
  134.                 stack_push(stack, (stack_elem_t){se.tree, 1});
  135.                 if(se.tree->rchild) stack_push(stack, (stack_elem_t){se.tree->rchild, 0});
  136.                 if(se.tree->lchild) stack_push(stack, (stack_elem_t){se.tree->lchild, 0});
  137.                 break;
  138.             case 1:
  139.                 printf("%zu\n", se.tree->e);
  140.                 stack_pop(stack);
  141.         }
  142.     }
  143.     stack_deinit(stack);
  144. }

  145. int main(void) {
  146.     tree_t *tree = tree_init(stdin);
  147.     tree_traversal_recursion_postorder(tree);
  148.     printf("\n");
  149.     tree_traversal_iteration_postorder(tree);
  150.     printf("\n");
  151.     tree_traversal_recursion_inorder(tree);
  152.     printf("\n");
  153.     tree_traversal_iteration_inorder(tree);
  154.     printf("\n");
  155.     tree_traversal_recursion_preorder(tree);
  156.     printf("\n");
  157.     tree_traversal_iteration_preorder(tree);
  158.     tree_deinit(tree);
  159.     return 0;
  160. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-12-13 16:34:07 | 显示全部楼层
人造人 发表于 2023-12-12 21:47
vscode是编辑器,你用的哪个编译器?

说实话,学了这么久编程我还真不知道自己用的哪个编译器,我就只知道vscode啥都可以编写,写python就把文件后缀改py,写前端就改成html,写c我就改成.c,c++同理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-12-13 16:37:45 | 显示全部楼层
人造人 发表于 2023-12-13 02:51
嗯,对于图来说,确实需要一个vector来标记已经访问过的节点,不然会死循环,因为有多条路径
改成这样,非 ...

不知道为啥,你这些程序我一个都运行不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-13 16:41:00 | 显示全部楼层
1613551 发表于 2023-12-13 16:37
不知道为啥,你这些程序我一个都运行不了

说明你用的不是C语言的编译器,看起来你用的是C++的编译器
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-13 16:42:17 | 显示全部楼层
1613551 发表于 2023-12-13 16:37
不知道为啥,你这些程序我一个都运行不了

vscode只是一个编辑器,你怎么配置的vscode来编译C语言代码?
在vscode的配置里面配置了个C++编译器吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-13 16:43:16 | 显示全部楼层
本帖最后由 人造人 于 2023-12-13 16:44 编辑

百度,重新配置你的vscode,让他使用C语言的编译器
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-12-13 16:44:54 | 显示全部楼层
人造人 发表于 2023-12-13 16:42
vscode只是一个编辑器,你怎么配置的vscode来编译C语言代码?
在vscode的配置里面配置了个C++编译器吧

我就只装了这个插件
1702457052633.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-12-13 16:46:55 | 显示全部楼层
本帖最后由 1613551 于 2023-12-13 16:49 编辑
人造人 发表于 2023-12-13 16:43
百度,重新配置你的vscode,让他使用C语言的编译器


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 23:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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