//头文件 TREE.h
#ifndef _TREE_H_
#define _TREE_H_
#define false 0
#define true 1
typedef _TreeNode;
typedef struct _ChildNode //孩子结点型链表
{
struct _TreeNode *childNode; //孩子结点指向父结点的指针
struct _ChildNode *next; //指向孩子结点链表下一个元素
}ChildNode;
typedef char TreeData; //树结点类型
typedef struct _TreeNode
{
TreeData data;
struct _TreeNode *parent; //指向父结点的指针
struct _TreeNode *next; //指向链表的下一个元素
struct _ChildNode *childlist; //父结点指向孩子链表的头结点
int degree;//结点的度(后继的数量)
}TreeNode;
typedef struct _Tree
{
struct _TreeNode *head; //树链表的头结点
int len; //树结点的个数(长度)
}Tree;
//定义一个函数指针类型
typedef void (*TreePrint)(TreeNode *node);
Tree *Create_Tree();
//pos 要插入父结点
int Insert_Tree(Tree *tree,TreeData data,int pos);
void Display (Tree *tree,TreePrint pFunc);
#endif //_TREE_H_
//函数源代码 TREE.c
#include "tree.h"
#include <stdlib.h>
Tree *Create_Tree()
{
//创建树结点
Tree *tree = (Tree *)malloc(sizeof(Tree) / sizeof(char));
if(tree == NULL)
{
return false;
}
//创建树结点链表的头结点
tree->head = (TreeNode *)malloc(sizeof(TreeNode) / sizeof(char));
if(tree->head == NULL)
{
free(tree);
return NULL;
}
//给元素赋值
tree->head->parent = NULL;
tree->head->next = NULL;
tree->head->childlist = NULL;//置空,树中没有结点
tree->len = 0;
return tree;
}
// pos 代表要插入结点父亲结点的位置
int Insert_Tree(Tree *tree,TreeData data,int pos)
{
if(tree == NULL || pos < 0 || pos > tree->len)
{
return false;
}
if(pos != 0 && tree->len == pos)
{
return false;
}
//新建结点
TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode) / sizeof(char));
if(node == NULL)
{
return false;
}
node->data = data;
node->next = NULL;
//创建node结点的孩子结点链表的头结点
node->childlist = (ChildNode *)malloc(sizeof(ChildNode) / sizeof(char));
if(node->childlist == NULL)
{
free(node);
return false;
}
node->childlist->next = NULL;
node->childlist->childNode = NULL;
node->degree = 0;
//找父结点
int i;
TreeNode *parent = tree->head->next; //树结点的第一个结点,根节点
for(i = 0;i < pos;i++)
{
parent = parent->next;
}
node->parent = parent;
if(parent != NULL)
{ //在孩子链表中创建一个结点
ChildNode *childnode = (ChildNode *)malloc(sizeof(ChildNode) / sizeof(char));
if(childnode == NULL)
{
free(node->childlist);
free(node);
return false;
}
childnode->childNode = node;
childnode->next = NULL;
//把childnode加入到父结点node的孩子链表中
ChildNode *tmp = parent->childlist;//孩子链表的头结点
while(tmp->next)
tmp = tmp->next;
tmp->next = childnode;
parent->degree += 1;//后继(度)加一
}
TreeNode *tmp = tree->head;//树结点链表的头结点
while(tmp->next)
tmp = tmp->next;
tmp->next = node;
tree->len += 1;
return true;
}
void R_Display(TreeNode *node,int gap,TreePrint pFunc) //递归打印结点
{
if(node == NULL)
return;
//打印距离前一个结点的距离
int i;
for(i = 0;i < gap;i++)
{
printf("%c",'-');
}
//打印结点自己
pFunc(node);
ChildNode *child = node->childlist->next;//该节点的第一个孩子结点
//用递归打印结点孩子
while(child)
{
R_Display (child->childNode,gap+4,pFunc);
child = child->next;
}
}
void Display(Tree *tree,TreePrint pFunc)//打印树
{
if(tree == NULL)
return;
R_Display(tree->head->next,0,pFunc);//先打印根节点
}
//主函数 mani.c
#include <stdio.h>
#include "tree.h"
void printA(TreeNode *node)
{
printf("%c\n",node->data);
}
int main()
{
Tree *tree = Create_Tree();
if(tree == NULL)
{
return -1;
}
Insert_Tree(tree,'A',0);
Insert_Tree(tree,'B',0);
Insert_Tree(tree,'C',0);
Insert_Tree(tree,'D',0);
Insert_Tree(tree,'E',1);
Insert_Tree(tree,'F',1);
Insert_Tree(tree,'H',3);
Insert_Tree(tree,'I',3);
Display(tree,printA);
return 0;
}
树的创建与数据打印
最新推荐文章于 2022-05-29 16:08:18 发布