数据结构树的孩子表示法

这篇博客介绍了如何使用C语言构建一个数组+链表结合的数据结构,用于表示树形关系。作者首先定义了一个结构体Node,然后通过Init函数初始化树,并使用find_parent查找父节点,Great_Tree函数添加子节点。最后,通过遍历数组和链表展示树的结构。
摘要由CSDN通过智能技术生成

#include<stdio.h>
#include<stdlib.h>
//构建数据集合  数组+链表
//链表
typedef struct Child
{
    int date;
    struct Child* next;
}Node;
//结构体数组
Node* node_array[20];
int size;//当前元素个数
int maxSize;//当前元素最大个数   如果不能扩容的话

void Init(int key)
{
    size = 0;
    maxSize = 20;
    node_array[size] = (Node*)malloc(sizeof(Node));
    //给新节点赋值
    node_array[size]->date = key;
    node_array[size]->next = NULL;
    size++;
}
//找寻父亲节点
int find_parent(int parent)
{
    for (int i = 0; i < size; i++)
    {
        if (node_array[i]->date == parent)
        {
            return i;
        }
    }
    return -1;
}

//parent 父亲节点   key 父亲节点对应的孩子
void Great_Tree(int parent, int key)
{
    int index = find_parent(parent);
    if (index == -1)
    {
        //没有这个父亲节点构建节点失败
        return;
    }
    else
    {
        //先把孩子节点放到数组当中
        node_array[size] = (Node*)malloc(sizeof(Node));
        
        node_array[size]->date = key;
        node_array[size]->next = NULL;

        //新节点赋值完以后开始建单链表来使其孩子都存放在一条链上以便查找
        Node* new_node = (Node*)malloc(sizeof(Node));
        new_node->date = key;
        //单链表的插入  头插  对于孩子插入的顺序不做要求因为无所谓插入到哪里其都是父亲的孩子查找时也仍是遍历整个链表
        new_node->next = node_array[index]->next;
        node_array[index]->next = new_node;
        size++;
    }
}int main()
{
    Init(1);
    Great_Tree(1, 2);
    Great_Tree(1, 3);
    Great_Tree(1, 4);
    Great_Tree(2, 5);
    Great_Tree(2, 6);
    Great_Tree(3, 7);
    Great_Tree(3, 8);
    //输出时第一个循环是数组寻找所要查找的父亲节点 然后根据其为突破口来查找孩子
    for (int i = 0; i < size; i++)
    {
        Node* temp = node_array[i]->next;
        printf("父亲节点为%d", node_array[i]->date);
        while (temp != NULL)
        {
            printf("孩子节点为%d", temp->date);
            temp = temp->next;
        }
        printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值