📄 索引技术dlg.cpp
字号:
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 + -