樹是一種非線性的資料結構
樹是由 n ( n ≥0 ) 個結點組成的有限集合
如果 n = 0,稱為空樹;
如果 n > 0,則:
有乙個特定的稱之為根(root)的結點,它只有直接後繼,但沒有直接前驅
除根以外的其它結點劃分為 m (m ≥0) 個互不相交的有限集合t0,t1,…,tm-1,每個集合又是一棵樹,並且稱之為根的子樹(subtree)
error.h
#ifndef __error_h__
#define __error_h__
#define true 1
#define false 0
#define error -1
#define malloc_error -2
int errno;
void myerror(char * str);
char * mystrerror(int num);
#endif //__error_h__
error.c
#include "error.h"
#include void myerror(char * str)
char * mystrerror(int num)
}
tree.h
#ifndef __tree_h__
#define __tree_h__
#include "error.h"
struct _treenode;
typedef struct _childnode
childnode;
typedef char treedata;
typedef struct _treenode
treenode;
typedef struct _tree
tree;
//建立樹
tree * create_tree();
//插入樹
int insert_tree(tree * tree, treedata data, int pos);
//列印樹
void display(tree * tree);
//刪除結點
void delete(tree * tree, int pos);
#endif //__tree_h__
tree.c
#include #include #include "tree.h"
tree * create_tree()
tree->head = (treenode *)malloc(sizeof(treenode)/sizeof(char));
if (tree->head == null)
tree->head->parent = null;
tree->head->childlist = null;
tree->head->next = null;
tree->len = 0;
return tree; }/*
treedata data;
struct _treenode *parent; // 指向父節點的指標 11111111111
struct _treenode *next; // 指向鍊錶的下乙個結點
struct _childnode *childlist; // 孩子鍊錶的頭節點
int degree; // 結點的度
typedef struct _childnode
childnode;
*///插入樹
int insert_tree(tree *tree, treedata data, int pos)
if (pos != 0 && pos == tree->len)
// 新建結點
treenode* node = (treenode*)malloc(sizeof(treenode)/sizeof(char));
if (node == null)
node->data = data;
node->next = null;
// 建立該新節點的孩子結點鍊錶的頭節點
node->childlist = (childnode*)malloc(sizeof(childnode)/sizeof(char));
if (node->childlist == null)
node->childlist->next = null;
node->childlist->childnode = null;
node->degree = 0;
int i;
// 找父節點
treenode* parent = tree->head->next; // 當前樹節點的第乙個結點
for (i = 0; i < pos; i++)
node->parent = parent;
// 在父親結點的子結點鍊錶中加入乙個結點
if (parent != null)
childnode->childnode = node;
childnode->next = null;
// 加入到父親結點子結點鍊錶當中
childnode* tmp = parent->childlist; // 子結點鍊錶的頭節點
while (tmp->next)
tmp = tmp->next;
tmp->next = childnode;
parent->degree += 1; }
treenode* tmp = tree->head; // 樹節點鍊錶的頭節點
while (tmp->next)
tmp = tmp->next;
tmp->next = node;
tree->len += 1;
return true;
}void r_display(treenode* node, int gap)
printf ("%c\n",node->data);
childnode * child = node->childlist->next;
while(child) }
//列印樹
void display(tree * tree)
void r_delete(tree * tree, treenode * node)
//刪除結點
void delete(tree * tree, int pos)
if (pos != 0 && tree->len == pos)
int i;
treenode * current = tree->head->next;
for (i = 0; i < pos ; i++)
*x = current->data;
r_delete(tree,current);
return true;
}int tree_clear(tree * tree)
treedata x;
return delete (tree, 0,&x);
}
main.c
#include #include "tree.h"
int main()
insert_tree(tree, 'a', 0);
insert_tree(tree, 'b', 0);
insert_tree(tree, 'c', 0);
insert_tree(tree, 'd', 0);
insert_tree(tree, 'e', 1);
insert_tree(tree, 'f', 1);
insert_tree(tree, 'h', 3);
insert_tree(tree, 'i', 3);
insert_tree(tree, 'j', 3);
display(tree);
return 0;
}
rand srand的實現機制
rand和srand是用於產生偽隨機數的兩個函式,根據參考手冊rand的返回值是在 0,rand max 之間的資料,rand max在不同的系統中數值有所不同。以下是rand和srand實現方式的乙個示例 假定rand max為32767 static unsigned long next 1 r...
Workqueue機制的實現
workqueue機制的實現 2012 02 05 22 18 標籤 workqueue 分類 linux裝置驅動模型 workqueue機制中定義了兩個重要的資料結構,分析如下 cpu workqueue struct結構。該結構將cpu和核心執行緒進行了繫結。在建立workqueue的過程中,l...
SPRING MVC的實現機制
spring mvc 的相關概念 dispatcherservlet 前端控制器,也是整個架構的核心,負責處理和分發請求。handleradapter 對於不同型別的控制器,該類負責把handler請求處理的結果統一轉換成modelandview。modelandview 包含資料和檢視的資訊,一般...