鱼C论坛

 找回密码
 立即注册
查看: 1015|回复: 6

大佬看下这个代码哪里有问题,

[复制链接]
发表于 2024-9-29 12:10:31 | 显示全部楼层 |阅读模式

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

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

x
大佬看下这个代码哪里有问题,谢谢
QQ图片20240929120920.png
QQ图片20240929120940.png
QQ图片20240929120945.png
QQ图片20240929120949.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-9-29 12:10:44 | 显示全部楼层
当然可以,请你把代码发给我,我会帮你找出问题并解答。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-9-29 12:13:47 | 显示全部楼层
FishC 发表于 2024-9-29 12:10
当然可以,请你把代码发给我,我会帮你找出问题并解答。

以上回复来自 FishC AI 小助理,如未能正确解答 ...

QQ图片20240929120920.png
QQ图片20240929120940.png
QQ图片20240929120945.png
QQ图片20240929121302.png
QQ图片20240929120949.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-29 12:14:09 | 显示全部楼层


请把你的代码粘贴到这里,我会帮你检查问题所在。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-9-29 12:16:19 | 显示全部楼层
FishC 发表于 2024-9-29 12:14
请把你的代码粘贴到这里,我会帮你检查问题所在。

以上回复来自 FishC AI 小助理,如未能正确解答您 ...
  1. #include "tree.h"

  2. // 插入节点
  3. void insert_node(Tree_Node **root, Element_data data)
  4. {
  5.     if (NULL == (*root))
  6.     {
  7.         // 创建节点
  8.         Tree_Node *new_node = (Tree_Node *)malloc(sizeof(Tree_Node ));
  9.         if (NULL == new_node)
  10.         {
  11.             ERRLOG("动态创建空间失败")
  12.             return ;
  13.         }
  14.         // 写入数据
  15.         new_node->data = data;
  16.         new_node->lchilb = NULL;
  17.         new_node->rchilb = NULL;

  18.         printf("%s插入成功\n", data.name);

  19.         // 将root和new_node连接
  20.         (*root) = new_node;

  21.         return;
  22.     }

  23.     if (data.id < (*root)->data.id)
  24.     {
  25.         // 左孩子
  26.         insert_node(&(*root)->lchilb, data);
  27.         return;
  28.     }
  29.     else // 右孩子
  30.     {
  31.         insert_node(&(*root)->rchilb, data);
  32.         return;
  33.     }

  34.     return;
  35. }

  36. // 先序遍历 根 左 右   preorder_traversal
  37. void pre_rder(Tree_Node *root)
  38. {
  39.     if (NULL != root)
  40.     {
  41.         // 打印
  42.         printf("%s\t%s\t%d\t%d\t%d\n",
  43.                root->data.name, root->data.sex, root->data.age,
  44.                root->data.id, root->data.sco);
  45.         // 左
  46.         pre_rder(root->lchilb);
  47.         // 右
  48.         pre_rder(root->rchilb);
  49.     }
  50.     return;
  51. }

  52. // 释放 左 右 根
  53. void free_tree(Tree_Node **root)
  54. {
  55.     if (NULL != root)
  56.     {
  57.         // 左
  58.         free(&(*root)->lchilb);
  59.         // 右
  60.         free(&(*root)->rchilb);
  61.         // 释放
  62.         printf("%s释放成功\n", (*root)->data.name);
  63.         free(*root);
  64.         *root = NULL;
  65.     }
  66.     return;
  67. }[code]#include "tree.h"

  68. Element_data data[10] =
  69.     {
  70.         {.name = "唐三", .sex = "男", .age = 18, .id = 1, .sco = 60},
  71.         {.name = "萧炎", .sex = "男", .age = 18, .id = 2, .sco = 60},
  72.         {.name = "小舞", .sex = "男", .age = 18, .id = 3, .sco = 60},
  73.         {.name = "牧尘", .sex = "男", .age = 18, .id = 4, .sco = 60},
  74.         {.name = "熏儿", .sex = "男", .age = 18, .id = 5, .sco = 60},
  75.         {.name = "张三", .sex = "男", .age = 18, .id = 6, .sco = 60},
  76. };

  77. int main(void)
  78. {
  79.     // 创建树
  80.     Tree_Node *root = NULL;

  81.     insert_node(&root, data[0]);
  82.     insert_node(&root, data[1]);
  83.     insert_node(&root, data[2]);
  84.     insert_node(&root, data[3]);
  85.     insert_node(&root, data[4]);
  86.     insert_node(&root, data[5]);

  87.     // 根左右
  88.     pre_rder(root);

  89.     // 释放
  90.     free_tree(&root);

  91.     return 0;
  92. }[code]#ifndef _ELEMENT_H__
  93. #define _ELEMENT_H__

  94. // 引入头文件
  95. #include <stdio.h>
  96. #include <stdlib.h>
  97. #include <string.h>
  98. #include <time.h>

  99. // 声明数据对象
  100. typedef struct Element_data
  101. {
  102.     char name[128]; // 姓名
  103.     char sex[10];   // 性别
  104.     int age;        // 年纪
  105.     int id;         // 学号
  106.     int sco;        // 成绩
  107. } Element_data;

  108. // 用于报错的宏函数

  109. #define ERRLOG(STR)                                                                           \
  110.     do                                                                                        \
  111.     {                                                                                         \
  112.         printf("文件: %s 函数: %s 行: %d 报错信息: %s\n", __FILE__, __func__, __LINE__, STR); \
  113.     } while (0);

  114. #endif
  115. [code]#ifndef __TREE_H__
  116. #define __TREE_H__

  117. // 头文件包含
  118. #include "../../include/Element_data.h"

  119. // 定义树节点结构体
  120. typedef struct Tree_Node
  121. {
  122.     Element_data data;
  123.     struct Tree_Node *lchilb; // 左节点
  124.     struct Tree_Node *rchilb; // 右节点
  125. } Tree_Node;

  126. // 初始化二叉树
  127. int init_binary_tree(Tree_Node **root);

  128. // 插入节点
  129. void insert_node(Tree_Node **root, Element_data data);

  130. // 先序遍历 根 左 右   preorder_traversal
  131. void pre_rder(Tree_Node *root);


  132. // 释放 左 右 根
  133. void free_tree(Tree_Node **root);

  134. #endif
复制代码
[/code][/code][/code]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-29 12:24:33 | 显示全部楼层
轻语远歌 发表于 2024-09-29 12:16
#include "tree.h"

// 插入节点
void insert_node ...


你提供的代码有几个问题和改进建议:

1. **`free_tree`函数中递归调用错误**:`free`函数应该递归调用`free_tree`。
2. **数组初始化不规范**:数据初始化并不规范,应改成初始化为数组类型。
3. **遍历函数命名错误**:函数`pre_rder`应该改为`pre_order`。
4. **没有包含所有头文件**:例如缺少`#include <stdio.h>`以及`#include <stdlib.h>`。
5. **数据插入操作**:在`main`函数中,递归插入数据时应该使用`data`的每个元素。

针对这些问题进行修改后的代码如下:

```c
#include <stdio.h>
#include <stdlib.h>
#include "tree.h"

// 插入节点
void insert_node(Tree_Node **root, Element_data data)
{
    if (NULL == (*root))
    {
        // 创建节点
        Tree_Node *new_node = (Tree_Node *)malloc(sizeof(Tree_Node));
        if (NULL == new_node)
        {
            ERRLOG("动态创建空间失败");
            return;
        }
        // 写入数据
        new_node->data = data;
        new_node->lchild = NULL;
        new_node->rchild = NULL;

        printf("%s插入成功\n", data.name);

        // 将root和new_node连接
        (*root) = new_node;

        return;
    }

    if (data.id < (*root)->data.id)
    {
        // 左孩子
        insert_node(&(*root)->lchild, data);
        return;
    }
    else // 右孩子
    {
        insert_node(&(*root)->rchild, data);
        return;
    }

    return;
}

// 先序遍历 根 左 右   preorder_traversal
void pre_order(Tree_Node *root)
{
    if (NULL != root)
    {
        // 打印
        printf("%s\t%s\t%d\t%d\t%d\n",
               root->data.name, root->data.sex, root->data.age,
               root->data.id, root->data.sco);
        // 左
        pre_order(root->lchild);
        // 右
        pre_order(root->rchild);
    }
    return;
}

// 释放 左 右 根
void free_tree(Tree_Node **root)
{
    if (NULL != *root)
    {
        // 左
        free_tree(&(*root)->lchild);
        // 右
        free_tree(&(*root)->rchild);
        // 释放
        printf("%s释放成功\n", (*root)->data.name);
        free(*root);
        *root = NULL;
    }
    return;
}

int main(void)
{
    // 创建树
    Tree_Node *root = NULL;

    Element_data data[] =
    {
        {.name = "唐三", .sex = "男", .age = 18, .id = 1, .sco = 60},
        {.name = "萧炎", .

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-4 09:57:13 | 显示全部楼层
函数free_tree里面 进行递归应该也是free_tree啊,怎么变成free了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-9 15:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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