一般树的打印【字符界面】
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; }
如果有朋友知道怎么水平打印请指点。
相关文章推荐
- CentOS 7 更改默认登陆界面为字符界面
- <c语言经典100例>c27:反向打印字符
- centos 修改字符界面分辨率
- iphone 界面不能显示图片,文字问题的一般解决办法
- 编写一个程序,一行行地读取输入行,直至到达文件尾。算出每行输入行的长度,然后把最长的那行打印出来。为了简单起见,你可以假定所有的输入行均不超过1000个字符
- 如何修改red hat 4 linux字符界面下的乱码
- 一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数
- 《c程序设计语言》读书笔记--统计总的字符数,打印能打印的最多字符
- DOS界面易看错字符
- 打造字符界面的多媒体Linux系统
- Ubuntu图形界面和字符界面转换、指定默认启动界面
- ASCII 非打印控制字符表
- CentOS6.x和CentOS7.x字符界面安装图形界面方法
- 一道和打印字符有关的程序题
- Csharp: 打印設置字符之間的間距
- Linux:设置默认从字符界面启动系统
- 关于控制台打印Unicode字符的测试
- 打印字符菱形
- ubuntu设置默认启动字符界面
- Linux 无法从字符界面登陆 闪退