数据结构之树的实现

#ifndef _TREE_H_
#define _TREE_H_

#include "error.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);

//移除结点
//int R_Delete (Tree *tree,TreeNode *node);

//删除指定位置结点
int Delete(Tree *tree,int pos,TreeData *x);

//获取树的结点
int Get_Tree(Tree *tree,int pos,TreeData *x);

//清楚所有结点
int Tree_Clear(Tree *tree);

//销毁树
void Destroy(Tree *tree);

//获取根节点
TreeNode *Tree_root(Tree *tree);

//树链表的长度
int Tree_Count(Tree *tree);

//结点的高度
//int R_Tree_Height(TreeNode *node); 

//树的高度
int Tree_Height(Tree *tree);

//结点的度(后继数量)
//int R_Degree(TreeNode *tree); 

//树的度
int Degree(Tree *tree);



#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)
	{
		errno = MALLOC_ERROR;
		return false;
	}
	
	//创建树结点链表的头结点
	tree->head = (TreeNode *)malloc(sizeof(TreeNode) / sizeof(char));
	if(tree->head == NULL)
	{
		errno = MALLOC_ERROR;
		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)
	{
		errno = ERROR;
		return false;
	}
	
	if(pos != 0 && tree->len == pos)
	{
		errno = ERROR;
		return false;
	}
	
	//新建结点
	TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode) / sizeof(char));
	if(node == NULL)
	{
		errno = MALLOC_ERROR;
		return false;
	}
	
	node->data = data;
	node->next = NULL;
	
	//创建node结点的孩子结点链表的头结点
	node->childlist = (ChildNode *)malloc(sizeof(ChildNode) / sizeof(char));
	if(node->childlist == NULL)
	{
		errno = MALLOC_ERROR;
		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)
		{
			errno = MALLOC_ERROR;
			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);//先打印根节点
}

int R_Delete (Tree *tree,TreeNode *node)//移除结点
{
	if(tree == NULL || node == NULL)
	{
		return;
	}
	//先从树链表中移除结点,找node的前一个结点
	TreeNode *tmp = tree->head->next;
	while(tmp)
	{
		if(tmp == node)
		{
			tmp = node->next;
			(tree->len)--;
		}
		tmp = tmp->next;
	}
	
	//将父结点中子节点链表中的node的结点移除
	TreeNode *parent = node->parent;
	if(parent != NULL)
	{
		ChildNode *tmp = parent->childlist;//子结点链表的头结点
		while(tmp->next)
		{
			if(tmp->next->childNode == node)
			{
				ChildNode *p = tmp->next;
				tmp->next = p->next;
				free(p);
				parent->degree--;
				break;
			}
			tmp = tmp->next;
		}
	}
	//将node结点的孩子结点删掉
	ChildNode *child = node->childlist->next; //孩子链表的第一个结点
	while(child)
	{
		ChildNode *tmp = child->next;
		R_Delete(tree,child->childNode); 
		child = tmp;
	}
	free(node->childlist);
	free(node);
	
}

int Delete(Tree *tree,int pos,TreeData *x)//删除指定位置结点
{
	if(tree == NULL || pos < 0 || pos > tree->len)
	{
		errno = ERROR;
		return false;
	}
	if(pos != 0 && tree->len == pos)
	{
		errno = ERROR;
		return false;
	}
	
	//找结点
	int i;
	TreeNode *current = tree->head->next;//当前树链表第一个结点
	for(i = 0; i < pos;i++)
	{
		current = current->next;
	}
	
	*x = current->data;
	
	R_Delete(tree,current);
	
	return true;
}

int Get_Tree(Tree *tree,int pos,TreeData *x) //获取树的结点
{
	if(tree == NULL || pos < 0 || pos > tree->len)
	{
		errno = ERROR;
		return false;
	}
	if(pos != 0 && tree->len == pos)
	{
		errno = ERROR;
		return false;
	}
	
	int i;
	// 找结点
	TreeNode* current = tree->head->next;  
	for (i = 0; i < pos; i++)
	{
		current = current->next;
	}
	
	*x = current->data;//获取结点数据
	
	return true;
}

int Tree_Clear(Tree *tree)//清楚所有结点
{
	if(tree = NULL)
	{
		errno = ERROR;
		return false;
	}
	TreeData x;
	
	Delete(tree,0,&x);
	
	return true;
}

void Destroy(Tree *tree)//销毁树
{
	
	
	if(tree = NULL)
	{
		errno = ERROR;
		return ;
	}
	
	Tree_Clear(tree);//清除所有结点在释放掉
	
	free(tree->head);
	free(tree);
	
	return;
}

TreeNode *Tree_root(Tree *tree) //获取根节点
{
	if(tree == NULL)
	{
		errno = ERROR;
		return NULL;
	}
	return tree->head->next;
}

int Tree_Count(Tree *tree) // 树链表的长度
{
	if(tree = NULL)
	{
		errno = ERROR;
		return false;
	}
	
	return tree->len;
}

int R_Tree_Height(TreeNode *node) //结点的高度
{
	if(node == NULL)
	{
		return false;
	}
	int subheight = 0;
	int max = 0;
	ChildNode *child = node->childlist->next;
	while(child)
	{
		subheight = R_Tree_Height(child->childNode);
		if(subheight > max)
			max = subheight;
		
		child = child->next;
	}
		return max + 1;
}

int Tree_Height(Tree *tree)  //树的高度
{
	if (tree == NULL)
	{
		errno = ERROR;
		return FALSE;
	}
	int height = R_Tree_Height(tree->head->next);
	
	return height;
}

int R_Degree(TreeNode *node) //结点的度(后继数量)
{
	if(node == NULL)
	{
		return false;
	}
	
	int max = node->degree;
	int subdegree = 0;
	ChildNode *child = node->childlist->next;
	while(child)
	{
		subdegree = R_Degree(child->childNode);
		if(subdegree > max)
		{
			max = subdegree;
		}
		child = child->next;
	}
	return max;                
}

int Degree(Tree *tree) //树的度
{
	if (tree == NULL)
	{
		errno = ERROR;
		return FALSE;
	}
	
	int degree = R_Degree(tree->head->next);
	
	return degree;
}



//main.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)
	{
		myerror("Create_Tree");
		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);
	
	TreeData x;
	//Delete(tree,i,&x);
	
	printf("height = %d\n",Tree_Height(tree));
	printf("degree = %d\n",Degree(tree));
	
	
	
	return 0;
}



发布了58 篇原创文章 · 获赞 12 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章