在得到家族树各个结点的层次,宽度,相对位置,绝对位置后,根据结点的层号可以知道该结点在第几行显示,根据结 点的层内绝对开始位置可以知道该结点和'|'在第几列开始显示,根据相对于父亲的起始位 置,可以知道向左画多少个'-'。在结点名称、'|'和'-'都显示出来以后,家族树的绘制任务即 结束 C语言
时间: 2024-04-09 19:32:56 浏览: 54
C语言+家族谱+树结构
在C语言中,你可以使用字符数组和循环来绘制家族树。首先,你需要定义一个合适大小的字符数组来存储家族树的图形表示。然后,根据结点的层号、层内绝对开始位置和相对于父亲的起始位置,来确定每个字符在数组中的位置。
下面是一个示例代码,用于绘制家族树:
```c
#include <stdio.h>
#include <string.h>
#define MAX_ROWS 100 // 最大行数
#define MAX_COLS 100 // 最大列数
void drawFamilyTree(int levels[], int widths[], int positions[], char names[][20], int count) {
char tree[MAX_ROWS][MAX_COLS];
// 初始化家族树
for (int i = 0; i < MAX_ROWS; i++) {
for (int j = 0; j < MAX_COLS; j++) {
tree[i][j] = ' ';
}
}
// 绘制每个结点
for (int i = 0; i < count; i++) {
int level = levels[i];
int width = widths[i];
int position = positions[i];
char* name = names[i];
// 计算结点在数组中的位置
int row = level * 2;
int col = position + width / 2;
// 绘制结点名称
strcpy(&tree[row][col], name);
// 绘制竖线
for (int j = row + 1; j < MAX_ROWS; j += 2) {
tree[j][col] = '|';
}
// 绘制横线
if (level > 0) {
int parentPosition = positions[i - 1];
int parentCol = parentPosition + widths[i - 1] / 2;
if (col > parentCol) {
for (int j = parentCol + 1; j < col; j++) {
tree[row - 1][j] = '-';
}
} else {
for (int j = col + 1; j < parentCol; j++) {
tree[row - 1][j] = '-';
}
}
}
}
// 打印家族树
for (int i = 0; i < MAX_ROWS; i++) {
for (int j = 0; j < MAX_COLS; j++) {
printf("%c", tree[i][j]);
}
printf("\n");
}
}
int main() {
// 定义家族树的结点信息
int levels[] = {0, 1, 1, 2, 2, 2};
int widths[] = {5, 3, 3, 2, 2, 2};
int positions[] = {0, -2, 2, -1, 0, 1};
char names[][20] = {"A", "B", "C", "D", "E", "F"};
int count = sizeof(levels) / sizeof(levels[0]);
// 绘制家族树
drawFamilyTree(levels, widths, positions, names, count);
return 0;
}
```
这段代码会根据给定的家族树结点信息,绘制出相应的家族树图形。你可以根据实际的家族树结构,修改数组中的元素来绘制不同的家族树。注意,这只是一个简单的示例,实际应用中可能需要更多的判断和处理逻辑来确保绘制出正确的家族树形状。
阅读全文