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

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

?? library.cpp

?? b樹的C++實現,運用模板實現B樹 簡單明了
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/*
題目:設計一個圖書管理系統
要求:
1、每種書的登錄內容為:書號、書名、著者、存量狀態;
2、所有的業務活動是通過書號進行,用B樹對書號建立索引;
3、系統的功能如下
⑴ 采編入庫,
⑵ 清除庫存,
⑶ 借閱,
⑷ 歸還,
⑸ 顯示。
說明:以5階B樹為例。 
*/
#include <iostream>
#include <string>
#include <Queue>
using namespace std;

class Book
{
	friend bool operator<(const Book &left,const Book &right);
	friend bool operator>(const Book &left,const Book &right);
	friend bool operator==(const Book &left,const Book &right);
	friend ostream& operator<<(ostream & os,const Book &right);

public:
	Book()
	{
		this->amount = 0;
		this->author = "";
		this->bookName = "";
		this->bookNumber = "";
		this->state = false;
	}

	Book(string bookNumber,string bookName,string author,int amount)
		:bookNumber(bookNumber),bookName(bookName),author(author),amount(amount)
	{
		if(amount > 0)
		{
			this->state = true;
		}
	}

	int get_amount() const;
	void set_amount(int num);
	string get_number() const;
	string get_name() const;
	string get_author() const;
	bool get_state() const;
	void set_state(bool state);
private:
	string bookNumber;
	string bookName;
	string author;
	bool state;
	int amount;
};


int Book::get_amount() const
{
	return amount;
}

void Book::set_amount(int num)
{
	amount = num;
}

string Book::get_author() const
{
	return author;
}

string Book::get_name() const
{
	return bookName;
}

string Book::get_number() const
{
	return bookNumber;
}

bool Book::get_state() const
{
	return state;
}

void Book::set_state(bool State)
{
	state = State;
}

bool operator<(const Book &left,const Book &right)
{
	return left.bookNumber < right.bookNumber;
}

bool operator>(const Book &left,const Book &right)
{
	return left.bookNumber > right.bookNumber;
}

bool operator==(const Book &left,const Book &right)
{
	return left.bookNumber == right.bookNumber;
}

ostream& operator<<(ostream& os,const Book &right)
{
	os<<right.get_number()<<'\t'<<right.get_name()<<'\t'<<right.get_author()<<'\t'<<right.get_amount()<<'\t';
	if(right.get_state() == false)
	{
		os<<"借出"<<endl;
		//cout<<right.get_amount()<<endl;
	}
	if(right.get_state()  == true)
	{
		os<<"在館"<<endl;
		//cout<<right.get_amount()<<endl;
	}
	return os;
}

enum Error_code{success,not_present,overflow,duplicate_error,already_in,already_out,error};

template<class Type,int order>
struct B_node
{
	B_node()
	{
		count = 0;
	}
	int count;
	Type data[order - 1];
	B_node<Type,order> *branch[order];
};

template<class Type,int order>
class B_tree
{
public:
	B_tree()
	{
		root = NULL;
	}
	Error_code search_node(B_node<Type,order> *current,const Type &target,int &position);//ensure if the target is in the current node
	Error_code recursive_search_tree(B_node<Type,order> *current,Type &target);
	Error_code search_tree(Type &target);
	Error_code insert(const Type &new_entry);
	Error_code push_down(B_node<Type,order> *current,const Type &new_entry,Type &median,B_node<Type,order> *&right_branch);
	void push_in(B_node<Type,order> *current,const Type &entry,B_node<Type,order> *right_branch,int position);//insert if it has extra spaces
	void split_node(B_node<Type,order> *current,const Type &extra_entry,B_node<Type,order> *extra_branch,int position,B_node<Type,order> *&right_half,Type &median);
	
	void remove_data(B_node<Type,order> *current,int position);
	void copy_in_predecessor(B_node<Type,order> *current,int position);
	void restore(B_node<Type,order> *current,int position);
	void move_left(B_node<Type,order> *current,int position);
	void move_right(B_node<Type,order> *current,int position);
	void combine(B_node<Type,order> *current,int position);
	Error_code recursive_remove(B_node<Type,order> *current,const Type &target);
	Error_code remove(const Type &target);

	void level_scan(B_node<Type,order>* root);
	void recursive_inorder(B_node<Type,order>* root);

	B_node<Type,order>*&GetRoot()
	{
		return root;
	}
	
	Error_code borrow(const Type &target,int number);
	Error_code recursive_borrow(B_node<Type,order> *current,const Type &target,int number);
	Error_code return_book(const Type &target,int number);
	Error_code recursive_return(B_node<Type,order> *current,const Type &target,int number);
	virtual ~B_tree(){}
private:
	B_node<Type,order> *root;
};

//插入部分
template<class Type,int order>
Error_code B_tree<Type,order>::search_node(B_node<Type,order> *current,const Type &target,int &position)
{
	position = 0;
	while(position < current->count && target > current->data[position])
		position++;
	if(position < current->count && target == current->data[position])
		return success;
	else
		return not_present;
}

template<class Type,int order>
Error_code recursive_search_tree(B_node<Type,order> *current,Type &target)
{
	Error_code result = not_present;
	int position;
	if(current != NULL)
	{
		result = search_node(current,target,position);
		if(result == not_present)
			result = recursive_search_tree(current->branch[position],target);//遞歸轉到子節點
		else
			target = current->data[position];
	}
	return result;
}

template<class Type,int order>
Error_code B_tree<Type,order>::search_tree(Type &target)
{
	return recursive_search_tree(root,target);
}

template<class Type,int order> //insert if it has extra spaces
void B_tree<Type,order>::push_in(B_node<Type,order> *current,const Type &entry,B_node<Type,order> *right_branch,int position)
{
	//cout<<current->count<<endl;
	for(int i = current->count;i > position;i--)
	{
		current->data[i] = current->data[i-1];
		current->branch[i+1] = current->branch[i];
	}
	current->data[position] = entry;
	current->branch[position+1] = right_branch;
	current->count++;
}

template<class Type,int order>
void B_tree<Type,order>::split_node(B_node<Type,order> *current,const Type &extra_entry,B_node<Type,order> *extra_branch,int position,B_node<Type,order> *&right_half,Type &median)
{
	right_half = new B_node<Type,order>;
	int mid = order / 2;
	if(position <= mid)
	{
		for(int i = mid;i < order-1;i++)
		{
			right_half->data[i-mid] = current->data[i];
			right_half->branch[i+1-mid] = current->branch[i+1];
		}
		current->count = mid;
		right_half->count = order-1-mid;
		push_in(current,extra_entry,extra_branch,position);
	}
	else
	{
		mid++;
		for(int i = mid;i < order-1;i++)
		{
			right_half->data[i-mid] = current->data[i];
			right_half->branch[i+1-mid] = current->branch[i+1];
		}
		current->count = mid;
		right_half->count = order-1-mid;
		push_in(right_half,extra_entry,extra_branch,position-mid);
	}
	median = current->data[current->count-1];//remove median from left half
	right_half->branch[0] = current->branch[current->count];
	current->count--;
}

template<class Type,int order>
Error_code B_tree<Type,order>::push_down(B_node<Type,order> *current,const Type &new_entry,Type &median,B_node<Type,order> *&right_branch)
{
	Error_code result;
	int position;
	if(current == NULL)
	{
		median = new_entry;
		right_branch = NULL;
		result = overflow;
	}
	else
	{
		if(search_node(current,new_entry,position) == success)
		{
			result = duplicate_error;
			cout<<new_entry.get_name()<<" has existed!"<<endl;
			int new_amount = current->data[position].get_amount() + new_entry.get_amount();
			current->data[position].set_amount(new_amount);
			cout<<current->data[position].get_amount()<<endl;
		}
		else
		{
			
			Type extra_entry;
			B_node<Type,order> *extra_branch;
			//cout<<position<<endl;
			result = push_down(current->branch[position],new_entry,extra_entry,extra_branch);
			if(result == overflow)
			{
				if(current->count < order-1)
				{
					result = success;
					push_in(current,extra_entry,extra_branch,position);
					//cout<<position<<endl;
				}
				else 
				{			
					split_node(current,extra_entry,extra_branch,position,right_branch,median);		
					//cout<<position<<endl;		
				}
			}

		}
	}
	return result;
}


template<class Type,int order>
Error_code B_tree<Type,order>::insert(const Type &new_entry)
{
	Type median;
	B_node<Type,order> *right_branch,*new_root;
	Error_code result = push_down(root,new_entry,median,right_branch);
	if(result == overflow)
	{
		new_root = new B_node<Type,order>;
		new_root->count = 1;
		new_root->data[0] = median;
		new_root->branch[0] = root;
		new_root->branch[1] = right_branch;
		root = new_root;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美刺激午夜性久久久久久久| eeuss鲁片一区二区三区| 亚洲欧美国产三级| 久久久亚洲综合| 精品久久久久久久久久久久久久久| 欧美日韩国产小视频| 欧美视频在线播放| 在线观看成人小视频| 色婷婷精品大视频在线蜜桃视频| 91天堂素人约啪| 色哟哟一区二区在线观看 | 亚洲国产精品影院| 亚洲精品视频观看| 亚洲成人综合网站| 亚洲香肠在线观看| 日日夜夜一区二区| 蜜臀av性久久久久av蜜臀妖精| 久久国产夜色精品鲁鲁99| 久久99国产精品尤物| 国产精品18久久久久久久久久久久| 国产麻豆91精品| 91小视频在线免费看| 91国产免费观看| 日韩午夜激情视频| 国产视频一区在线播放| 国产精品久久久久9999吃药| 一区二区三区免费在线观看| 午夜国产不卡在线观看视频| 国产在线精品一区二区不卡了| 成人午夜碰碰视频| 欧美日韩精品免费| 久久综合久久99| 日韩理论片在线| 日韩精品乱码免费| gogo大胆日本视频一区| 欧美精品777| 亚洲国产电影在线观看| 午夜精品久久一牛影视| 国产在线播放一区二区三区| 色综合久久88色综合天天免费| 欧美肥妇毛茸茸| 中文字幕制服丝袜成人av| 亚洲不卡一区二区三区| 国产成人8x视频一区二区| 欧美日韩一区二区在线观看视频| 久久影院午夜论| 一二三四社区欧美黄| 国产成人精品在线看| 欧美三级日韩三级| 欧美国产精品劲爆| 麻豆视频一区二区| 欧美最新大片在线看| 中文字幕 久热精品 视频在线 | 久久久久亚洲蜜桃| 亚洲欧美在线视频观看| 日韩成人av影视| a在线欧美一区| 欧美精品一区二区在线播放| 三级成人在线视频| 日本精品一级二级| 国产精品久久久久aaaa| 久久 天天综合| 欧美日韩国产片| 亚洲精选视频免费看| 成人毛片视频在线观看| 日韩欧美一区二区视频| 亚洲bt欧美bt精品777| 99久久er热在这里只有精品15 | 国产清纯白嫩初高生在线观看91 | 亚洲综合图片区| 国产福利精品一区| 欧美精品一区二区三区在线| 日韩电影在线观看网站| 欧美久久免费观看| 亚洲香蕉伊在人在线观| 色婷婷国产精品| 亚洲欧美电影一区二区| av福利精品导航| 国产精品国产三级国产aⅴ入口 | 2021久久国产精品不只是精品| 日韩专区欧美专区| 欧美一区二区三区免费视频| 午夜精品在线视频一区| 欧美麻豆精品久久久久久| 亚洲va韩国va欧美va| 欧美日韩成人综合| 爽爽淫人综合网网站| 日韩三级免费观看| 极品销魂美女一区二区三区| 国产视频在线观看一区二区三区| 国产精品1区2区| 亚洲日韩欧美一区二区在线| 一本大道av一区二区在线播放| 亚洲激情自拍偷拍| 欧美日韩国产精选| 日本vs亚洲vs韩国一区三区二区| 日韩一区二区免费在线电影| 国产一区二区美女诱惑| 国产精品你懂的在线| 色综合一区二区| 亚洲国产精品影院| 337p日本欧洲亚洲大胆精品| 国产成人自拍网| 一区二区三区四区激情| 欧美一级艳片视频免费观看| 国产成人在线看| 亚洲一区影音先锋| 精品国产91洋老外米糕| 成人a级免费电影| 亚洲成精国产精品女| 日韩精品一区二区三区蜜臀 | 国产精品福利一区| 欧美日韩情趣电影| 国产乱子伦一区二区三区国色天香| 国产三级久久久| 欧美日韩成人激情| 久久国产精品99精品国产| 中文字幕一区二区三中文字幕| 欧美午夜精品理论片a级按摩| 国产一区中文字幕| 亚洲午夜三级在线| 久久精品亚洲精品国产欧美| 欧美四级电影网| 国产suv一区二区三区88区| 亚洲午夜激情网页| 中文字幕一区三区| 精品久久久久久久人人人人传媒| 色婷婷久久久久swag精品 | av在线不卡网| 久久精工是国产品牌吗| 亚洲视频每日更新| 久久久亚洲午夜电影| 欧美丰满少妇xxxxx高潮对白| 成人网在线免费视频| 蜜桃视频在线观看一区二区| 亚洲欧美日韩中文字幕一区二区三区 | 精品久久久久久亚洲综合网| 在线免费精品视频| 成人激情免费视频| 久久精品国产第一区二区三区| 亚洲午夜在线视频| 亚洲天堂免费在线观看视频| 日本一区二区三区视频视频| 精品国产伦一区二区三区观看体验| 色哟哟一区二区在线观看| 成人av在线网| 丁香五精品蜜臀久久久久99网站| 卡一卡二国产精品| 秋霞国产午夜精品免费视频| 天天综合色天天综合色h| 一区二区三区四区不卡视频| 亚洲色图制服诱惑 | 日本中文字幕不卡| 亚洲高清中文字幕| 一区二区三区四区在线播放| 亚洲欧美日韩久久精品| 亚洲日本青草视频在线怡红院| 亚洲国产成人午夜在线一区| 国产欧美一区二区精品秋霞影院 | 色婷婷久久99综合精品jk白丝| av亚洲产国偷v产偷v自拍| 国产成人小视频| 成人开心网精品视频| www.激情成人| 91在线免费看| 91麻豆精东视频| 在线免费亚洲电影| 欧美伦理电影网| 欧美成人精品二区三区99精品| 精品国产一区二区国模嫣然| 欧美精品一区二区三| 国产亚洲综合性久久久影院| 国产精品理论在线观看| 亚洲乱码国产乱码精品精可以看| 亚洲综合无码一区二区| 日韩激情av在线| 国产精品亚洲视频| 91小视频在线观看| 7777精品伊人久久久大香线蕉的| 欧美久久久久久蜜桃| 精品国产乱码久久久久久影片| 亚洲国产高清在线| 一区二区三区四区乱视频| 日日欢夜夜爽一区| 国产成人av电影在线观看| 色综合久久久久综合99| 欧美一区二区三区公司| 久久久久久久一区| 亚洲视频每日更新| 麻豆成人久久精品二区三区小说| 国产大片一区二区| 在线免费观看一区| 精品捆绑美女sm三区| 日韩美女视频19| 男人操女人的视频在线观看欧美| 成人国产精品视频| 欧美日韩成人一区二区| 国产精品久线观看视频| 蜜桃视频一区二区三区| 91成人在线免费观看|