轻语远歌 发表于 2024-9-29 12:10:31

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

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

FishC 发表于 2024-9-29 12:10:44

当然可以,请你把代码发给我,我会帮你找出问题并解答。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

轻语远歌 发表于 2024-9-29 12:13:47

FishC 发表于 2024-9-29 12:10
当然可以,请你把代码发给我,我会帮你找出问题并解答。

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

FishC 发表于 2024-9-29 12:14:09

轻语远歌 发表于 2024-09-29 12:13


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

轻语远歌 发表于 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;
}#include "tree.h"

Element_data data =
    {
      {.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);
    insert_node(&root, data);
    insert_node(&root, data);
    insert_node(&root, data);
    insert_node(&root, data);
    insert_node(&root, data);

    // 根左右
    pre_rder(root);

    // 释放
    free_tree(&root);

    return 0;
}#ifndef _ELEMENT_H__
#define _ELEMENT_H__

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

// 声明数据对象
typedef struct Element_data
{
    char name; // 姓名
    char sex;   // 性别
    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
#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

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

豆嘉木 发表于 2024-10-4 09:57:13

函数free_tree里面 进行递归应该也是free_tree啊,怎么变成free了
页: [1]
查看完整版本: 大佬看下这个代码哪里有问题,