您的位置:首页 > 其它

一般树的打印【字符界面】

2009-04-04 13:18 155 查看
类似 windows命令行下 tree命令的输出结果:
Sargeras
├─Qaejadan
│ ├─Paradin
│ ├─Tyrande
│ │ └─Malfurion
│ ├─LichKing
│ └─Athas
├─Manorath
│ └─Cesius
├─Elune
│ ├─Mathara
│ │ ├─Sean
│ │ ├─Druid
│ │ │ ├─Jim
│ │ │ └─Sophia
│ │ │      └─Roy
│ │ └─Mavei
│ └─Ilidan
└─Knuth
源代码:
#include <stdio.h>
#define MAXCHILD 10
#define MAXDEPTH 128
#define BLANK " "
#define VERTICAL "│"
#define HORIZON "─"
#define BRANCH "├"
#define BRANCHEND "└"
#define BLANK_FLAG 0
#define VERTICAL_FLAG 1
#define HORIZON_FLAG 2
#define BRANCH_FLAG 3
#define BRANCHEND_FLAG 4
#define PRINT(SYMBOL) printf("%s", SYMBOL)
int state[MAXDEPTH + 1];
typedef struct TNode
{
char *data;
int n;
struct TNode *child[MAXCHILD];
} TreeNode;
void printTree(TreeNode *root, int depth, int last)
{
int i, tmp;
int newlast = 0;
for (i = 0; i < depth; ++i)
{
switch (state[i])
{
case BLANK_FLAG: PRINT(BLANK); break;
case VERTICAL_FLAG: PRINT(VERTICAL); break;
case BRANCH_FLAG: PRINT(BRANCH); break;
case BRANCHEND_FLAG: PRINT(BRANCHEND); break;
case HORIZON_FLAG: PRINT(HORIZON); break;
default: printf("error at line %d/n", __LINE__);
}
if (i < depth - 1) PRINT(BLANK);
else PRINT(HORIZON);
}
printf("%s/n", root->data);
if (depth > 0 && last) state[depth - 1] = BLANK_FLAG;
if (root->n == 0) return;
for (i = 0; i < root->n; ++i)
{
if (i == root->n - 1)
{
newlast = 1;
state[depth] = BRANCHEND_FLAG;
} else state[depth] = BRANCH_FLAG;
if (depth > 0)
{
tmp = state[depth - 1];
if (state[depth - 1] != BLANK_FLAG && state[depth - 1] != VERTICAL_FLAG)
state[depth - 1] = VERTICAL_FLAG;
}
printTree(root->child[i], depth + 1, newlast);
if (depth > 0) state[depth - 1] = tmp;
}
}
void add_node(TreeNode* node, TreeNode *sub)
{
node->child[node->n++] = sub;
}
TreeNode* new_node(char *data)
{
TreeNode *node = (TreeNode*) malloc(sizeof (TreeNode));
node->data = data ;
node->n = 0;
return node;
}
void destroy(TreeNode *root)
{
int i;
if (!root) return;
for (i = 0; i < root->n; ++i)
destroy(root->child[i]);
free(root);
}
int main()
{
TreeNode *root = new_node("Sargeras");
TreeNode *s1 = new_node("Qaejadan");
TreeNode *s2 = new_node("Manorath");
TreeNode *s3 = new_node("Elune");
TreeNode *s4 = new_node("陈晟洋");
TreeNode *s11 = new_node("Paradin");
TreeNode *s12 = new_node("Tyrande ");
TreeNode *s13 = new_node("LichKing");
TreeNode *s14 = new_node("Athas");
TreeNode *s121 = new_node("Malfurion");
TreeNode *s21 = new_node("Cesius");
TreeNode *s31 = new_node("Mathara");
TreeNode *s32 = new_node("Ilidan");
TreeNode *s311 = new_node("Sean");
TreeNode *s312 = new_node("Druid");
TreeNode *s313 = new_node("Mavei");
TreeNode *s3121 = new_node("Jim");
TreeNode *s3122 = new_node("Sophia");
TreeNode *s31221 = new_node("Roy");
add_node(root, s1);
add_node(root, s2);
add_node(root, s3);
add_node(root ,s4);
add_node(s1, s11);
add_node(s1, s12);
add_node(s1, s13);
add_node(s1, s14);
add_node(s12, s121);
add_node(s2, s21);
add_node(s3, s31);
add_node(s3, s32);
add_node(s31, s311);
add_node(s31, s312);
add_node(s31, s313);
add_node(s312, s3121);
add_node(s312, s3122);
add_node(s3122, s31221);
if (root) printTree(root, 0, 0);
destroy(root);
return 0;
}


 

如果有朋友知道怎么水平打印请指点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  branch struct windows tree