樹的實現機制

2021-08-05 19:29:09 字數 4167 閱讀 2087

樹是一種非線性的資料結構

樹是由 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 包含資料和檢視的資訊,一般...