C语言树的建立

xiaoxiao2021-02-28  93

#include "tree.h" #include <stdlib.h> Tree *Create_Tree()//创建树 { Tree* tree = (Tree*)malloc(sizeof(Tree)/sizeof(char)); if (tree == NULL) { errno = MALLOC_ERROR; return NULL; } 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->childList = NULL; tree->head->next = NULL; tree->len = 0; return tree; } 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->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* 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", '-'); } printf ("%c\n", node->data); 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); } void r_delete(Tree *tree, TreeNode *node)//递归删除孩子节点 { if (tree == NULL || node == NULL) return; TreeNode* tmp = tree->head; // 链表的头节点 while (tmp->next) { if (tmp->next == node) { tmp->next = node->next; tree->len --; break; } tmp = tmp->next; } 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; } } ChildNode* child = node->childList->next; // 子结点链表中的第一个结点 while (child) { ChildNode* pchild = child->next; r_delete(tree, child->childNode); child = pchild; } 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 Tree_Get(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; return Delete (tree, 0, &x); } void Tree_Destroy(Tree* tree)//销毁树 { if (tree == NULL) { errno = ERROR; return; } Tree_Clear(tree); free (tree->head); free (tree); } 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_height(TreeNode* node)//递归计算节点深度 { if (node == NULL) return 0; int subHeight = 0; int max = 0; ChildNode* child = node->childList->next; while (child) { subHeight = r_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_height(tree->head->next); return height; } int r_degree(TreeNode* node)//递归计算节点的度 { if (node == NULL) return 0; 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 Tree_Degree(Tree* tree)//树的度 { if (tree == NULL) { errno = ERROR; return FALSE; } int degree = r_degree(tree->head->next); return degree; }
转载请注明原文地址: https://www.6miu.com/read-70672.html

最新回复(0)