树的创建与数据打印
来源:互联网 发布:网络门禁模块 编辑:程序博客网 时间: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;}
阅读全文
0 0
- 树的创建与数据打印
- 哈夫曼树的创建与打印
- 单链表的创建、删除与打印
- 单向链表的创建与打印
- 广义表的创建与打印
- 链表的创建与增加、打印
- C++ huffman树的创建和打印
- 树的遍历与打印
- paradox数据库的创建与数据操作
- 数据集的语法创建与运用
- 数据更新、视图的创建与修改
- 数据窗口的打印
- 数据窗口的打印
- 打印奇怪的数据
- dataGridView的数据打印
- dataGridView的数据打印
- dataGridView的数据打印
- 二叉树的按层打印与ZigZag打印
- 旋转数组
- 《JAVA编程思想》第一章总结
- 异常解决:util.NativeCodeLoader: Unable to load native-hadoop library for your platform
- 个人三观的东西(1)
- Linux下非交互式提权详解
- 树的创建与数据打印
- AngularJS 的Provider,Factory与Service实现依赖注入
- 内存对齐及位域
- Python——复制文件内容
- bash: 一键安装cuDnn
- 【设计模式】其他模式
- springmvc补充
- Intellij IDEA 中使用 MyBatis-generator 自动生成 MyBatis 代码
- win10系统的一种常见问题