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

📄 红黑树view.cpp

📁 红黑树——一种数据结构的可视化画法
💻 CPP
字号:
// 红黑树View.cpp : implementation of the CMyView class
//

#include "stdafx.h"
#include "红黑树.h"

#include "红黑树Doc.h"
#include "红黑树View.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern rbTree gtree;
extern pNode temp;

/////////////////////////////////////////////////////////////////////////////
// CMyView
void listAll(pNode pn,CTreeCtrl *list,HTREEITEM hit=0);
void listAll(pNode pn,CListBox *list ,int nindex=0);
IMPLEMENT_DYNCREATE(CMyView, CView)

BEGIN_MESSAGE_MAP(CMyView, CView)
	//{{AFX_MSG_MAP(CMyView)
	ON_WM_CREATE()

	ON_BN_CLICKED(IDC_BNI,OnButtonInsert)
	ON_BN_CLICKED(IDC_BND,OnButtonDelete)
	ON_BN_CLICKED(IDC_SHOW,OnButtonShow)
	ON_LBN_SELCHANGE(IDC_LST, OnSelchangeLB)
	ON_BN_CLICKED(IDC_RANK,OnButtonRank)
    ON_BN_CLICKED(IDC_SEL,OnButtonSel)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyView construction/destruction

CMyView::CMyView()
{
	// TODO: add construction code here

}

CMyView::~CMyView()
{
}

BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	//cs.dwExStyle=WS_HSCROLL|WS_VSCROLL;

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMyView drawing

void CMyView::OnDraw(CDC* pDC)
{
	CMyDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	//pDC->TextOut(0,500,"This is a simple test");

}

/////////////////////////////////////////////////////////////////////////////
// CMyView diagnostics

#ifdef _DEBUG
void CMyView::AssertValid() const
{
	CView::AssertValid();
}

void CMyView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMyDoc* CMyView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
	return (CMyDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyView message handlers

int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	m_btnd=new CButton;
	m_btni=new CButton;
	m_btnshow=new CButton;
	m_btnr=new CButton;
	m_btnsel=new CButton;
	CRect btn1(50,150,130,180);CRect btnr(150,150,230,180);
    CRect btn2(50,200,130,230);CRect btns(150,200,230,230);
	CRect btn3(100,250,180,280);CRect bt(230,200,260,230);
	m_btnshow->Create("显示(&s)",WS_VISIBLE,btn3,this,IDC_SHOW);
    m_btnd->Create("删除(&I)",WS_VISIBLE,btn1,this,IDC_BND);
    m_btni->Create("插入(&D)",WS_VISIBLE,btn2,this,IDC_BNI);
	m_btnr->Create("级别(&R)",WS_VISIBLE,btnr,this,IDC_RANK);
    m_btnsel->Create("定位(&S)",WS_VISIBLE,btns,this,IDC_SEL);
   Sele =new CEdit;
    Sele->Create( WS_VISIBLE,bt,this,IDC_ESEL);
	
   
	m_ek=new CStatic;
	m_en=new CStatic;
	ss=new CStatic;
	ss1=new CStatic;
    CRect tx1(50,20,100,50);
    CRect tx2(350,20,430,50);

    m_ek->Create("name:",WS_VISIBLE|WS_CHILD,tx1,this,0);
    m_en->Create("All Nodes",WS_VISIBLE,tx2,this,0);
    CRect tx3(120,20,200,50);
	// CRect tx1(20,20,100,50);
	name=new CEdit;
	name->Create( WS_VISIBLE|ES_AUTOHSCROLL,tx3,this,IDC_NAM);
	name->CreateSolidCaret(100,30);

	CRect lb2(350,51,730,450);
	//tree=new CTreeCtrl;
	//tree->Create(WS_VISIBLE|WS_CHILD|WS_VSCROLL|WS_HSCROLL,lb2,this,IDC_TREE);
    //tree->SetBkColor(RGB(180,180,180));
	list=new CListBox;
	list->Create(WS_VISIBLE|WS_CHILD|WS_VSCROLL|WS_HSCROLL
		,lb2,this,IDC_LST);

   //  list->SetBkColor(RGB(180,180,180));

	CRect tx5(120,60,200,90);
	CRect tx4(50,60,100,90);
	 key=new CEdit;
	 ss->Create ( "Key:",WS_VISIBLE,tx4,this);
	 key->Create( WS_VISIBLE,tx5,this,IDC_KEY);
	 key->SetWindowText("34");
	 name->SetWindowText("root");
	 name->SetLimitText(4);
	 key->SetLimitText(3);

	 srank=new CStatic;
	 ssize=new CStatic;
	 	CRect r1(50,350,200,380);
		CRect r2(50,400,200,430);
		//CRect r3(50,250,130,280);
		srank->Create("Rank   :    ",WS_VISIBLE,r1,this,IDC_RANK);
		ssize->Create("Size     :    ",WS_VISIBLE,r2,this,IDC_IZE);
	
	return 0;
}
void CMyView::OnButtonInsert() 
{
	CString sna,sky;
    name->GetWindowText(sna);
	key->GetWindowText(sky);
	int k;
	sscanf(sky,"%d",&k);
    gtree.rbInsert(gtree.newNode(k,sna.GetBuffer(15)));

   int cn=list->GetCount();
   for(int i=0;i<cn;i++)
   list->DeleteString(0);
   if(gtree.root!=nil)
   listAll(gtree.root,list);
}
void CMyView::OnButtonDelete() 
{
	if(list->GetCount()==0)
	{
		MessageBox("还是一棵空树!!!");
        return ;
	}
	
    int in;
	in=list->GetCurSel();
	if(in==LB_ERR)
	{
		MessageBox("请先在表中选择!!!");
        return ;
	}
	gtree.rbDelete((pNode)list->GetItemData(in));

	 int cn=list->GetCount();
   for(int i=0;i<cn;i++)
   list->DeleteString(0);
   if(gtree.root!=nil)
   listAll(gtree.root,list);

}
void CMyView::OnButtonShow() 
{
	((CMainFrame*)AfxGetMainWnd())->OnShow();
}

void CMyView::OnSelchangeLB()
{
  int in;
   in=list->GetCurSel();
   if(in==LB_ERR)
	   return ;
   pNode tem=(pNode)list->GetItemData(in);
   CString str;
   str.Format("%d",tem->key);
  
   key->SetWindowText(str);
   name->SetWindowText(tem->name);
   //UpdateData(1);
  key->UpdateWindow();
  name->UpdateData(1);

   str.Format("%d",tem->size);
   ssize->SetWindowText(str);
}
void CMyView::OnButtonRank()
{
    	if(list->GetCount()==0)
	{
		MessageBox("还是一棵空树!!!");
        return ;
	}
	
    int in;
	in=list->GetCurSel();
	if(in==LB_ERR)
	{
		MessageBox("请先在表中选择!!!");
        return ;
	}
	pNode tem=(pNode)list->GetItemData(in);
	CString str,str1;
   str.Format("%d",tem->key);
  
   key->SetWindowText(str);
   name->SetWindowText(tem->name);
   //UpdateData(1);
  key->UpdateWindow();
  name->UpdateData(1);						

  
 
   str.Format("%s%d","Size   :       ",tem->size);
   ssize->SetWindowText(str);
   
   str.Format("%s%d","Rank  :       ",gtree.Rank(tem));
   srank->SetWindowText(str);


}


void CMyView::OnButtonSel() 
{
	if(list->GetCount()==0)
	{
		MessageBox("还是一棵空树!!!");
        return ;
	}
	
    int in;
	CString rr;
	Sele->GetWindowText(rr);

	sscanf(rr,"%d",&in);
	if(in<0)
	{
		MessageBox("输入不合法!!");
		return ;
	}
	if(in>gtree.root->size)
	{
		MessageBox("输入值太大!!");
		return ;
	}

    pNode tem=gtree.OS_Select(gtree.root,in);
    CString str;
   str.Format("%d",tem->key);
  
   key->SetWindowText(str);
   name->SetWindowText(tem->name);
   //UpdateData(1);
   key->UpdateWindow();
   name->UpdateData(1);	
   str.Format("%s%d","Size   :       ",tem->size);
   ssize->SetWindowText(str);
   
   str.Format("%s%d","Rank  :       ",gtree.Rank(tem));
   srank->SetWindowText(str);
   	int cn=list->GetCount();
   for(int i=0;i<cn;i++)
   {
	   pNode p=(pNode)list->GetItemData(in);
       if(p==tem)
	   {
         list->SetSel(i);
		 break;
	   }
   }
	

}

⌨️ 快捷键说明

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