树的创建与数据打印

//头文件 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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章