⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mynode.cpp

📁 B+树的演示程序
💻 CPP
字号:
// MyNode.cpp : 实现文件
//

#include "stdafx.h"
#include "MyBPlusTree.h"
#include "MyNode.h"


// MyNode
int MyNode::N = MINIMUS_NUMBER_OF_NODE;
int MyNode::M = (MyNode::N + 1)/2;

int MyNode::SetMaxNumber(int n)
{
	if( (n<MINIMUS_NUMBER_OF_NODE) || (n>MAXIMUM_NUMBER_OF_NODE) )
		return -1;
	N = n;
	M = (N+1)/2;
	return 0;
}

MyNode::MyNode()
{	
	m_n = 0;
	m_level = 2;
	// k = NULL;
	// p = NULL;
	for(int i=0;i<N;i++)
	{
		k[i] = 0;
		p[i] = NULL;
	}
	p[N] = NULL;
}

MyNode::~MyNode()
{
}
bool MyNode::Create()
{
	/*
	k = new long[N];
	if(!k)	return false;
	p = new void*[N+1];
	if(!p)	return false;
	for(int i=0;i<N;i++)
	{
		k[i] = 0;
		p[i] = NULL;
	}
	p[N] = NULL;
	*/
	return true;
}
bool MyNode::Release()
{
	/*
	for(int i=0;i<N;i++)
	{
		k[i] = 0;
		p[i] = NULL;
	}
	p[N] = NULL;
	if(k)
	{	delete k;	k = NULL;	}
	if(p)
	{	delete p;	p = NULL;	}
	*/
	return true;
}

// MyNode 成员函数
bool MyNode::CreateRoot(long key,MyNode* node1,MyNode* node2)
{
	if(!Create())
		return false;
    m_n = 1;
	m_level = node1->m_level+1;

	k[0] = key;
	p[0] = (void*)node1;
	p[1] = (void*)node2;
	return true;
}

// Search fuction, Node / Leaf 's search.
// return the position of the key(0 - N)
int MyNode::Search(long key)
{
	return -1;
}

// Insert fuction,
int MyNode::Insert(long key,void* pkey,int i)
{
	return -1;
}
int MyNode::SplitNode(MyNode* newNode,int m/*type*/)	// only use when level = 1
{
	return -1;
}

// Delete fuction
int MyNode::Delete(int i)
{
	return -1;
}
long MyNode::GetMinKey(int i/*=0*/)
{
	if( (i < 0)	|| (i > m_n) )	return -1;

	if(m_level == 1)
		return k[0];

	MyNode* temp;
	temp = (MyNode*)p[i];
	while(temp->m_level > 1)
		temp = (MyNode*)temp->p[0];
	return temp->k[0];
}
long MyNode::GetKeyFromLeft(MyNode* left)
{
	return -1;
}
long MyNode::GetKeyFromRight(MyNode* right)
{
	return -1;
}
long MyNode::UniteRight(MyNode* right)
{
	return -1;
}


// MyBranch

MyBranch::MyBranch()
{
	m_level = 2;
}

MyBranch::MyBranch(int level)
{
	m_level = level;
}

MyBranch::~MyBranch()
{
}

// MyBranch 成员函数

// Search fuction, Node / Leaf 's search.
// return the position of the key(0 - N)
int MyBranch::Search(long key)
{
	if(m_level <= 1)
		return -1;

	int i;
	for(i=0;i<m_n;i++)
		if(key < k[i])
			break;
	return i;
}

// Insert fuction,
int MyBranch::Insert(long key,void* pkey,int i)
{
	if(m_level <= 1)
		return -1;

	if( (i < 0)	|| (i > m_n+1) )	return -1;
	if(m_n >= N)	return -1;

	int m = 1;
	// notice here, / insert 0 or \ insert 0
	if( (i == 0) && (key < ((MyNode*)p[0])->k[0]) )
	{
		// insert a node at first position of branch / insert
		p[m_n+1] = p[m_n];
		m = 0;
	}
	else
		i++;

	for(int j=m_n;j>=i;j--)
	{
		k[j-m+1] = k[j-m];
		p[j+1] = p[j];
	}
	k[i-m] = key;
	p[i] = pkey;
	m_n++;
	return i;
}
int MyBranch::SplitNode(MyNode* newNode,int m/*type*/)	// only use when level = 1
{
	if(m_n < N) return -1;
	if(m_level <= 1)	return -1;

	k[M-1] = 0;
	m_n--;
	for(int j=0;j<N-M;j++)
	{
		newNode->k[j] = k[j+M];
		k[j+M] = 0;
		newNode->p[j] = p[j+M];
		p[j+M] = NULL;
		newNode->m_n++;
		m_n--;
	}
	newNode->p[N-M] = p[N];
	p[N] = NULL;

	return j;
}

// Delete fuction
int MyBranch::Delete(int i)
{
	if(m_level == 1)
		return -1;	
	
	if( (i < 0)	|| (i > m_n) )	return -1;

	int m;
	m = (i == 0) ? 0 : 1;

	for(int j=i;j<m_n;j++)
	{
		k[j-m] = k[j-m+1];
		p[j] = p[j+1];
	}
	if(i == 0)
		p[m_n-1] = p[m_n];
	p[j] = NULL;
	k[j-m] = 0;
	m_n--;
	return i;
}

long MyBranch::GetKeyFromLeft(MyNode* left)
{
	if(m_level == 1)
		return -1;

	long key;
	key = GetMinKey();
	
	p[m_n+1] = p[m_n];
	for(int j=m_n;j>0;j--)
	{
		k[j] = k[j-1];
		p[j] = p[j-1];
	}
	k[0] = key;
	p[0] = left->p[left->m_n];
	m_n++;

	// Insert(key,leftNode->p[leftNode->my_num],0);
	left->Delete(left->m_n);

	return key;
}
long MyBranch::GetKeyFromRight(MyNode* right)
{
	if(m_level == 1)
		return -1;

	long key;
	key = right->GetMinKey();

	// Insert(key,rightNode->p[0],my_num);
	k[m_n] = key;
	p[m_n+1] = right->p[0];
	m_n++;
	right->Delete(0);

	return key;
}

long MyBranch::UniteRight(MyNode* right)
{
	if(m_level == 1)
		return -1;

	int num = m_n;
	long key = right->GetMinKey();
	
	k[num] = key;
	p[num+1] = right->p[0];
	m_n++;
	
	for(int j=0;j<right->m_n;j++)
	{
		k[num+1+j] = right->k[j];
		p[num+2+j] = right->p[j+1];
		m_n++;
	}	
	return key;
}

// MyLeaf

MyLeaf::MyLeaf()
{
	m_level = 1;
	m_next = NULL;
}

MyLeaf::~MyLeaf()
{
}


// MyLeaf 成员函数

// Search fuction, Node / Leaf 's search.
int MyLeaf::Search(long key)	// return the position of the key(0 - N), -1 is error or no key
{
	if(m_level > 1)	return -1;

	int i;
	for(i=0;i<m_n;i++)
		if(key <= k[i])	break;
	return i;
}

// Insert fuction,
int MyLeaf::Insert(long key,void* pkey,int i)	// return position of noed (0 - N), -1 is error.
{
	if(m_level > 1)	return -1;
	if(m_n >= N)	return -1;
	if( (i < 0)	|| (i > m_n) )	return -1;

	for(int j=m_n;j>i;j--)
	{
		k[j] = k[j-1];
		p[j] = p[j-1];
	}
	k[i] = key;
	p[i] = pkey;
	m_n++;
	return i;
}
// you should new the Leaf or Node in the BPlusTree class.
int MyLeaf::SplitNode(MyNode* newNode,int m/*type*/)	// only use when level = 1
{
	if(m_level > 1)	return -1;
	if( (m != 0) && (m != 1) )	return -1;

	for(int j=0;j<N-M+m;j++)
	{
		newNode->k[j] = k[j+M-m];
		k[j+M-m] = 0;
		newNode->p[j] = p[j+M-m];
		p[j+M-m] = NULL;
		newNode->m_n++;
		m_n--;
	}
	((MyLeaf*)newNode)->m_next = m_next;
	m_next = (MyLeaf*)newNode;
	return j;
}

// Delete fuction
int MyLeaf::Delete(int i)
{
	if(m_level > 1)	return -1;
	if( (i < 0)	|| (i >= m_n) )	return -1;

	for(int j=i;j<m_n;j++)
	{
		k[j] = k[j+1];
		p[j] = p[j+1];
	}
	k[j] = 0;
	p[j] = NULL;

	m_n--;
	return i;
}
long MyLeaf::GetKeyFromLeft(MyNode* left)
{
	if(m_level > 1)	return -1;

	long key;
	key = left->k[left->m_n-1];

	Insert(key,left->p[left->m_n-1],0);
	left->Delete(left->m_n-1);

	return key;
}
long MyLeaf::GetKeyFromRight(MyNode* right)
{
	if(m_level > 1)	return -1;

	long key;
	key = right->k[0];

	Insert(key,right->p[0],m_n);	
	right->Delete(0);

	return key;
}
long MyLeaf::UniteRight(MyNode* right)
{
	if(m_level > 1)	return -1;

	for(int j=0;j<right->m_n;j++)
		Insert(right->k[j],right->p[j],m_n);
	m_next = ((MyLeaf*)right)->m_next;
	return right->k[0];
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -