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

📄 cd8_2u.cpp

📁 C++ Builder程序员学习数据结构,里面涵盖了所有你要学习的数据结构的所有源码(二叉树、链表、单链表、双链表、红黑树、快速排序、冒泡排序、哈弗曼树、堆、集合、字典、散列、字典、跳表、图、最短路径
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "cd8_2u.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int graph[8][8];            //图形数组
TShape *sp[8];              //定义sp继承Shape控件
TLabel *lb[8];              //定义lp继承Label控件
int n=0,f=0,t=0,s,ts,temp;
int i,j;
int x[8]={0},y[8]={0};     //辅助边线绘制的x与y的坐标记录
bool vst[8]={false};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ctClick(TObject *Sender)   //生成顶点
{
   lout->Caption="请在绘图窗口中点鼠标左键";
   pnl->Enabled=true;       //启动面板功能
}

//---------------------------------------------------------------------------

void __fastcall TForm1::pnlMouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)     //画板上的鼠标左键弹起时执行的事件
{
  if(ct->Enabled==true)        //判断生成顶点按键是否可用
  {
   if(n<8)                      //限制顶点数量
   {
      sp[n]=new TShape(Form1);            //执行阶段生成的新对象
      sp[n]->Parent=pnl;                  //设定顶点生成的位置在面板上
      sp[n]->Enabled=false;
      sp[n]->Left=X-15;               //取得顶点中心位置
      sp[n]->Top=Y-15;
      sp[n]->Height=30;               //设定顶点大小
      sp[n]->Width=30;
      TColor color[8]={clWhite,clYellow,clLime,clBlue,clRed,clAqua,clTeal,clNavy};  //顶点颜色设置
      sp[n]->Brush->Color=color[n];
      sp[n]->Shape=stEllipse;    //顶点形状设置

      lb[n]=new TLabel(pnl);       //建立新的顶点标签
      lb[n]->Parent=pnl;           //设置标签属性
      lb[n]->Caption=n;
      lb[n]->Transparent=true;
      lb[n]->Left=X-5;
      lb[n]->Top=Y-6;

      x[n]=X-8; y[n]=Y-8;      //记录顶点位置来绘制边线(注意边线在image控件上)

      if(n>0)
      {
         ln->Enabled=true;  //设定连线功能可用
         lout->Caption="";
      }
   }
   else                    //顶点数超过8,就使生成功能不可用
      ct->Enabled=false;

   n++;                   //生成结点计数器加1
  }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::lnClick(TObject *Sender) //连线设置
{
   pnl->Cursor=crArrow;          //改变鼠标箭头
   img->Enabled=true;            //相关控件功能属性设置
   ct->Enabled=false;
   ctb->Visible=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::finKeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)      //输入起始点
{
   if(Key==13)
   {
      f=StrToInt(fin->Text);        //获取用户输入起点信息
      if(n>f)
      {

         img->Canvas->MoveTo(x[f],y[f]);      //设定边线起点
         fin->Enabled=false;                  //输入切换
         tin->Enabled=true;
         Perform(WM_NEXTDLGCTL,0,0);
      }   
      else
         ShowMessage("请输入 0 ~ "+IntToStr(n-1));    //注意顶点由0开始
   }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::tinKeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)      //输入终点
{
   if(Key==13)
   {
      t=StrToInt(tin->Text);
      if(n>t)
      {

         img->Canvas->LineTo(x[t],y[t]);         //设定并绘制边线终点
         tin->Enabled=false;                     //输入切换
         fin->Enabled=true;
         tin->Text="";                           //清理输入框
         fin->Text="";
         graph[f][t]=1;                          //将结点记录存于数组中
         graph[t][f]=1;
         Perform(WM_NEXTDLGCTL,0,0);
         sh->Enabled=true;                       //启动搜索功能键
      }
      else
         ShowMessage("请输入 0 ~ "+IntToStr(n-1));
   }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::shClick(TObject *Sender) //执行搜索按键点击事件
{
   ln->Enabled=false;     //相关控件功能设置
   ctb->Visible=false;
   psh->Visible=true;
   sh->Enabled=false;
}
//---------------------------------------------------------------------------
void dfs(int v)           //深度优先搜索函数
{
   if(s==v)                                    //找到要搜索的顶点
   {
      sp[v]->Brush->Color=clMenu;              //改变顶点颜色
      Form1->Timer1->Enabled=true;             //启动搜索到顶点的动画
      return;
   }
   vst[v]=true;                                 //找过的顶点

   for(i=0;i<n;i++)
   {
      if((graph[v][i]==1) && (!vst[i]))          //如果顶点没找过
      {
         temp=v;                                //保留顶点信息
         dfs(i);                                //由没有找过的顶点出发自找一次
      }
   }
  for(i=0;i<n;i++)
   {
      if((graph[temp][i]==1) && (!vst[i]))
      {
         temp=v;
         dfs(i);
      }
   }
}

void __fastcall TForm1::sinKeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)       //输入搜索值
{
   if(Key==13)
   {
      s=StrToInt(sin->Text);  //获取搜索值
      psh->Visible=false;
      dfs(0);                 //调用深度优先搜索法,由定点0开始
   }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{                             //使搜索到的节点闪烁
   if(ts==0)
   {
      sp[s]->Visible=true;
      ts=1;
   }
   else
   {
      sp[s]->Visible=false;
      ts=0;
   }
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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