类似 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; } 如果有朋友知道怎么水平打印请指点。