SOGO論壇
  登入   註冊   找回密碼
查看: 437|回覆: 0
列印 上一主題 下一主題

[技術文章] Tree -- 多元樹 (作為 C0C 編譯器的語法樹) [複製連結]

Rank: 11Rank: 11Rank: 11Rank: 11

熱心參予論壇活動及用心回覆主題勳章 數位硬體勳章

狀態︰ 離線
跳轉到指定樓層
1
發表於 2012-7-11 00:22:26 |只看該作者 |倒序瀏覽

檔案:Tree.h

#ifndef TREE_H
#define TREE_H

#include "Array.h"

typedef struct {
  char *type;
  char *value;
  Array* childs;
} Tree;

Tree* TreeNew(char *pType, char *pValue);
void TreeFree(Tree *tree);
void TreeAddChild(Tree *tree, Tree *child);
void TreePrint(Tree *tree);

#endif

檔案:Tree.c

#include <stdio.h>
#include "Tree.h"

Tree *TreeNew(char *type, char *value) {
  ASSERT(type != NULL && value != NULL);
  Tree *rzTree = ObjNew(Tree, 1);
  rzTree->type = (void*) newStr(type);
  rzTree->value = (void*) newStr(value);
  rzTree->childs = NULL;
//  printf("TreeNew(%s,%s)\n", type, value);
//  printf("address of tree->type=%d, tree->value=%d\n", rzTree->type, rzTree->value);
  return rzTree;
}

void TreeFree(Tree *tree) {
  if (tree == NULL) return;
  freeMemory(tree->type);
  freeMemory(tree->value);
  if (tree->childs != NULL) {
    int i;
    for (i=0; i<tree->childs->count; i++)
      TreeFree(tree->childs->item[i]);
    ArrayFree(tree->childs, NULL);
  }
  ObjFree(tree);
}

void TreeAddChild(Tree *tree, Tree *child) {        // 在樹中加入一個新的子樹。
  ASSERT(tree != NULL && child != NULL);
  if (tree->childs == NULL)
    tree->childs = ArrayNew(1);
  ArrayAdd(tree->childs, child);
}

void TreePrintLevel(Tree *tree, int level) { // 將該樹列印出來。
  ASSERT(tree != NULL && tree->type != NULL);
//  printf("address of tree->type=%d, tree->value=%d\n", tree->type, tree->value);
  printf("%s+%s\t = %s\n", strSpaces(level), tree->type, tree->value);
  if (tree->childs != NULL) {
    int i;
    for (i=0; i<tree->childs->count; i++)
      TreePrintLevel(tree->childs->item[i], level + 1);
    printf("%s-%s\n", strSpaces(level), tree->type);
  }
}

void TreePrint(Tree *tree) {
  TreePrintLevel(tree, 0);
}

喜歡嗎?分享這篇文章給親朋好友︰
               感謝作者     

請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


本論壇為非營利自由討論平台,所有個人言論不代表本站立場。文章內容如有涉及侵權,請通知管理人員,將立即刪除相關文章資料。侵權申訴或移除要求:abuse@oursogo.com

GMT+8, 2024-6-18 14:38

© 2004-2024 SOGO論壇 OURSOGO.COM
回頂部