//標頭檔案 tree.h
#ifndef _tree_h_
#define _tree_h_
#define false 0
#define true 1
typedef _treenode;
typedef struct _childnode //孩子結點型鍊錶
childnode;
typedef char treedata; //樹結點型別
typedef struct _treenode
treenode;
typedef struct _tree
tree;
//定義乙個函式指標型別
typedef void (*treeprint)(treenode *node);
tree *create_tree();
//pos 要插入父結點
int insert_tree(tree *tree,treedata data,int pos);
void display (tree *tree,treeprint pfunc);
#endif //_tree_h_
//函式源** tree.c
#include "tree.h"
#include tree *create_tree()
//建立樹結點鍊錶的頭結點
tree->head = (treenode *)malloc(sizeof(treenode) / sizeof(char));
if(tree->head == null)
//給元素賦值
tree->head->parent = null;
tree->head->next = null;
tree->head->childlist = null;//置空,樹中沒有結點
tree->len = 0;
return tree;
}// pos 代表要插入結點父親結點的位置
int insert_tree(tree *tree,treedata data,int pos)
if(pos != 0 && tree->len == pos)
//新建結點
treenode *node = (treenode *)malloc(sizeof(treenode) / sizeof(char));
if(node == null)
node->data = data;
node->next = null;
//建立node結點的孩子結點鍊錶的頭結點
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加入到父結點node的孩子鍊錶中
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,treeprint pfunc) //遞迴列印結點
//列印結點自己
pfunc(node);
childnode *child = node->childlist->next;//該節點的第乙個孩子結點
//用遞迴列印結點孩子
while(child) }
void display(tree *tree,treeprint pfunc)//列印樹
//主函式 mani.c
#include #include "tree.h"
void printa(treenode *node)
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);
display(tree,printa);
return 0;
}
樹的遍歷與列印
樹的遍歷與列印 樹的遍歷有三種方法,先 中 後序遍歷。這三種方法都是以子樹的根節點作為參照系的,比如先序的意思就是把先列印根節點,中 後序以此類推。遍歷演算法的核心思想是遞迴,這不是偶然的,本質上是因為樹結構的定義就是 遞 歸 的。樹的定義 1 樹是有限點的集合 2 有且只有乙個根節點 3 集合中其...
廣義表的建立與列印
廣義表的建立與列印 本文取自 資料結構與演算法 c語言版 第三版 出版社是清華大學出版社。本博文作為學習資料整理。源 是vc 6.0上可執行程式,我挪到了vs2010中執行。在vs2010中新建c win32 控制台應用程式專案,建立結果截圖 1.廣義表的建立 廣義表的儲存結構示意圖 示例 c x,...
樹的遍歷與列印二
先中後序遍歷遞迴的性質造成遍歷時總是 貪婪 的,肯定會一條路走到底,再回溯,而層序遍歷並不需要我們這樣,層序遍歷需要我們 走走停停 所以層序遍歷肯定不能遞迴實現,那如何實現呢?以上圖為例,遍歷10,8,12沒有問題,它們分別是root,root.left,root.right。然後我們希望列印6,9...