鱼C论坛

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

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

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

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

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

x
大佬看下这个代码哪里有问题,谢谢
QQ图片20240929120920.png
QQ图片20240929120940.png
QQ图片20240929120945.png
QQ图片20240929120949.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

以上回复来自 FishC AI 小助理,如未能正确解答您 ...
#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->lchilb = NULL;
        new_node->rchilb = NULL;

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

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

        return;
    }

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

    return;
}

// 先序遍历 根 左 右   preorder_traversal
void pre_rder(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_rder(root->lchilb);
        // 右
        pre_rder(root->rchilb);
    }
    return;
}

// 释放 左 右 根
void free_tree(Tree_Node **root)
{
    if (NULL != root)
    {
        // 左
        free(&(*root)->lchilb);
        // 右
        free(&(*root)->rchilb);
        // 释放
        printf("%s释放成功\n", (*root)->data.name);
        free(*root);
        *root = NULL;
    }
    return;
}[code]#include "tree.h"

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

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

    insert_node(&root, data[0]);
    insert_node(&root, data[1]);
    insert_node(&root, data[2]);
    insert_node(&root, data[3]);
    insert_node(&root, data[4]);
    insert_node(&root, data[5]);

    // 根左右
    pre_rder(root);

    // 释放
    free_tree(&root);

    return 0;
}[code]#ifndef _ELEMENT_H__
#define _ELEMENT_H__

// 引入头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 声明数据对象
typedef struct Element_data
{
    char name[128]; // 姓名
    char sex[10];   // 性别
    int age;        // 年纪
    int id;         // 学号
    int sco;        // 成绩
} Element_data;

// 用于报错的宏函数

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

#endif
[code]#ifndef __TREE_H__
#define __TREE_H__

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

// 定义树节点结构体
typedef struct Tree_Node
{
    Element_data data;
    struct Tree_Node *lchilb; // 左节点
    struct Tree_Node *rchilb; // 右节点
} Tree_Node;

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

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

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


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

#endif
[/code][/code][/code]
想知道小甲鱼最近在做啥?请访问 -> 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-4 09:57:13 | 显示全部楼层
函数free_tree里面 进行递归应该也是free_tree啊,怎么变成free了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 17:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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