C语言树的编程程序

来源:互联网 发布:激光发射器软件 编辑:程序博客网 时间:2024/06/01 07:32

main主函数:

#include <stdio.h>#include "tree.h"int main(){Tree *tree = Tree_Create();if (tree == NULL)return -1;Tree_Insert(tree, 'A', -1);Tree_Insert(tree, 'B', 0);Tree_Insert(tree, 'C', 0);Tree_Insert(tree, 'D', 0);Tree_Insert(tree, 'E', 1);Tree_Insert(tree, 'F', 1);Tree_Insert(tree, 'G', 2);Tree_Insert(tree, 'H', 3);Tree_Insert(tree, 'I', 3);Tree_Insert(tree, 'J', 3);Display(tree);return 0;}
树的.c文件
#include "tree.h"#include <stdlib.h>#include <stdio.h>#include <assert.h>Tree* Tree_Create(){// 创建树的结点Tree* tree = (Tree*)malloc(sizeof(Tree)/sizeof(char));assert(tree);// 对树的结点参数进行初始化tree->len = 0;// 创建树的链表的头节点tree->head = (TreeNode*)malloc(sizeof(TreeNode)/sizeof(char));assert(tree->head);tree->head->next      = NULL;tree->head->parent    = NULL;tree->head->childList = NULL;return tree;}/*初始化新结点参数:data = datalen = 0;next  = NULLchildList:新建子节点链表的头节点,初始化相应参数parent: 找到双亲结点,如果找到:在双亲结点的子节点链表中新建子节点子节点参数:next = null  childNode = node; 将新的子结点尾插进双亲结点的子结点链表当中双亲结点的度 要 +1*/int Tree_Insert(Tree* tree, TreeData data, int pos){assert(tree != NULL && pos < tree->len);// 新建树结点TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)/sizeof(char));assert(node);node->data = data;node->len  = 0;node->next = NULL;node->childList = (ChildNode*)malloc(sizeof(ChildNode)/sizeof(char));assert(node->childList);node->childList->next      = NULL;node->childList->childNode = NULL;// 找双亲结点TreeNode* parent = tree->head->next;  // 树链表的第0个结点int i;for (i = 0; i < pos; i++){parent = parent->next;}// 如果双亲结点存在,就加入到双亲结点的子结点链表中if (parent != NULL){// 创建一个子结点ChildNode* childNode = (ChildNode*)malloc(sizeof(ChildNode)/sizeof(char));assert(childNode);childNode->next      = NULL;childNode->childNode = node;// 将子结点插入到parent的childList中ChildNode* tmp = parent->childList;  // 子结点链表的头节点while(tmp->next)tmp = tmp->next;tmp->next = childNode;parent->len++;}// 将新结点插入到树的链表中TreeNode* tmp = tree->head;while(tmp->next)tmp = tmp->next;tmp->next = node;tree->len++;return 1;}void r_display(TreeNode *node ,int gap){if(node == NULL)return ;int i = 0;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+2);child = child -> next;}}void Display(Tree *tree){assert(tree);r_display(tree->head->next,0);}
树的.h文件
#ifndef __TREE_H__#define __TREE_H__struct _treeNode;   // 类型声明typedef char TreeData;// 孩子结点类型typedef struct _childNode{struct _treeNode *childNode;  // 指向孩子结点的指针struct _childNode *next;}ChildNode;typedef struct _treeNode{TreeData data;struct _treeNode *parent;       // 指向双亲结点struct _treeNode *next;         // 指向链表的下一个结点struct _childNode* childList;   // 指向孩子结点链表头节点的指针int len;                        // 孩子结点的个数:度}TreeNode;typedef struct _tree{TreeNode *head; // 指向树的链表的头节点int len;        // 树中结点的总个数}Tree;// 创建通用树Tree* Tree_Create();// 树节点插入:pos指双亲结点在链表中的位置,链接中的结点是从0开始// 也就是说 根节点的位置 是 0int Tree_Insert(Tree* tree, TreeData data, int pos);void Display(Tree *tree);void r_display(TreeNode *node ,int gap);#endif // __TREE_H__

原创粉丝点击