DC- 17 :树树树01

来源:互联网 发布:linux 获取所有网卡 编辑:程序博客网 时间:2024/06/10 22:32

树真的乱。。。。

先把树的创建与插入放上来:

头文件:

#ifndef __TREE_H__#define __TREE_H__#include "error.h"struct _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 代表要插入结点父亲结点的位置// 约定:// 1 新插入的结点插入在当前父亲结点所有孩子的右边// 2 根节点的位置是 0int Insert_Tree(Tree *tree, TreeData data, int pos);#endif  // __TREE_H__

这是调用函数:

#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;   // 代表树中没有结点// 空树结点为0tree->len = 0;return tree;}/*TreeData data;struct _treeNode *parent;      // 指向父节点的指针          11111111111struct _treeNode *next;        // 指向链表的下一个结点struct _childNode *childList;  // 孩子链表的头节点int degree;                    // 结点的度typedef struct _childNode{struct _treeNode * childNode;struct _childNode *next;  // 指向孩子结点链表下一个元素}ChildNode;*/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)                 //* 为了判断这个node会不会放在第一个{// 创建一个孩子结点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;}
树的实现是一个很复杂的过程,这个程序的思想是先把所有节点连起来,多于每个节点有一个自己的链表存放另一种结构体。为它的子节点。所有链表均使用头结点链表。

原创粉丝点击