1. 程式人生 > 其它 >列印tree資料結構

列印tree資料結構

  使用遞迴實現,每次列印子節點前,都要把前面的“|”和空格打印出來,程式碼如下: 

typedef struct Node {
    char *name;
    int num;                  // 子節點數量
    struct Node **children;   // 子節點
} NodeT;

void PrintTree(char *gap, Node *node)
{
    printf("%s\n", node->name);
    if (node->children == NULL) {
        return;
    }
    char *newGap = malloc(strlen(gap) + sizeof("     "));
    for (int i = node->num - 1; i >= 0; i--) {
        printf("%s", gap);
        if (i == 0) {
            printf("└——— ");   // 列印最後一個節點時用“直角”
            sprintf(newGap, "%s     ", gap);  // 若最後一個節點有子節點,需要將gap增加空格
        } else {
            printf("|——— ");   // 列印中間節點時用“T形”
            sprintf(newGap, "%s|    ", gap);  // 若中間節點有子節點,需要將gap增加"|"和空格,增加的”|“是為了列印後面的節點
        }
        PrintTree(newGap, node->children[i]);
    }
}

int main(void)
{
  char *gap = malloc(sizeof('\0'));
  memset(gap, '\0', sizeof(' '));
  *gap = '\0';

  NodeT *node8 = malloc(sizeof(NodeT));
  node8->name = malloc(sizeof('i'));
  memset(node8->name, '\0', sizeof('i'));
  node8->name[0] = 'i';
  node8->num = 0;
  node8->children = NULL;

  NodeT **children4 = malloc(sizeof(NodeT *) * 1);
  memset(children4, '\0', sizeof(NodeT *));
  children4[0] = node8;

  NodeT *node7 = malloc(sizeof(NodeT));
  node7->name = malloc(sizeof('h'));
  memset(node7->name, '\0', sizeof('h'));
  node7->name[0] = 'h';
  node7->num = 0;
  node7->children = NULL;

  NodeT *node6 = malloc(sizeof(NodeT));
  node6->name = malloc(sizeof('g'));
  memset(node6->name, '\0', sizeof('g'));
  node6->name[0] = 'g';
  node6->num = 0;
  node6->children = NULL;

  NodeT **children3 = malloc(sizeof(NodeT *) * 2);
  memset(children3, '\0', sizeof(NodeT *));
  children3[0] = node6;
  children3[1] = node7;

  NodeT *node5 = malloc(sizeof(NodeT));
  node5->name = malloc(sizeof('f'));
  memset(node5->name, '\0', sizeof('f'));
  node5->name[0] = 'f';
  node5->num = 0;
  node5->children = NULL;

  NodeT *node4 = malloc(sizeof(NodeT));
  node4->name = malloc(sizeof('e'));
  memset(node4->name, '\0', sizeof('e'));
  node4->name[0] = 'e';
  node4->num = 1;
  node4->children = children4;

  NodeT *node3 = malloc(sizeof(NodeT));
  node3->name = malloc(sizeof('d'));
  memset(node3->name, '\0', sizeof('d'));
  node3->name[0] = 'd';
  node3->num = 0;
  node3->children = NULL;

  NodeT **children2 = malloc(sizeof(NodeT *) * 3);
  memset(children2, '\0', sizeof(NodeT *));
  children2[0] = node3;
  children2[1] = node4;
  children2[2] = node5;

  NodeT *node1 = malloc(sizeof(NodeT));
  node1->name = malloc(sizeof('b'));
  memset(node1->name, '\0', sizeof('b'));
  node1->name[0] = 'b';
  node1->num = 2;
  node1->children = children3;

  NodeT *node2 = malloc(sizeof(NodeT));
  node2->name = malloc(sizeof('c'));
  memset(node2->name, '\0', sizeof('c'));
  node2->name[0] = 'c';
  node2->num = 3;
  node2->children = children2;

  NodeT **children1 = malloc(sizeof(NodeT *) * 2);
  memset(children1, '\0', sizeof(NodeT *));
  children1[0] = node1;
  children1[1] = node2;

  NodeT *node = malloc(sizeof(NodeT));
  node->name = malloc(sizeof('a'));
  memset(node->name, '\0', sizeof('a'));
  node->name[0] = 'a';
  node->num = 2;
  node->children = children1;


  PrintTree(gap, node);


  return 0;
}