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

📄 mycontrol.cpp

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

#include "stdafx.h"
#include "MyControl.h"
#include "MyBPlusTree.h"
#include "MainFrm.h"

// MyControl
long MyControl::m_lMine[15] = {5,60,53,45,12,3,54,55,1,2,7,6,4,8,10};

MyControl::MyControl()
{
	m_pParentWnd = NULL;
	m_drawKey0 = -1;
	m_drawLevel = 1;
	m_iType = 0;
	m_iInput = 0;
	m_iRandom = 0;
	m_insertPoint = NULL;
	m_bSleep = false;
	m_iNumber = -1;
	m_tree.SetParent((void*)this);
}

MyControl::~MyControl()
{
}


// MyControl 成员函数

bool MyControl::Create(int n/*=MINIMUS_NUMBER_OF_NODE*/)
{
	return m_tree.Create(n);
}

int MyControl::GetN()
{
	return m_tree.N;
}

int MyControl::ModifyTree(int n)
{
	if(n == GetN())
		return -1;

	BOOL B = ((CMainFrame*)m_pParentWnd)->m_BView;
	((CMainFrame*)m_pParentWnd)->m_BView = FALSE;
	int i = 0;	// number
	int j;		// for
	long* k = new long[m_tree.m_keys];
	long** p = new long*[m_tree.m_keys];
	MyNode* pnode = m_tree.m_root;
	while(pnode->m_level > 1)
		pnode = (MyNode*)pnode->p[0];

	do
	{
		for(j=0;j<pnode->m_n;j++)
		{
			k[i] = pnode->k[j];
			p[i] = (long*)pnode->p[j];
			i++;
		}
		pnode = (MyNode*)(((MyLeaf*)pnode)->m_next);
	}while(pnode);

	m_tree.DeleteTree();
	m_tree.Create(n);

	for(j=0;j<i;j++)
		m_tree.Insert(k[j],p[j]);
	
	delete [] k;
	delete [] p;

	m_drawKey0 = -1;
	m_iType = 0;
	DisplayTree();
	((CMainFrame*)m_pParentWnd)->m_BView = B;
	return 0;
}

void MyControl::DeleteTree(void)
{
	BOOL B = ((CMainFrame*)m_pParentWnd)->m_BView;
	((CMainFrame*)m_pParentWnd)->m_BView = FALSE;
	m_tree.DeleteTree();
	m_iInput = 0;
	m_iRandom = 0;
	m_drawKey0 = -1;
	m_drawLevel = 1;
	m_iType = 0;
	DisplayTree();
	((CMainFrame*)m_pParentWnd)->m_BView = B;
}

int MyControl::Search(long key)
{
	long* pkey = m_tree.Search(key);
	if(!pkey)	return -1;
	Display(m_tree.m_current->k[0],m_tree.m_current->m_level,1);
	return 0;		
}

int MyControl::Insert(long key)
{
	if(m_iInput >= MAXINPUT)
		return -3;
	m_lInput[m_iInput] = key;
	int i = m_tree.Insert(m_lInput[m_iInput],&m_lInput[m_iInput]);
	m_iInput++;
	// m_tree.Search(key);
	// int j = m_tree.m_current->Search(key);
	// if(j == m_tree.m_current->m_n)		
	// 	j = ((MyLeaf*)m_tree.m_current)->m_next->Search(key);
	int j = m_tree.SearchKey(m_tree.m_root,key,1);
	Display(m_tree.m_current->k[0],m_tree.m_current->m_level,15,NULL,j);
	return i;
}

int MyControl::Delete(long key)
{
	int i = m_tree.Delete(key);
	m_drawKey0 = m_tree.m_current->k[0];
	m_iType = 0;
	DisplayTree();
	return i;
}
void MyControl::InsertStore()
{
	BOOL B = ((CMainFrame*)m_pParentWnd)->m_BView;
	((CMainFrame*)m_pParentWnd)->m_BView = FALSE;
	for(int i=0;i<15;i++)
		m_tree.Insert(m_lMine[i],&m_lMine[i]);
	m_iType = 0;
	DisplayTree();
	((CMainFrame*)m_pParentWnd)->m_BView = B;
}
int MyControl::PreInsertRandom(int n)
{
	if(m_iRandom >= MAXRANDOM)
		return -MAXRANDOM;
	return (n > (MAXRANDOM-m_iRandom)) ? (MAXRANDOM-m_iRandom) : n;
}
void MyControl::InsertRandom(int n)
{
	srand((unsigned)time(NULL));
		
	BOOL B = ((CMainFrame*)m_pParentWnd)->m_BView;
	((CMainFrame*)m_pParentWnd)->m_BView = FALSE;
	for(int i=0;i<n;i++)
	{
		m_lRandom[m_iRandom] = rand()%100;
		m_tree.Insert(m_lRandom[m_iRandom],&m_lRandom[m_iRandom]);
		m_iRandom++;
	}
	m_drawKey0 = -1;
	m_iType = 0;
	DisplayTree();
	((CMainFrame*)m_pParentWnd)->m_BView = B;
}

int MyControl::DeleteRandom()
{
	if(m_tree.m_keys == 0)	return -2;
	
	int i,j,n,r;
	long k = 1;
	i=j=n=r=0;
	srand((unsigned)time(NULL));
	i = rand()%m_tree.m_keys;

	MyNode* pnode;
	pnode = m_tree.m_root;
	while(pnode->m_level > 1)
		pnode = (MyNode*)pnode->p[0];

	while(pnode)
	{
		for(n=0;n<pnode->m_n;n++)
		{
			k = pnode->k[n];
			j++;
			if(j >= i)	break;
		}
		if(j >= i)	break;
		pnode = (MyNode*)(((MyLeaf*)pnode)->m_next);
	}

	r = m_tree.Delete(k);
	m_drawKey0 = m_tree.m_current->k[0];
	m_iType = 0;
	DisplayTree();
	return r;
}
void MyControl::SetParentWnd(CWnd* pParentWnd)
{
	m_pParentWnd = pParentWnd;
}

void MyControl::Display(long key0,int level,int type,void* insertPoint/*=NULL*/,int iNumber/*=-1*/)
{
	MyNode* tnode = m_tree.m_current;
	m_drawKey0 = key0;
	m_drawLevel = level;
	m_iType = type;
	m_insertPoint = insertPoint;
	m_iNumber = iNumber;
    
	DisplayTree();	
	m_tree.m_current = tnode;
}

void MyControl::DisplayTree(void)
{
	((CMainFrame*)m_pParentWnd)->DisplayTree();
}

⌨️ 快捷键说明

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