1首先来看下节点数据的结构:
// 整个数据的数据头部分
typedef struct
{
int nLng;
int len; //data指向的区域中已经使用的内存的长度
int count; //数据项的数目
int malloclen; //data指向的区域有效内存的长度
char * data; //指向数据项的内存区域的指针
}TREE, *TREE;
2然后是每个数据项的结构
// 每个数据项结构体的头部
typedef struct
{
int parent; //父节点号
int node; //本层节点号
int len; //文本长度
char text[0]; //待打印字符串,柔性数组
}ITEM, *ITEM;
3数据存储方式说明
整个存储区域是连续的,data指向某个数据项。
4生成数据项时的编号方式
没有格式控制时的打印方式为:
str1
str2
str3
str4
str5
...
我们想实现如下分层方式;
str1
str2
str3
str4
str5
str6
...
节点编号 | 父节点号 | 节点字符串 |
1 | 0 | Str1 |
2 | 1 | Str2 |
3 | 1 | Str3 |
4 | 3 | Str4 |
5 | 0 | Str5 |
6 | 5 | Str6 |
5实现方式:通过遍历当前打印节点以上的节点的父节点,直到遇到0,实现函数如下:
int ReturnHigh(char *data) //该函数返回值为数据项处于第几层(层数即缩进的次数,或空格的次数),data为指向当前数据项头的指针
{
ITEM *p = (ITEM*)data;
ITEM *newp = p;
while (p->parent != 0)
{
newp = (ITEM*)((char*)newp - newp->len - sizeof(ITEM));
if (newp->node == p->parent)
{
return ReturnHigh((char*)newp) + 1;
}
}
if (p->parent == 0)
{
return 0;
}
}