代码上传至http://git.oschina.net/baghnac/pane_one_path_search
照着从上往下是单向的去理解,结果路径应该如下:
搜索结果路径为:
(c)---1---(left_a)---1---[1]
(c)---1---(left_a)---0---(b)---1---[1]
(c)---0---(right_a)---1---[1]
(c)---0---(right_a)---0---(d)---1---(b)---1---[1]
结点定义
typedef enum{
FALSE,
TRUE,
}BOOL;
typedef struct T_Data{
struct T_Data* pathOneData;
struct T_Data* pathZeroData;
char nodeName[NODE_NAME_LEN];
BOOL isPaneOne;
}T_Data;
构造数据
T_Data* ConstructSingle(T_Data* pathOneData, T_Data* pathZeroData, BOOL isPaneOne, char* nodeName)
{
T_Data* ptData = (T_Data*)Malloc(sizeof(T_Data));
memset((void*)ptData, 0, sizeof(T_Data));
ptData->pathOneData = pathOneData;
ptData->pathZeroData = pathZeroData;
ptData->isPaneOne = isPaneOne;
if(NULL != nodeName)
{
strcpy(ptData->nodeName, nodeName);
}
return ptData;
}
void ConstructorData()
{
// 构造公用的1方框
T_Data* ptData_pane_one = ConstructSingle(NULL, NULL, TRUE, "pane_one");
// 构造公用的0方框
T_Data* ptData_pane_zero = ConstructSingle(NULL, NULL, FALSE, "pane_zero");
// 构造b结点
T_Data* ptData_b = ConstructSingle(ptData_pane_one, ptData_pane_zero, FALSE, "b");
// 构造d结点
T_Data* ptData_d = ConstructSingle(ptData_b, ptData_pane_zero, FALSE, "d");
// 构造左a结点
T_Data* ptData_left_a = ConstructSingle(ptData_pane_one, ptData_b, FALSE, "left_a");
// 构造右a结点
T_Data* ptData_right_a = ConstructSingle(ptData_pane_one, ptData_d, FALSE, "right_a");
// 构造c结点
T_Data* ptData_c = ConstructSingle(ptData_left_a, ptData_right_a, FALSE, "c");
gptFisrtData = ptData_c;
}
搜索并打印合法路径
void SearchPaneOne(const char* prefix, T_Data* ptData)
{
#define MAX_PATH_LEN 500
char acPath[MAX_PATH_LEN] = "";
if(NULL == ptData || NULL == prefix)
{
return;
}
if(TRUE == ptData->isPaneOne)
{
printf("%s[1]\n", prefix);
return;
}
Snprintf(acPath, MAX_PATH_LEN, "%s(%s)---1---", prefix, ptData->nodeName);
SearchPaneOne(acPath, ptData->pathOneData);
Snprintf(acPath, MAX_PATH_LEN, "%s(%s)---0---", prefix, ptData->nodeName);
SearchPaneOne(acPath, ptData->pathZeroData);
}