c语言实现tree数据结构
该代码实现了tree的结构。依赖dyArray数据结构。有first一级文件夹。second二级文件夹。
dyArray的c实现參考这里点击打开链接 hashTable的c实现參考这里点击打开链接
以下是跨平台的数据类型定义
//
// cpPlatform.h
// dataStruct
//
// Created by hherima on 14-7-29.
// Copyright (c) 2014年 . All rights reserved.
// #ifndef dataStruct_cpPlatform_h
#define dataStruct_cpPlatform_h enum
{
CP_FALSE = 0,
CP_TRUE = !CP_FALSE
}; #define F_MALLOC_TYPE(s) (s*)f_malloc(sizeof(s))
#define FREEFUN free
#define MIN_PRE_ALLOCATE_SIZE 10 //The initial size of the dynamic array.
#define MEMSETFUN memset
#define REALLOCFUN realloc
#define MALLOCFUN malloc
#define MEMCMPFUN memcmp
#define MEMCPYFUN memcpy typedef unsigned char cp_bool;
typedef signed int cp_int32;
typedef char cp_int8;
typedef unsigned int cp_uint32; #endif
//
// treeStruct.h
// dataStruct
//
// Created by hherima on 14-8-1.
// Copyright (c) 2014年 . All rights reserved.
// #ifndef dataStruct_treeStruct_h
#define dataStruct_treeStruct_h #include <stdlib.h>
#include "cpPlatform.h"
#include "dyArray.h" struct firstnode;
struct secondnode;
struct tree; enum nodetype //tree节点类型
{
second_type_node,
first_type_node
}; struct firstnode
{
void** pfirst;
struct DynamicArray *second_array;
void *puiData;
cp_bool flag_expand; //标志该组是否展开
}; struct TreeNode
{
enum nodetype pnode_t; //用来记录该节点为first或者是second
void *nodedata; //该指针实际应该为firstnode或者secondnode,应依据nodetype强转加以使用
}; struct tree
{
/*struct Iterator_trees_fromcur_skipmode */void *piterator_fromcur_skipmode;
/*struct Iterator_trees_fromhead_skipmode*/void *piterator_fromhead_skipmode;
/*struct Iterator_trees_fromhead_holemode*/void *piterator_fromhead_holemode; #ifdef FET_ITERATOR_EXTEND
/*struct Iterator_trees_fromcur_holemode*/void *piterator_fromcur_holemode;
/*struct Iterator_trees_fromcur_first*/void *piterator_fromcur_first;
/*struct Iterator_trees_fromhead_first*/void *piterator_fromhead_first;
/*struct Iterator_trees_fromcur_skipmode_wm*/void *piterator_fromcur_skipmode_wm;
/*struct Iterator_trees_fromcur_holdmode_wm*/void *piterator_fromcur_holemode_wm;
/*struct Iterator_trees_fromcur_first_wm*/void *piterator_fromcur_first_wm;
#endif
struct DynamicArray *first_array;
cp_int32 firstIndex; //该second所在组在整个组动态数组中的index
cp_int32 secondIndex; //该second所在second动态数组中的index
void * pCursorfirstNode;
void * pCursorsecondNode;
}; enum travmode //遍历模式
{
skipModeFlag, //跳跃闭合组模式
wholeModeFlag, //全节点遍历模式(不区分闭合组)
}; //为树上的节点申请空间
cp_bool create_first_array(struct tree *c_tree,DataDestroyFunc data_destroy); cp_bool create_second_array(struct firstnode *first_node,DataDestroyFunc data_destroy); cp_bool append_first_ele(struct tree *c_tree, struct firstnode *first_node); cp_bool append_second_ele(struct firstnode *first_node, struct secondnode *second_node); cp_bool insert_first_ele(struct tree *c_tree, struct firstnode *first_node, cp_int32 insert_pos); cp_bool insert_second_ele(struct firstnode *first_node, struct secondnode *second_node, cp_int32 insert_pos); cp_bool ThisIsSelectedNode(struct tree *theTree, void *pNode); void *get_focus_first(struct tree *theTree); #endif
//
// treeStruct.c
// dataStruct
//
// Created by hherima on 14-8-1.
// Copyright (c) 2014年 . All rights reserved.
//
#include "treeStruct.h" cp_bool create_first_array(struct tree *c_tree,DataDestroyFunc data_destroy)
{
if( c_tree == NULL )
return CP_FALSE;
c_tree->first_array = DyArrayCreate(data_destroy);
if(c_tree->first_array == NULL)
return CP_FALSE;
else
return CP_TRUE;
} cp_bool create_second_array(struct firstnode *first_node,DataDestroyFunc data_destroy)
{
if(first_node == NULL)
return CP_FALSE;
first_node->second_array = DyArrayCreate(data_destroy);
if(first_node->second_array == NULL)
return CP_FALSE;
else
return CP_TRUE;
} cp_bool append_first_ele( struct tree *c_tree, struct firstnode *first_node )
{
if( c_tree == NULL || first_node == NULL)
{
return CP_FALSE;
} if( !DyArrayAppend(c_tree->first_array, first_node) )
return CP_FALSE;
else
{
return CP_TRUE;
}
} cp_bool append_second_ele(struct firstnode *first_node, struct secondnode *second_node)
{
if( first_node == NULL || second_node == NULL)
{
return CP_FALSE;
}
if( !DyArrayAppend(first_node->second_array, second_node))
return CP_FALSE;
else
{
return CP_TRUE;
}
} cp_bool insert_first_ele(struct tree *c_tree, struct firstnode *first_node, cp_int32 insert_pos)
{
if( first_node == NULL || c_tree == NULL)
{
return CP_FALSE;
}
if(!DyArrayInsert(c_tree->first_array, insert_pos, first_node))
return CP_FALSE;
else
return CP_TRUE;
} cp_bool insert_second_ele(struct firstnode *first_node, struct secondnode *second_node, cp_int32 insert_pos)
{
if( first_node == NULL || second_node == NULL)
{
return CP_FALSE;
}
if(!DyArrayInsert(first_node->second_array, insert_pos, second_node))
return CP_FALSE;
else
return CP_TRUE;
} void traversal_tree(struct tree *theTree)
{
cp_int32 i = 0, j = 0;
cp_int32 first_num = 0, second_num = 0;
struct firstnode *pcurfirst;
struct secondnode *pcursecond;
first_num = theTree->first_array->m_nSize;
while(i < first_num)
{
pcurfirst = (struct firstnode*)(theTree->first_array->m_ppData[i++]);
// visit(pcurfirst);
j = 0;
second_num = pcurfirst->second_array->m_nSize;
while(j < second_num)
{
pcursecond = (struct secondnode*)(pcurfirst->second_array->m_ppData[j++]);
// visit(pcursecond);
}
}
//遍历结束的回调
} void traversal_firstnode(struct tree *theTree)
{
cp_int32 i = 0;
cp_int32 first_num = 0;
struct firstnode *pcurfirst;
first_num = theTree->first_array->m_nSize;
while(i < first_num)
{
pcurfirst = (struct firstnode*)(theTree->first_array->m_ppData[i++]);
// visit(pcurfirst);
}
//遍历结束的回调
} cp_bool ThisIsSelectedNode(struct tree *theTree, void *pNode)
{
if(theTree->secondIndex == -1)
{
if(theTree->first_array->m_ppData[theTree->firstIndex] == pNode)
{
return CP_TRUE;
}
else
{
return CP_FALSE;
}
}
else
{
struct firstnode *first_node = NULL;
first_node = theTree->first_array->m_ppData[theTree->firstIndex];
if(first_node->second_array->m_ppData[theTree->secondIndex] == pNode)
{
return CP_TRUE;
}
else
{
return CP_FALSE;
}
}
} void *get_focus_first(struct tree *theTree)
{
if(theTree == NULL)
return NULL;
if(theTree->first_array == NULL)
return NULL;
return theTree->first_array->m_ppData[theTree->firstIndex];
}
c语言实现tree数据结构的更多相关文章
- 1. C语言中的数据结构.md
C语言内建数据结构类型 整型 整型数据是最基本的数据类型,不过从整形出发衍生出好几种integer-like数据结构,譬如字符型,短整型,整型,长整型.他们都是最基本的方式来组织的数据结构,一般是几位 ...
- Cocos2d-x 脚本语言Lua基本数据结构-表(table)
Cocos2d-x 脚本语言Lua基本数据结构-表(table) table是Lua中唯一的数据结构.其它语言所提供的数据结构,如:arrays.records.lists.queues.sets等. ...
- C语言实现通用数据结构的高效设计
近期在阅读一个开源的C++代码.里面用到了大量的STL里面的东西.或许是自己一直用C而非常少用C++来实现算法的原因.STL里面大量的模板令人心烦.一直对STL的效率表示怀疑,但在网上搜到这样一个帖子 ...
- C语言运行时数据结构
段(Segment): 对象文件/可执行文件: SVr4 UNIX上被称为ELF(起初"Extensible Linker Format", 现在"Executable ...
- C语言实现常用数据结构——链表
#include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *next; ...
- R语言数据类型与数据结构
一.数据类型 5种 1.character 字符 2.numeric 数值 3.integer 整数 一般数字的存储会默认为数值类型,如果要强调是整数,需要在变量值后面加上 L. x <- 5L ...
- C语言动态链表数据结构
链表的操作增删改查 typedef int DATA; struct SNode { DATA data; SNode* pNext; }; SNode* g_head=NULL;//全局变量 //从 ...
- C语言实现常用数据结构——二叉树
#include<stdio.h> #include<stdlib.h> #define SIZE 10 typedef struct Tree { int data; str ...
- C语言 严蔚敏数据结构 线性表之链表实现
博主最近在考成都大学皇家计算机科学与技术专业,复习专业课数据结构,正好学习到线性结构中的线性表用链表这种存储结构来实现. 首先,数据结构包括1.数据的操作2.逻辑结构3.存储结构(数据结构三要素. 直 ...
随机推荐
- D - Common Subsequence
D - Common Subsequence Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I ...
- node-webkit 使用nodejs第三方C/C++插件
node-webkit 在window环境下使用C/C++插件,需要使用nw-gyp先编译.本文以编译node-expat演示操作过程: 1.安装nodejs: 最好将nodejs的执行路径添加进系统 ...
- 一周学会Mootools 1.4中文教程:(1)Dom选择器
利器: 君欲善其事须先利其器,好吧因为我们的时间比较紧迫,只有六天而已,那么六天的时间用死记硬背的方式学会Mt犹如天方夜谭,因此我们需要借鉴一下Editplus的素材栏帮我们记忆就好了,当我们需要用到 ...
- 深入剖析PE文件
不赖猴的笔记,转载请注明出处. 深入剖析PE文件 PE文件是Win32的原生文件格式.每一个Win32可执行文件都遵循PE文件格式.对PE文件格式的了解可以加深你对Win32系统的深入理解. 一. ...
- C# WinForm判断Win7下是否是管理员身份运行
原文:C# WinForm判断Win7下是否是管理员身份运行 如果程序不是以管理员身份运行,操作本地文件会提示:System.UnauthorizedAccessException异常 Vista 和 ...
- TCP/IP笔记 三.运输层(2)——TCP 流量控制与拥塞控制
TCP 的流量控制与拥塞控制可以说是一体的.流量控制是通过滑动窗口实现的,拥塞避免主要包含以下2个内容: (1)慢开始,拥塞避免 (2)快重传,快恢复 1.流量控制——滑动窗口 TCP采用大小可变的滑 ...
- req.body取不到值的问题;
随着express升级,bodyParser从express中被分离了出来,因此,在使用express新版本的时候,需要npm install body-parser 来安装bodyParser. 在 ...
- 【技术引擎——汇聚IT思想之间的碰撞】
转载请注明作者和出处:http://blog.csdn.net/pearyangyang/article/details/40869825 谢谢. 这篇博客将记录我所学习的那些博客大牛,方面以后 ...
- hdu 1507 Largest Rectangle in a Histogram 动态规划计算最大面积
记录动态规划dpl,dpr,分辨记录i左面的比i大的,右面比i大的,然后(dpr[i]-dpl[i]+1)*h[i]得出长度 动态转移方程while(temp>1 && h[te ...
- hdu 2777(线段树)
这道题是看了别人的思路才做出来的. 刚看完这道题没什么思路,线段的长度是10^5,操作指令数是10^5,还要记录不同颜色种类数,觉着怎么写肯定都是要超时.我当时在节点里增加了一个数组记录已经出现的颜色 ...