linux核心中多處用到孩子兄弟結構來組織一些相同型別的資料。如task_struct,dentry,vfs_mount等,結構圖如下:
實現原理很簡單,主要有三個字段:
parent:指向父結構的指標
children:子結構鍊錶的頭
sibling:將自己連線到父節點的子結構鍊錶中。
結構定義如下:
typedef struct _list list_t;
typedef struct _mutilist mutilist_t;
函式宣告:
void mutilist_addson (mutilist_t *node, int data);
mutilist_t* mutilist_getson (mutilist_t *node);
mutilist_t* mutilist_getparent (mutilist_t *node);
mutilist_t* mutilist_getbrother (mutilist_t *node);
#define get_ptr(_t,_m,_p) (_t*)((unsigned long)_p-((unsigned long)(&((_t*)0)->_m)))
函式實現:
#include "mutilist.h"
#include #include void mutilist_addson (mutilist_t *node, int data)
node->children.post = &son->sibling;
son->sibling.prev = &node->children;
son->children.prev = 0;
son->children.post = 0;
}mutilist_t* mutilist_getson (mutilist_t *node)
return get_ptr(mutilist_t,sibling,node->children.post);
}mutilist_t* mutilist_getparent (mutilist_t *node)
return node->parent;
}mutilist_t* mutilist_getbrother (mutilist_t *node)
return get_ptr(mutilist_t,sibling,node->sibling.post);
}void display (mutilist_t *node, int index)
for (i = 0; i < index; ++i)
printf ("%d\n",node->val);
if (node->children.post)
if (node->sibling.post)
}
測試:
int main (void)
輸出:
兄弟孩子變變變 二叉樹森林樹的轉換
樹轉換為二叉樹 兄弟變為子子孫孫個右孩子 1 加線。在所有兄弟結點之間加一條連線。2 去線。樹中的每個結點,只保留它與第乙個孩子結點的連線,刪除它與其它孩子結點之間的連線。3 層次調整。以樹的根節點為軸心,將整棵樹順時針旋轉一定角度,使之結構層次分明。注意第乙個孩子是結點的左孩子,兄弟轉換過來的孩子...
C語言實現實現樹和森林(孩子兄弟表示法)
因為樹和森林都可以與二叉樹相互轉化,所以採用二叉鍊錶的儲存方式表示樹和森林容易在計算機中實現 共有10個節點,則有11個空指標 fristchild指向該結點的第乙個孩子節點,nextsibling指向該結點的兄弟節點。雖然類似於二叉樹的左右孩子節點指標,但是功能不同 define elemtype...
樹的儲存結構 雙親表示法 孩子表示法 孩子兄弟法
實現 定義結構陣列存放樹的結點,每個結點包含兩個域 結點結構 結點型別定義 typedef struct ptnode ptnode 另外,用r儲存根結點的下標,用n表示結點個數 樹的雙親表示法示例 樹結構型別定義 define max tree size 100 typedef struct pt...