📄 tree.cpp
字号:
// tree.cpp : Defines the entry point for the console application.
//
//#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "treeOp.h"
/* 测试函数*/
void test_tree();
void write_testcfg();
int main()
{
write_testcfg();
/* 调用测试函数*/
test_tree();
return 0;
}
void test_tree()
{
char path[] = "5:31:34:41"; /* 结点 1 的路径 */
char path2[]= "1:7:9"; /* 结点 2 的路径 */
char path3[]= "3:16:20"; /* 结点 3 的路径 */
char *pathp = path; /* 指向结点路径的指针 */
char *oldpath = NULL;
char *nextpath = NULL;
char *value = NULL; /* path对应的结点值或第一个类型为 1 的并列结点的路径*/
int flag = NODE_IS_LEAF; /* 输入输出参数。输入时表示结点内型,取值为 NODE_IS_LEAF(0) 或 NODE_IS_BRANCH(1);若 path 对应的结点为内部结点,并且 path的下一个类型为 flag的结点存在,则 flag 的返回值为 NEXT_NODE_EXIST;flag 在这种情况必须先初始化后再传递给get_value函数*/
/* 1、定义树根结点*/
struct tree_node *root = NULL;
//struct tree_node *init_cfg(char *cfg_filepath, char *task_filepath, char **argv, char *direct)
/* 2、创建树*/
root = init_cfg( (char*)("test.cfg"), (char*)NULL, (char**)NULL,(char*)("00100"));
if (NULL == root)
{
/* 创建树失败*/
return ;
}
/* 在屏幕上打印没进行任操作之前的整棵树*/
printf("没进行任操作之前的整棵树:\n");
print_tree(root,0);
getchar();
printf("\n\n");
/**************************
* 3、获取的值 -- start *
**************************/
/* 获取路径path 对应的结点的值, */
/* 如果 path 对应的结点是内部结点, */
/* 则得到第一个类型为 flag 的子结点的路径 */
value = get_value(root, pathp, &flag);
if (NULL != value) /* 如果获取成功*/
{
if (NEXT_NODE_EXIST == flag) /* 得到是下一个并列结点的路径,说明 path 对应的结点是内部结点*/
{
printf("路径 %s 对应的结点是内部结点,其下一个并列结点的路径为:%s\n", pathp, value);
flag = NODE_IS_BRANCH;
oldpath = (char *)malloc(strlen(value)+1);
if (NULL == oldpath)
{
free(value);
value = NULL;
return;
}
strcpy(oldpath, value);
value = get_value(root, value, &flag);
if (NULL != value)
{
printf("路径 %s 对应的结点是叶子结点,其值为:%s\n", oldpath, value);
free(value);
value = NULL;
}
/* 得到 oldpath 路径对应结点的下一个兄弟的路径 */
nextpath = get_next_path2(root, oldpath, &flag);
if (NULL != nextpath)
{
if (NODE_IS_LEAF == flag)
printf("路径 %s 的下一并列路径 (类型是叶子) 为:%s\n", oldpath, nextpath);
else if (NODE_IS_BRANCH == flag)
printf("路径 %s 的下一并列路径 (类型是树枝) 为:%s\n", oldpath, nextpath);
free(nextpath);
nextpath = NULL;
}
free(oldpath);
oldpath = NULL;
}
else
{
printf("路径 %s 对应的结点是叶子结点,其值为:%s\n", pathp, value);
free(value);
value = NULL;
}
}
/*----------------------*
* 3、获取的值 -- end *
*--------------------- */
/********************************
* 4、修改指定结点的 -- start *
********************************/
//path2[] = "1:7:9"
pathp = path2;
if (update_node(root, pathp, "9", "node9's new value"))
{
/* 在屏幕上打印进行修改操作之后的整棵树*/
printf("进行修改操作之后的整棵树:\n");
print_tree(root,0);
getchar();
printf("\n\n");
}
/*----------------------------*
* 4、修改指定结点的 -- end *
*--------------------------- */
/******************************
* 5、插入一个结点 -- start *
******************************/
pathp = path2;
if (insert_node(root, pathp, "newnode", "newnode value"))
{
/* 在屏幕上打印进行插入操作之后的整棵树 */
printf("进行插入操作之后的整棵树:\n");
print_tree(root,0);
getchar();
printf("\n\n");
}
/*--------------------------*
* 5、插入一个结点 -- end *
*------------------------- */
/******************************
* 6、删除一个结点 -- start *
******************************/
//path3 = "3:16:20"
pathp = path3;
if (delete_node(root, pathp))
{
/* 在屏幕上打印进行删除操作之后的整棵树 */
printf("进行删除操作之后的整棵树:\n");
print_tree(root,0);
getchar();
printf("\n\n");
}
/*--------------------------*
* 6、删除一个结点 -- end *
*------------------------- */
uninit(root);
root = NULL;
}
void write_testcfg()
{
FILE *fp;
fp = fopen("test.cfg", "w+");
if (NULL == fp)
return;
fputs("[机组1]\n",fp);
fputs(" 测点=测点1\n",fp);
fputs(" [测点2]\n",fp);
fputs(" 8=8\n",fp);
fputs(" [/测点2]\n",fp);
fputs(" 9=9\n",fp);
fputs("[/机组1]",fp);
fclose(fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -