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

📄 索引技术dlg.cpp

📁 是当初的数据结构的做业,用的是b+树这一块,非常值得初学者的参考
💻 CPP
📖 第 1 页 / 共 2 页
字号:
void CMyDlg::Onfind() 
{   
	const int i=GetDlgItemInt(IDC_EDIT1);
///检查数据合法性,只能输入1~99,由于结点显示区的大小限定	
    if(i<=0 || i>99)
	{MessageBox("请先输入0~~~~99的数据!!");
	SetDlgItemInt(IDC_EDIT1,0);
	return;
	}
	m_state=1;
    state="查找状态";
	SetDlgItemText(IDC_STATIC3,state);
	m_3D3.SetFont3D(TRUE,CLabel::Raised)
		.SetText3DHiliteColor(RGB(255,0,0))
		.SetFontName("Times New Roman")
		.SetFontSize(35)
		.SetFontBold(TRUE);
	CListBox *list1=(CListBox *)GetDlgItem(IDC_LIST1);
    while(list1->GetCount())//删除原来的代码,显示查找代码
		list1->DeleteString(0);
    char path[50];
	GetModuleFileName(NULL,path,50);//获取程序的路径,用于获取代码文件
    int len=strlen(path);
    PathName=path;
	char q='\'';
	int l=PathName.ReverseFind(q);
    len=l;
	path[l+1]=0;
    PathName=path;
	l=PathName.ReverseFind(q);
    path[l+1]=0;
    PathName=path;
    PathName.Insert(PathName.GetLength(),"find.txt");//代码文件的路径
	CString ss;
	///打开并获取代码,输入listbox内
	CStdioFile f((LPSTR)(LPCTSTR)PathName,CFile::modeRead);
	f.SeekToBegin();
	f.ReadString(ss);
	int t=0;
	while(ss!=_T(""))
	{
    list1->InsertString(t++,ss);
	ss.Empty();
    f.ReadString(ss);
	}
	m_btn7.EnableWindow(FALSE);
	m_btn8.EnableWindow(FALSE);
	m_edit.EnableWindow(FALSE);
	// TODO: Add your control notification handler code here
	
}

void CMyDlg::Onrun() 
{
	// TODO: Add your control notification handler code here
	if(m_stop)
	{m_stop=false;
	return;}
    
    CListBox *list1=(CListBox *)GetDlgItem(IDC_LIST1);
	list1->SetCurSel(0);
	if(m_state==-1)
	{MessageBox("请选择你要进行的操作!!");
	SetDlgItemText(IDC_STATIC3,"结束!!");
	m_3D3.SetFont3D(TRUE,CLabel::Raised)
		.SetText3DHiliteColor(RGB(255,0,0))
		.SetFontName("Times New Roman")
		.SetFontSize(32)
		.SetFontBold(TRUE);
	m_btn7.EnableWindow();
	m_btn8.EnableWindow();
    m_edit.EnableWindow();
	return;
	}
	SetDlgItemText(IDC_STATIC3,"正在执行。。。。");
	m_3D3.SetFont3D(TRUE,CLabel::Raised)
		.SetText3DHiliteColor(RGB(255,0,0))
		.SetFontName("Times New Roman")
		.SetFontSize(32)
		.SetFontBold(TRUE);
	const int i=GetDlgItemInt(IDC_EDIT1);
	m_insert=i;
    
	if(m_state==0)//插入状态
	{   
		if(tree.find(tree.root,i)){ SetDlgItemText(IDC_STATIC3,"记录已经存在!");m_3D3.SetFont3D(TRUE,CLabel::Raised)
		.SetText3DHiliteColor(RGB(255,0,0))
		.SetFontName("Times New Roman")
		.SetFontSize(32)
		.SetFontBold(TRUE);
		m_btn7.EnableWindow();
	m_btn8.EnableWindow();
    m_edit.EnableWindow();
	m_state=-1;
		return;}
	int retval=-1;
	FTNode * node=NULL;
	insertval=i;
	insert(tree.root,i,retval,node,0);
		if(node!=NULL)
{
FTNode * fnode=new FTNode;
fnode->lkey=retval;
fnode->left=tree.root;
fnode->lcenter=node;
tree.root=fnode;
}
m_insert=i;
m_state=-1;
insertval=-1;//待插的数据
for(int o=0;o<21;o++)
	{
	m_retval[o]=-1;
	}
	for(int y=2;y<0;y--)
{InvalidateRect(&validate[y],FALSE);
timedelay(m_time);
	}//逐行刷新
Invalidate();
//m_insert=-1;

m_btn7.EnableWindow();
m_btn8.EnableWindow();
m_edit.EnableWindow();
SetDlgItemText(IDC_STATIC3,"结束!!");
MessageBox("算法演示完毕!!");
	}
if(m_state==1)//查找状态
{
if(!find(tree.root,i))
{
m_insert=-1;

SetDlgItemText(IDC_STATIC3,"未找到记录!");
m_3D3.SetFont3D(TRUE,CLabel::Raised)
		.SetText3DHiliteColor(RGB(255,0,0))
		.SetFontName("Times New Roman")
		.SetFontSize(32)
		.SetFontBold(TRUE);

m_btn7.EnableWindow();
	m_btn8.EnableWindow();
    m_edit.EnableWindow();
	m_state=-1;

Invalidate();
}
else
{m_state=-1;
m_btn7.EnableWindow();
m_btn8.EnableWindow();
m_edit.EnableWindow();
SetDlgItemText(IDC_STATIC3,"已经找到记录");
Invalidate();

}
m_state=-1;//恢复状态为等待

}	
	
}

bool CMyDlg::insert(FTNode *&subroot, const int &e, int &retval, FTNode *&retptr,int num)
{
CListBox *list1=(CListBox *)GetDlgItem(IDC_LIST1);
int temp=m_insert;
insertplace=num;
invalidate();
int  myretv=0;FTNode * myretp=NULL;CListBox *list=(CListBox *)GetDlgItem(IDC_LIST1);timedelay(m_time);list->SetCurSel(0);
timedelay(m_time);list->SetCurSel(1);	if(subroot->isleaf())
{if(Help(2,subroot->lkey) && invalidate()&& subroot->lkey==EMPTY) {subroot->lkey=e;}
	 else if(Help(3,subroot->ckey) && invalidate()&&subroot->ckey ==EMPTY){
	 if (Help(4,subroot->lkey) && invalidate()&&e >subroot->lkey)  {subroot->ckey=e;}
			     else if (Help(5)&&e<subroot->lkey){
				 subroot->ckey=subroot->lkey;list->SetCurSel(6);timedelay(m_time);
				     subroot->lkey=e;list->SetCurSel(7);timedelay(m_time);}}
	 else if (Help(8,subroot->rkey) &&invalidate()&&subroot->rkey==EMPTY){
			  if(Help(9) &&invalidate()&&e< subroot->lkey){list->SetCurSel(9);timedelay(m_time);
				 subroot->rkey=subroot->ckey;list->SetCurSel(10);
				 subroot->ckey=subroot->lkey;list->SetCurSel(11);
				 subroot->lkey=e;list->SetCurSel(12);timedelay(m_time);}
				 else if (Help(13,subroot->lkey) &&e >subroot->lkey && e< subroot->ckey)
				 {subroot->rkey=subroot->ckey;list->SetCurSel(14);timedelay(m_time);
				   subroot->ckey=e;list->SetCurSel(15);timedelay(m_time);}
                 else if (Help(14,subroot->ckey) &&e >subroot->ckey)
				 {subroot->rkey=e;list->SetCurSel(17);timedelay(m_time);}}
	 else  {splitenode(subroot,e,NULL,retval,retptr,num);list->SetCurSel(18);timedelay(m_time);}}
	else {
		if (Help(19,subroot->lkey) && invalidate()&&e < subroot->lkey) {insert(subroot->left,e,myretv,myretp,4*num+1);}
		else if(Help(20,subroot->ckey) && invalidate()&&(subroot->ckey==EMPTY || subroot->ckey >e)) {insert(subroot->lcenter,e,myretv,myretp,4*num+2);}
		else if(Help(21) &&invalidate()&&(subroot->rkey==EMPTY || e < subroot->rkey)) {insert(subroot->rcenter,e,myretv,myretp,4*num+3);}
		else if(Help(22,subroot->rkey) &&invalidate()&&e>subroot->rkey) {insert(subroot->right,e,myretv,myretp,4*num+4);list->SetCurSel(22);timedelay(m_time);}}
		if(myretp!=NULL){list->SetCurSel(23);insertval=myretv;insertplace=num;invalidate();
	if(Help(24) &&subroot->ckey==EMPTY){
		if(myretv >subroot->lkey){list->SetCurSel(25);subroot->ckey=myretv;subroot->rcenter=myretp;m_retval[num*4+2]=myretp->lkey;Invalidate();timedelay(m_time);}
		else if(Help(26) &&myretv<subroot->lkey){
	         list->SetCurSel(27);subroot->ckey=subroot->lkey;subroot->lkey=myretv;timedelay(m_time);
			 subroot->rcenter=subroot->lcenter;subroot->lcenter=myretp;list->SetCurSel(28);timedelay(m_time);}}
				else if(subroot->rkey==EMPTY){list->SetCurSel(29);timedelay(m_time);
		if(Help(30) &&myretv< subroot->lkey)
			{ //m_retval[num*4+1]=myretp->lkey;Invalidate();
			subroot->rkey=subroot->ckey;list->SetCurSel(31);timedelay(m_time);
				subroot->ckey=subroot->lkey;list->SetCurSel(32);timedelay(m_time);
				subroot->lkey=myretv;list->SetCurSel(33);timedelay(m_time);
				subroot->right=subroot->rcenter;list->SetCurSel(34);timedelay(m_time);
				subroot->rcenter=subroot->lcenter;list->SetCurSel(35);timedelay(m_time);
				subroot->lcenter=myretp;list->SetCurSel(38);timedelay(m_time);}
			else if(Help(39) &&myretv<subroot->ckey)
			{//m_retval[num*4+2]=myretp->lkey;Invalidate();
				subroot->rkey=subroot->ckey;list->SetCurSel(40);timedelay(m_time);
				subroot->right=subroot->rcenter;list->SetCurSel(41);timedelay(m_time);
				subroot->ckey=myretv;list->SetCurSel(42);timedelay(m_time);
				subroot->rcenter=myretp;list->SetCurSel(43);timedelay(m_time);}
			else if(Help(44) && myretv>subroot->ckey)
			{//m_retval[num*4+3]=myretp->lkey;Invalidate();
				subroot->rkey=myretv;list->SetCurSel(45);timedelay(m_time);
			subroot->right=myretp;list->SetCurSel(46);timedelay(m_time);}} 
				else if(Help(47) &&subroot->rkey!=EMPTY){list->SetCurSel(48);timedelay(m_time);
					splitenode (subroot,myretv,myretp,retval,retptr,num);}}
timedelay(m_time);	m_insert=temp;return true;

}

bool CMyDlg::splitenode(FTNode *&subroot, const int &inval, FTNode *inptr, int &retval, FTNode *&retptr,int num)
{
     retptr =new FTNode;
    if(inval <subroot->lkey)
	{
		 retval=subroot->ckey;
		 retptr->lkey=subroot->rkey;
         retptr->left=subroot->rcenter;retptr->lcenter=subroot->right;
		 subroot->rcenter=subroot->lcenter;subroot->lcenter=inptr;
		 subroot->ckey=subroot->lkey;subroot->lkey=inval;
	}
	else if(inval < subroot->ckey)
	{
       retval=subroot->ckey;
       retptr->left=subroot->rcenter;
	   retptr->lkey=subroot->rkey;
       retptr->lcenter=subroot->right;
	   subroot->ckey=inval;
       subroot->rcenter=inptr;
       
	   
	}


    else if(inval < subroot->rkey)
	{
	    retval=inval;retptr->left=inptr;
	    retptr->lcenter=subroot->right;
	    retptr->lkey=subroot->rkey;
	}
    else if(inval>subroot->rkey)
	{  
		retval=subroot->rkey;
		retptr->left=subroot->right;
        retptr->lcenter=inptr;
        retptr->lkey=inval;
		
		
	}
    subroot->rkey=EMPTY;
	m_retval[num]=retptr->lkey;
	insertval=retval;
	insertplace=num;
	InvalidateRect(&insertrect[num]);
	InvalidateRect(&splitenoderect[num]);
	timedelay(m_time);
	return true;
}

void CMyDlg::timedelay(int lag)
{     MSG m;
	for(int i=0;i<lag;i++)
 for(int j=0;j<lag;)
 {   if(m_stop==false)
      j++;
	 while(::PeekMessage(&m,NULL,0,0,PM_REMOVE))//获取消息
		 ::DispatchMessage(&m);//传递信息,避免死循环造成的消息处理障碍
 }
}

void CMyDlg::OnSpeedCtrl() //控制运行速度
{
	// TODO: Add your control notification handler code here
	CSpeedDlg dlg;
	if(dlg.DoModal()==IDOK)
	{m_time=dlg.m_ntime;
	}
	

}

void CMyDlg::OnRadom() 
{
	// TODO: Add your control notification handler code here
	if(tree.root->lkey!=EMPTY)//判断是否树已有数据
	{
		if(AfxMessageBox("次项操作将清除原来B树的数据,是否要继续?",1)==2)
		{
			return;
	}
	}
	insertval=-1;
	FTNode *node1=new FTNode;
    tree.root=node1;
int t=m_time;	
m_time=0;
///随机取数据,做10次插入
for(int i=0;i<10;i++)
{int retval=-1;
int temp=rand()%99;
if(!tree.find(tree.root,temp))
{
FTNode * node=NULL;
insert(tree.root,temp,retval,node,0);
if(node!=NULL)
{
FTNode * fnode=new FTNode;
fnode->lkey=retval;
fnode->left=tree.root;
fnode->lcenter=node;
tree.root=fnode;
}
Invalidate();
}	
	}
m_insert=-1;
insertval=-1;
for(int o=0;o<21;o++)
	{
	m_retval[o]=-1;
	}
invalidate();
m_time=t;	
CListBox *list1=(CListBox *)GetDlgItem(IDC_LIST1);

list1->SetCurSel(0);//高亮显示为第一行
	
}


void CMyDlg::OnStop() 
{
	// TODO: Add your control notification handler code here
	m_stop=true;//设置暂停标志符为true
	state="暂停状态";
	SetDlgItemText(IDC_STATIC3,state);
  m_3D3.SetFont3D(TRUE,CLabel::Raised)
		.SetText3DHiliteColor(RGB(255,0,0))
		.SetFontName("Times New Roman")
		.SetFontSize(32)
		.SetFontBold(TRUE);

}
void CMyDlg::OnTraval()
{CPaintDC dc(this);
Traval(dc,noderct,node,tree.root,0,m_insert);
m_insert=-1;
Invalidate();
AfxMessageBox("遍历结束!!!");

}
/////////树的周游
void CMyDlg::Traval(CPaintDC & dc,CRect rect[],Node noderect[],FTNode *subroot ,int num,int & insert) 
{  
	if(m_state==-1)
	{
		int number=2;
if(subroot==NULL || subroot->lkey==EMPTY || num >20) return;
FTNode *node[5]={NULL,NULL,NULL,NULL,NULL};
insert=subroot->lkey;
PrintTree(dc,rect,noderect,subroot,num);
Invalidate();
timedelay(m_time);

if(subroot->ckey!=EMPTY)
{
insert=subroot->ckey;

PrintTree(dc,rect,noderect,subroot,num);
number=3;
Invalidate();
timedelay(m_time);

}
if(subroot->rkey!=EMPTY){
insert=subroot->rkey;
PrintTree(dc,rect,noderect,subroot,num);

Invalidate();
number=4;
timedelay(m_time);
}
node[0]=NULL;
node[1]=subroot->left;
node[2]=subroot->lcenter;
node[3]=subroot->rcenter;
node[4]=subroot->right;
CPoint p[5];//用于结点间的连线
p[0]=CPoint(0,0);
p[1]=noderect[num].lpoint;
p[2]=noderect[num].clpoint;
p[3]=noderect[num].rlpoint;
p[4]=noderect[num].rpoint;
for(int i=1;i<=number;i++)

{   if(node[i]!=NULL)
{
	dc.MoveTo(p[i]);
    dc.LineTo(noderect[4*num+i].toppoint);//结点连线
}
Traval(dc,rect,noderect,node[i],4*num+i,insert);//访问下一结点
}

	}
	else
		AfxMessageBox("算法正在运行中..........");
	
}



bool CMyDlg::Help(int lag, int insert)//时间延迟与代码高亮显示
{
CListBox *list1=(CListBox *)GetDlgItem(IDC_LIST1);
  list1->SetCurSel(lag);
  timedelay(m_time);
  if(insert!=-1)//为了特殊显示出要插入的数据
  {m_insert=insert;
  }
  
return true;
}

bool CMyDlg::find(FTNode *subroot, int k)//查找代码
{
CPaintDC dc(this);
	if(Help(0) &&subroot==NULL) return false;
    if(Help(1,subroot->lkey) && PrintTree(dc,noderct,node,tree.root,0)&&invalidate()&&Help(1,subroot->lkey) && k==subroot->lkey){ return true;}
    if(Help(2,subroot->ckey) && PrintTree(dc,noderct,node,tree.root,0)&&invalidate()&&Help(2,subroot->ckey) && k==subroot->ckey && subroot->ckey!=EMPTY){
	Help(3);	return true;}
	if(Help(4,subroot->rkey) && PrintTree(dc,noderct,node,tree.root,0) &&invalidate() &&Help(4,subroot->rkey)&& k==subroot->rkey){
	Help(5);	return true;}
	if(Help(6) &&k < subroot->lkey){
       Help(7); return find(subroot->left,k);}
    else if(Help(8)&&subroot->ckey==EMPTY){
        Help(9);return find(subroot->lcenter,k);}
    else if(Help(10) && k < subroot->ckey){
      Help(11);  return find (subroot->lcenter,k);}
    else if(Help(12)&&subroot->rkey==EMPTY){
      Help(13);  return find(subroot->rcenter,k);}
    else if(Help(14)&&k<subroot->rkey){
       Help(15); return find(subroot->rcenter,k);}
    else if (Help(16)&&k > subroot->rkey){
       Help(17); return find(subroot->right,k);}
}

bool CMyDlg::invalidate()//刷新显示
{
	Invalidate();
	return true;
}

⌨️ 快捷键说明

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