树的创建与数据打印

来源:互联网 发布:网络门禁模块 编辑:程序博客网 时间:2024/05/29 19:31
//头文件 TREE.h#ifndef _TREE_H_#define _TREE_H_#define false 0#define true 1typedef _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;}

原创粉丝点击