亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tree.h

?? CAN__組建現場總線系統設計技術(光盤)
?? H
?? 第 1 頁 / 共 3 頁
字號:
/* 

   $Id: tree_msvc.hh,v 1.3 2002/05/28 11:53:25 t16 Exp $

	STL-like templated tree class.
	Copyright (C) 2001  Kasper Peeters <k.peeters@damtp.cam.ac.uk>

   Microsoft VC version by Jason Avinger, see 

      http://www.damtp.cam.ac.uk/user/kp229/tree/

   for the original.

	This program is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; version 2.
	
	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.
	
	You should have received a copy of the GNU General Public License
	along with this program; if not, write to the Free Software
	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
	
*/
// it++ 沒有定義。只定義了 ++it
#ifndef tree_hh_
#define tree_hh_

#include <cassert>
#include <memory>
#include <stdexcept>
#include <iterator>
#include <set>

#ifdef _MSC_VER // MSVC does not have HP style construct/destroy 

//p指向的T1型變量的值賦為val
template <class T1, class T2>
inline void constructor(T1* p, T2& val) 
{
	new ((void *) p) T1(val);
	/*
	 * new 作用
	 *  if(p) *p = T1(val);
	 */
}

template <class T1>
inline void constructor(T1* p) 
{
	new ((void *) p) T1;
}

template <class T1>
inline void destructor(T1* p)
{
	p->~T1();
}
#else
	#define constructor std::construct
	#define destructor  std::destroy
#endif

//節點
template<class T>
struct tree_node_ {
	tree_node_<T> *parent;//父節點
	tree_node_<T> *first_child, *last_child;//子節點
	tree_node_<T> *prev_sibling, *next_sibling;//兄弟節點
	T data;//數據
};

template <class T, class tree_node_allocator = std::allocator<tree_node_<T> > >
class tree
{
protected:
	typedef tree_node_<T> tree_node;
public:
	typedef T value_type;

	class iterator;
	class sibling_iterator;//兩種iterator

	//******************* 構造和析構函數 ***********************
//structor & destructor
	tree(){
		head_initialise_();
	}
	~tree(){
		clear();
		alloc_.deallocate(head,1);
	}
	tree(const tree<T, tree_node_allocator>& other){
		head_initialise_();
		copy_(other);
	}
//
	void operator=(const tree<T, tree_node_allocator>& other){
		copy_(other);
	}
	//*********************************************************

	//--------------------------class iterator------------------------
	class iterator
	{ 
	public:
		typedef T                          value_type;
		typedef T*                         pointer;
		typedef T&                         reference;
		typedef size_t                     size_type;
		typedef ptrdiff_t                  difference_type;
		typedef std::bidirectional_iterator_tag iterator_category;

	//*********** 構造函數和析構函數 *************************************
		//不指向任何節點
		iterator(): node(0), skip_current_children_(false){
		}

		//node指向tn
		iterator(tree_node *tn): node(tn), skip_current_children_(false){
		}

		//指向other.node
		//如果node==0,則...
		iterator(const sibling_iterator& other):
			node(other.node), skip_current_children_(false){
			if(node==0) {//這種情況的發生是由于
				node=other.range_last();
				skip_children();
				increment_();
			}
		}

	//********** 位移操作 ************************************************
		//只要存在樹,就不會出錯,也就是說 this->node != 0
		//因此不要企圖使用 it!=0 來作為遍歷結束條件,一定要用 it!=end()
		iterator&  operator++(void){
			if(!increment_()) {//如果失敗,node一定會是0的,不用再賦值了
				node=0;
			}
			return *this;
		}

		//向前
		iterator&  operator--(void){
			if(!decrement_()) {
				node=0;
			}
			return *this;
		}

		iterator&  operator+=(unsigned int num){
			while(num>0) {
				++(*this);
				--num;
			}
			return (*this);
		}

		iterator&  operator-=(unsigned int num){
			while(num>0) {
				--(*this);
				--num;
			}
			return (*this);
		}

		iterator   operator+(int num) const{
			iterator ret(*this);
			while(num>0) {
				++ret;
				--num;
			}
			return ret;
		}
	//********************* 獲取數據 ***********************************
		//獲取的是引用
		T&  operator*(void) const{
			return node->data;
		}

		//獲取的是指針
		T*  operator->(void) const{
			return &(node->data);
		}

	//********************* 兩個iterator關系 ***********************
		// 兩個iterator是否指向相同的節點?
		bool  operator==(const iterator& other) const{
			if(other.node==node) return true;
			else return false;
		}

		// 兩個iterator是否指向不同的節點?
		bool  operator!=(const iterator& other) const{
			if(other.node!=node) return true;
			else return false;
		}


		//返回子節點。如果不存在子節點,則ret.node == 0
		sibling_iterator begin() const{
			sibling_iterator ret(node->first_child);
			ret.parent_=node;
			return ret;
		}

		//構造一個不指向節點的iterator
		sibling_iterator end() const{
			sibling_iterator ret(0);
			ret.parent_=node;
			return ret;
		}

	//******************** 其他 ********************************
		// do not iterate over children of this node
		void skip_children(){
			skip_current_children_=true;
		}

		//iterator是否指向樹節點?
		bool is_valid() const{
			if(node==0) return false;
			else return true;
		}

		//直接子節點的個數
		unsigned int number_of_children() const{
			tree_node *pos=node->first_child;
			if(pos==0) return 0;
			
			unsigned int ret=1;
			while(pos!=node->last_child) {
				++ret;
				pos=pos->next_sibling;
			}
			return ret;
		}

	//********************** 封裝的數據 ********************
		tree_node *node;//指向樹節點


	private:
		//如果有下一個節點,則返回true,并且node指向它
		//何時才返回false?只有當head==0
		//skip_current_children_作用:
		//  為false時,如果有子節點,則指向子節點;如果有兄弟節點,則為兄弟節點;否則回溯
		//  為true時,肯定不訪問子節點
		// 有一個問題:
		//    設skip_current_children == false
		//              head<---->root1<---->root2<---->head
		//							/\
		//						   /  \
		//						  a    b
		//	  node當前值指向b,則執行后node指向root2
		//	  再執行一次將指向head!!!!
		//
		bool increment_(){//這個函數執行后,skip_current_children==false
			assert(node!=0);
			//如果不跳過子節點并且存在子節點,則指向第一個子節點
			if(!skip_current_children_ && node->first_child) {
				node=node->first_child;
				return true;
			}
			else{
				skip_current_children_=false;
				while(!node->next_sibling){//沒有兄弟節點,回溯
					node=node->parent;
					if(node==0)
						return false;
				}
				node=node->next_sibling;//由于是pre-order,優先訪問本節點,再訪問子節點
				return true;
			}
		}

		bool decrement_(){
			assert(node!=0);
			//若是樹根
			if(node->parent==0) {
				if(node->last_child==0)
					node=node->prev_sibling;
				while(node->last_child)
					node=node->last_child;
				if(!node) return false;
			}
			//不是樹根
			else {
				//如果存在前趨
				if(node->prev_sibling) {
					if(node->prev_sibling->last_child) {
						node=node->prev_sibling->last_child;
					}
					else {
						node=node->prev_sibling;
					}
				}
				//不存在前趨
				else {
					node=node->parent;
					if(node==0)
						return false;
				}
			}
			return true;
		}

		bool skip_current_children_;
	};
	//---------------------end of class iterator------------------

	//--------------------sibling_iterator------------------------

	/******************
	*對于 sibling_iterator,node==0是正常的
	*
	******************/
	class sibling_iterator
	{
		friend class tree<T, tree_node_allocator>;
//		friend class tree<T, tree_node_allocator>::iterator;
	public:
		typedef T                          value_type;
		typedef T*                         pointer;
		typedef T&                         reference;
		typedef size_t                     size_type;
		typedef ptrdiff_t                  difference_type;
		typedef std::bidirectional_iterator_tag iterator_category;

	//************** 構造和析構函數 ******************************
		//不指向任何節點
		sibling_iterator(): node(0), parent_(0){
		}

		//指向 tn,并且設置parent_指向tn的父節點
		sibling_iterator(tree_node *tn): node(tn){
			set_parent_();
		}

		//將other的值拷貝過來
		sibling_iterator(const sibling_iterator& other):
			node(other.node), parent_(other.parent_){
		}

		sibling_iterator(const iterator& other): node(other.node){
			set_parent_();
		}

	//************** 位移操作 ************************************
		//如果已到最后一個兄弟節點的后面,這移不了
		sibling_iterator&  operator++(void){
			if(node)
				node=node->next_sibling;
			return *this;
		}

		//如果已到最前一個兄弟節點的前面,移不了
		sibling_iterator&  operator--(void){
			if(node)
				node=node->prev_sibling;
		/*  comment by zychen
			else{
				assert(parent_);//也就是說head的兄弟節點...
				node=parent_->last_child;
			}
		*/
			return *this;
		}

		sibling_iterator&  operator+=(unsigned int num){
			while(num>0) {
				++(*this);
				--num;
			}
			return (*this);
		}

		sibling_iterator&  operator-=(unsigned int num){

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美在线视频| 欧美裸体一区二区三区| 中文字幕不卡三区| 成人综合婷婷国产精品久久蜜臀| 国产亚洲一区字幕| 不卡影院免费观看| 亚洲精品中文字幕乱码三区| 在线观看国产日韩| 日本欧洲一区二区| 久久久亚洲综合| 成人毛片老司机大片| 亚洲精品五月天| 91精品在线免费观看| 国产一区二区不卡在线| 亚洲视频1区2区| 欧美日韩黄色一区二区| 麻豆91在线看| 国产精品看片你懂得| 欧美日韩国产影片| 国产在线不卡一区| 亚洲六月丁香色婷婷综合久久| 欧美三级电影网| 国产精品1区二区.| 亚洲女人的天堂| 日韩午夜av一区| 不卡高清视频专区| 婷婷成人激情在线网| 国产亚洲视频系列| 欧美日韩在线一区二区| 国内不卡的二区三区中文字幕 | 欧美激情一区二区三区| 91性感美女视频| 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲视频你懂的| 在线不卡的av| 99久久777色| 久久精品国产亚洲高清剧情介绍| 亚洲私人黄色宅男| 久久综合久久久久88| 欧美性受xxxx| 成人精品视频.| 奇米色777欧美一区二区| 日韩毛片视频在线看| 亚洲精品一区二区三区蜜桃下载| 色视频欧美一区二区三区| 久久av资源网| 亚洲国产成人精品视频| 国产精品久久三| 日韩欧美国产高清| 欧美中文字幕一区| av电影天堂一区二区在线观看| 久久国产成人午夜av影院| 亚洲一区在线观看视频| 国产精品美女久久久久久久久| 欧美www视频| 欧美精品自拍偷拍| 一本大道久久精品懂色aⅴ| 国产成人综合精品三级| 老司机午夜精品| av中文字幕在线不卡| 国产精品自在欧美一区| 奇米精品一区二区三区在线观看| 一级做a爱片久久| 中文字幕中文字幕一区| 中文字幕av一区二区三区| 26uuu另类欧美| 欧美成人精品福利| 日韩欧美国产精品一区| 日韩欧美一区中文| 日韩一区二区在线观看视频播放| 欧美日韩一区二区三区在线看| 色域天天综合网| 91免费观看国产| 色综合咪咪久久| 色女孩综合影院| 在线精品视频免费观看| 91成人在线观看喷潮| 91麻豆自制传媒国产之光| av在线播放不卡| 91片在线免费观看| 色吧成人激情小说| 欧美三级在线播放| 欧美喷水一区二区| 欧美一级免费大片| 日韩欧美成人激情| 2017欧美狠狠色| 国产色一区二区| 中文字幕亚洲精品在线观看| 国产精品乱人伦一区二区| 中文字幕欧美一| 一区二区三区在线免费视频| 亚洲一区二区三区影院| 日韩精品久久久久久| 蜜臀久久久99精品久久久久久| 极品少妇xxxx精品少妇偷拍| 91精品国产综合久久蜜臀| 欧美理论片在线| 欧美电影免费观看高清完整版在线观看| 精品三级av在线| 国产精品全国免费观看高清| 亚洲乱码中文字幕| 日韩电影免费在线看| 精品一区二区国语对白| www.一区二区| 欧美日韩国产精品自在自线| 日韩一区二区三区在线视频| 国产日韩欧美在线一区| 亚洲欧美一区二区久久| 日本亚洲三级在线| 东方aⅴ免费观看久久av| 91久久精品一区二区二区| 日韩丝袜情趣美女图片| 中文字幕欧美激情| 亚洲va韩国va欧美va精品| 国产在线视频一区二区三区| 色久综合一二码| 欧美大片免费久久精品三p| 中文字幕一区二区三区蜜月| 石原莉奈在线亚洲三区| 成人精品视频一区| 5858s免费视频成人| 日本一区二区三区免费乱视频| 亚洲国产一区二区三区青草影视| 国产一区二区三区美女| 色哟哟日韩精品| 欧美精品一区二区在线观看| 亚洲自拍另类综合| 国产精品一级二级三级| 欧美日韩一区国产| 中文字幕av不卡| 蜜桃免费网站一区二区三区| 91丨porny丨国产入口| 精品福利在线导航| 亚洲国产欧美在线| 成人高清视频在线观看| 日韩女优毛片在线| 亚洲综合av网| 成人激情小说乱人伦| 欧美电影免费观看高清完整版在线| 亚洲黄色尤物视频| 懂色av一区二区夜夜嗨| 欧美成人官网二区| 五月综合激情婷婷六月色窝| 91网页版在线| 日本一二三不卡| 国产剧情在线观看一区二区| 91麻豆精品国产91久久久更新时间 | 亚洲综合免费观看高清完整版在线| 国产在线精品一区在线观看麻豆| 欧美日韩高清一区二区| 1000精品久久久久久久久| 国产精品亚洲一区二区三区在线| 91精品国产综合久久久久| 一区二区三区四区视频精品免费| 成人免费不卡视频| 国产精品天天看| 国产电影精品久久禁18| 精品国产乱码久久久久久夜甘婷婷 | 日韩高清一区在线| 欧美色网一区二区| 又紧又大又爽精品一区二区| 99精品视频在线观看| 国产精品毛片无遮挡高清| 国产精品综合二区| 国产亚洲欧美日韩日本| 国产精品影视在线观看| 精品国产凹凸成av人导航| 乱中年女人伦av一区二区| 在线播放91灌醉迷j高跟美女| 亚洲成人777| 欧美日韩国产影片| 视频在线在亚洲| 日韩欧美123| 国产伦精品一区二区三区在线观看| 精品噜噜噜噜久久久久久久久试看 | 国产嫩草影院久久久久| 国产激情一区二区三区| 亚洲国产成人自拍| 91小宝寻花一区二区三区| 亚洲婷婷国产精品电影人久久| 99国产精品久| 一级女性全黄久久生活片免费| 欧美视频中文字幕| 日本aⅴ亚洲精品中文乱码| 欧美白人最猛性xxxxx69交| 国产精品一区二区免费不卡| 国产欧美日韩亚州综合| 99久久精品免费看国产免费软件| 亚洲蜜桃精久久久久久久| 欧美日韩在线播| 九九九久久久精品| 国产女主播一区| 91福利在线导航| 蜜臀99久久精品久久久久久软件| 久久理论电影网| 色素色在线综合| 久久av资源站| 亚洲天堂福利av| 日韩午夜电影在线观看| 国产99久久久国产精品潘金网站|