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

📄 graph2.h

📁 该包是数据结构的实验软件,来源于合肥工业大学人工智能与数据挖掘实验室,用来实现数据结构.
💻 H
📖 第 1 页 / 共 4 页
字号:
	if (visitegraphmodes[i].ifwrite)
		    cout<<v<<" ";
	if (visitegraphmodes[i].ifcurcovermove||visitegraphmodes[i].ifcurcoverkeep)
	      cur_gnode_onoff(g,v);
	if (visitegraphmodes[i].ifuseptr)
		  gptr_point_to(visitegraphmodes[i].ptr,g,v);
	if (visitegraphmodes[i].ifusenum)
		visitegraphmodes[i].num=visitegraphmodes[i].num+1;
	if (visitegraphmodes[i].ifusenum&& visitegraphmodes[i].ifdispnum)
	      dispint_atgnode_angle(visitegraphmodes[i].num,g,v,visitegraphmodes[i].numangle);
	if (visitegraphmodes[i].ifwaitkey)
			  getch();
	     else
		  if(visitegraphmodes[i].ifdelay)
			   delay(visitegraphmodes[i].delaytime);
	if (visitegraphmodes[i].ifcurcovermove)
	    cur_gnode_onoff(g,v);
     }
   }

//{==== 2 ====}
 void rangeerror()
    {
    cout<<'\007'<<endl;
    Error("数据范围错!");
    }


 void handle_visite2_event(pmenunode& pmenu, vstmdarr& visitemodes)
  {int state=1;
   boolean sv;
   if ( (pmenu->command>=800)&&(pmenu->command<=815) )
       switch(pmenu->command)
	{
	case  ComSelectModeNo:
				do
				 {
				    Editintinwnd(20,4,60,"选择采用的访问方式号[0..3]", vstno);
				    if (vstno!=0&&vstno!=1&&vstno!=2&&vstno!=3)
					  Error("数据范围错!");
				    }
				while(vstno!=0&&vstno!=1&&vstno!=2&&vstno!=3);
				 break;
	case  ComWriteData:   do
				  {
				    state=2-int(visitemodes[vstno].ifwrite);
				    Editintinwnd(20,4,60,"1--打印元素值  2--不打印元素值",state);
				    if(state!=1&&state!=2)
					  Error("数据范围错!");
				     else
					   visitemodes[vstno].ifwrite=boolean(state==1);
				    }
				   while(state!=1&&state!=2);
				  break;
	case  ComUseCurMove:  do
				  {
				    state=3-(2*int(visitemodes[vstno].ifcurcovermove)+int(visitemodes[vstno].ifcurcoverkeep) );
				    Editintinwnd(10,4,70,"1--覆盖光棒然后移去  2--使用光棒不移去  3--不使用光棒",state);
				    if(state!=1&&state!=2&&state!=3)
					Error("数据范围错!");
				    else
				       visitemodes[vstno].ifcurcovermove=boolean(state==1);
				       visitemodes[vstno].ifcurcoverkeep=boolean(state==2);
				      }
				while(state!=1&&state!=2&&state!=3);
				break;
	case  ComWaitKey:    do
				{
				state=3-(2*int(visitemodes[vstno].ifwaitkey)+int(visitemodes[vstno].ifdelay) );
				 Editintinwnd(10,4,70,"1--等待按键继续  2--自动延迟时间  3--访问后不停顿",state);
				if(state!=1&&state!=2&&state!=3)
				      Error("数据范围错!");
				 else
				  {
				     visitemodes[vstno].ifwaitkey=boolean(state==1);
				     visitemodes[vstno].ifdelay=boolean(state==2);
				     if (state==2)
				       do
				       {
					  Editintinwnd(20,6,60,"延迟时间[0..10000]毫秒: ",visitemodes[vstno].delaytime);
					   if ( (visitemodes[vstno].delaytime<0)||(visitemodes[vstno].delaytime>10000) )
						    Error("数据范围错!");
					 }

					 while(visitemodes[vstno].delaytime<0||visitemodes[vstno].delaytime>10000) ;
				    }
				}
				while(state!=1&&state!=2&&state!=3);
				break;
	case  ComUsePtr:    do
			     {
			      state=2-int(visitemodes[vstno].ifuseptr);
			      visitemodes[vstno].ifuseptr=false;
			      Editintinwnd(20,4,60,"1--使用指示器  2--不使用指示器",state);
			      if (state==1)
			      {
				do
			       {

			       Editstrinwnd(20,6,60,"所使用的指示器名称为:",visitemodes[vstno].ptrname);
				if(have_gptr(visitemodes[vstno].ptrname) )
				    Error("数据范围错!");
				 else
				     visitemodes[vstno].ifuseptr=true;
				 }
			       while(have_gptr(visitemodes[vstno].ptrname) ) ;
			       create_gptr(visitemodes[vstno].ptr,visitemodes[vstno].ptrname);
			    }
			      else
				   visitemodes[vstno].ifuseptr=false;
			       }
			       while(state!=1&&state!=2);
			       break;
	case  ComNeedNo:     do
			     {
			     state=2-int(visitemodes[vstno].ifusenum);
			     Editintinwnd(20,4,60,"1--显示序号  2--不显示序号",state);
			     if (state==1)
			     do
			     {
			      Editintinwnd(20,6,60,"显示序号的角度[0..360]:",visitemodes[vstno].numangle);
			      if  ( (visitemodes[vstno].numangle<0)||(visitemodes[vstno].numangle>360) )
				  Error("数据范围错!");
			       }
			       while(visitemodes[vstno].numangle<0||visitemodes[vstno].numangle>360) ;
			    visitemodes[vstno].ifusenum=boolean(state==1);
			   }
			  while(state!=1&&state!=2) ;
			  break;
	       }
   }

   void handle_visite2_menu(mymenu& vstmenu2,boolean& selectorno,
			      pmenunode& pmenu,vstmdarr& visitemodes)
   {
      Mymenu_selectmenu(vstmenu2,pmenu,selectorno);
	if (selectorno )
	  if (Mymenu_issubmenuitem(vstmenu2))
	     {       Mymenu_disabledispsubmenu(vstmenu2,pmenu->numofmenu/100);
		      handle_visite2_event(pmenu,visitemodes);
	      }
	     else
		return;
	else
	     return;
  }

 void handle_visite2_mode(vstmdarr& visitemodes)
  {    /*for (int i=0;i< 4 ;i++)
       visitemodes[i]=onevisitemode;
	*/

      pmenunode     vstmp2=Newmenu1(
	 Newsubmenu1("置访问方式",
	    Newmenu1(
	      Newitem1("选择访问方式号","选择访问方式号... ",0,0,ComSelectModeNo,
	      Newitem1("设置打印元素值","设置是否打印元素的值... ",0,0,ComWriteData,
	      Newitem1("使用光棒方式","设置是否使用光标... ",0,0,ComUseCurMove,
	      Newitem1("设置停顿方式","设置在两次访问之间是否需要停顿... ",0,0,ComWaitKey,
	      Newitem1("设置使用指示器","设置是否需要指示器指示结点.. ",0,0,ComUsePtr,
	      Newitem1("显示序号","设置是否需要显示序号...",0,0,ComNeedNo,
	      nil))))))),
	 Newsubmenu1("返回",nil,nil)));
	Mymenu_init(vstmenu2,vstmp2);



    do

       handle_visite2_menu(vstmenu2,selectorno,pmenu,visitemodes);
     while(strcmp(pmenu->menuname,"返回") );
       Mymenu_clearmainmenu(vstmenu2);
       Mymenu_done(vstmenu2);
       initial_visitemode(visitegraphmodes);
  }

 void set_vgnode_mode()
 {  handle_visite2_mode(visitegraphmodes);
 }

  void two_point_angle(int x1,int y1,int x2,int y2,int& sa)
     {int sgx,sgy;
	 sgx=Sgn(x1,x2);
	 sgy=Sgn(y1,y2);
	 if(x2==x1)
	   sa=180+sgy*90;
	  else
	    sa=270+sgx*90-sgx*sgy*Round(atan(abs((y2-y1)/(x2-x1)))*180/PI);
	 sa=(sa+360)%360;
     }
 void get_arc_cord(int x1,int y1,int sa,int&  sx,int& sy,int& ex,int& ey)
    {  struct arccoordstype far * a;
       arc(x1,y1,(sa-25+360)%360,(sa+25)%360,rdx);
	getarccoords(a);
      sx=a->xstart;
      sy=a->ystart;
      ex=a->xend;
      ey=a->yend;
   }
 void weight_cord(int mx,int my,int sa,int&  wx,int& wy)
 {  const  int ll=5;
    float  s;
     s=sa/180*PI;
     wx=Round(mx-ll*sin(s));
     wy=Round(my-ll*cos(s));
    }
   void join1(float x,float y,float x1,float y1,int& nx,int& ny)
    {float dx,dy,l;
      l=(sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1)));
	  dx=((x-x1)*rdx/l);
	  dy=((y-y1)*rdy/l);
	  nx=Round(x1+dx);
	  ny=Round(y1+dy);
     }

    void join_single_edge(adjhlink h1,adjhlink h2,int& sx,int& sy,int& ex,int& ey,int& wx,int& wy)
    { int  sa;
	   join1(h1->x+rdx,h1->y+rdy,h2->x+rdx,h2->y+rdy,ex,ey);
	   join1(h2->x+rdx,h2->y+rdy,h1->x+rdx,h1->y+rdy,sx,sy);
	   two_point_angle(h1->x,h1->y,h2->x,h2->y,sa);
	   weight_cord((sx+ex)/2,(sy+ey)/2,sa,wx,wy);
     }
   void join_double_edge(adjhlink h1,adjhlink h2,int& sx,int& sy,int& ex,int& ey,int& wx,int& wy)
     {int  sa,sx1,sy1,ex1,ey1;
	 two_point_angle(h1->x,h1->y,h2->x,h2->y,sa);
	   get_arc_cord(h1->x+rdx,h1->y+rdy,sa,sx1,sy1,sx,sy);
	   get_arc_cord(h2->x+rdx,h2->y+rdy,sa+180,ex,ey,ex1,ey1);
	   weight_cord((sx+ex)/2,(sy+ey)/2,sa,wx,wy);
    }
   void initial_graph()
     {
     int size;
      Into_graph();
      /* if(fdd1==nil)
       {
	for (int i=0;i< 4 ;i++)
       visitegraphmodes[i]=onevisitemode;
       initial_visitemode(visitegraphmodes);
       }*/
	Clear_range(0,0,getmaxx(),getmaxy() );
	setcolor(forecolor);//   DIRECTVIDEO:=FALSE;

	if(fdd1==nil)
	   {
	   size=imagesize(1,1,5,20);
	   fdd1=malloc(size);
	   Arrow(3,1,3,20);
	   getimage(1,1,5,20,fdd1);
	   putimage(1,1,fdd1,1);
	   }
	if(fdd2==nil)
	   {size=imagesize(1,1,5,20);
	    fdd2=malloc(size);
	    Arrow(3,20,3,1);
	    getimage(1,1,5,20,fdd2);
	    putimage(1,1,fdd2,1);
	  }
	if(fdd3==nil)
	  {
	 size=imagesize(1,1,20,5);
	 fdd3=malloc(size);
	 Arrow(1,3,20,3);
	 getimage(1,1,20,5,fdd3);
	 putimage(1,1,fdd3,1);
	   }
	 if(fdd4==nil)
	 {size=imagesize(1,1,20,5);
	 fdd4=malloc(size);
	 Arrow(20,3,1,3);
	 getimage(1,1,20,5,fdd4);
	 putimage(1,1,fdd4,1);
	  }
	if(nilnd==nil)
	{
	size=imagesize(1,1,2*rdx+2,2*rdy+2);
	nilnd=malloc(size);
	circle(rdx+1,rdy+1,rdy);
	getimage(1,1,2*rdx+2,2*rdy+2,nilnd);
	}
	if(datafild==nil)
	{
	 size=imagesize(1,1,2*rdx,2*rdy);
	 datafild=malloc(size);
	 circle(rdx+1,rdy+1,rdy-1);
	 getimage(1,1,2*rdx,2*rdy,datafild);
	 //putimage(1,1,datafild,1);
	  }
	if(vn==nil)
	{
	size=imagesize(1,1,2*rdx+2,2*rdy+2);
	vn=malloc(size);
	getimage(1,1,2*rdx+2,2*rdy+2,vn);
	setfillpattern(fillmode,fillcolor);
	pieslice(rdx+1,rdy+1,0,360,rdy-1);
	putimage(1,1,datafild,1);
	getimage(2,2,2*rdx,2*rdy,datafild);
	}
	if(cursor==nil)
	{
	size=imagesize(1,1,6,3);
	cursor=malloc(size);
	bar(1,1,6,3);
	getimage(1,1,6,3,cursor);
	}
	if(curblk==nil)
	{
	rectangle(20,20,20+3*rdx,20+5*rdy/2);
	floodfill(22,22,getcolor());
	size=imagesize(21,21,19+3*rdx,19+5*rdy/2);
	curblk=malloc(size);
	bar(21,21,19+3*rdx,19+5*rdy/2);
	getimage(21,21,19+3*rdx,19+5*rdy/2,curblk);
	}
	setfillstyle(1,0);
	bar(0,0,getmaxx(),getmaxy());
	setfillstyle(1,WHITE);
      }

  boolean   have_gptr(string title)
   { boolean have_gptr=false;
     gptrlink p;
      if (gnum==0 )
	  frstgptr=nil;
	 p=frstgptr;
     while(p!=nil)
	  {
	   if(!boolean(stricmp(p->ptrname,title) ))
	       have_gptr=true;
	    p=p->next;
	   }
       return have_gptr;
    }

  void create_gptr(gptrlink& sptr,string title)
     {gptrlink p; int l,size;
       if (gnum==0)
	     frstgptr=nil;
	  p=frstgptr;
	while( p!=nil)
	   {if(strcmp(p->ptrname,title))
		 p=p->next;
	     else
	      Error("The pointer have exist!");
	   }
	      sptr=new gnodeptr;
	      gnum=gnum+1;
		if(gnum==1)
		  sptr->next=nil;
		 else
		 sptr->next=frstgptr;
		 frstgptr=sptr;
		 strcpy(sptr->ptrname,title);
		 sptr->x=-1;
		 sptr->y=-1;
		 sptr->ptr=nil;
		 l=16*strlen(title)/2;
		 size=imagesize(1,2,2*l,14);
		 void far * q=farmalloc(size);
		 getimage(1,2,2*l,14,q);
		 setfillstyle(1,0);
		 bar(1,2,2*l,14);
		 sptr->fdd0=farmalloc(size);
		 outtextxy(l,6,title);
		 getimage(1,2,2*l,14,sptr->fdd0);
		 putimage(1,2,sptr->fdd0,1);
		 putimage(1,2,q,0);

     }
  void  ptrcases(gptrlink& sptr,int l)
    {	putimage(sptr->x,sptr->y,sptr->fdd0,1);
	 switch(sptr->num)
      { case 1:  putimage( sptr->x+l, sptr->y+8, fdd1,1);break;
	case 2:  putimage( sptr->x+l, sptr->y-20,fdd2,1); break;
	case 3:  putimage( sptr->x+2*l, sptr->y+4, fdd3,1);break;
	case 4:  putimage( sptr->x-20,  sptr->y+4, fdd4,1) ;break;
      }
    }

   void gptr_point_to(gptrlink& sptr,datagraph& g ,int v)
    {gptrlink p;
    int k,n,l,sg;
    adjhlink hh;
       n=0;
       l=8*strlen(sptr->ptrname)/2;
       k=0;
      if( (v<=g.nodes) && (v>0))
	 {    p=frstgptr;
	      hh=get_ver_head(g,v);
	      while (p!=nil)
		  {  if ((p->ptr==hh) &&(strcmp(p->ptrname,sptr->ptrname)) )
			  n=n+1;
			  p=p->next;
			  k=k+1;

		   }
	       if (sptr->x>0)
		 ptrcases(sptr,l);
		 sptr->ptr=hh;
		 sptr->num=n%4+1;
		 switch(sptr->num)
		   {case   1:{ sptr->x=hh->x-l; sptr->y=hh->y-36 ;break;}
		    case   2:{ sptr->x=hh->x-l; sptr->y=hh->y+28;break; }
		    case   3:{ sptr->x=hh->x-2*l-28; sptr->y=hh->y-4;break; }
		    case   4:{ sptr->x=hh->x+28; sptr->y=hh->y-4 ;break;}
		   }
		  sptr->x=sptr->x+rdx;sptr->y=sptr->y+rdy;
		  ptrcases(sptr,l);
	     }

       else if (v==0)
       {sptr->x=0; sptr->y=0;sptr->ptr=nil;
       }
   }
  void disp_gptr_atgnode(gptrlink& sptr,datagraph& g ,int v)
   {gptrlink p;
    int k,n,l,sg;
    adjhlink hh;
       n=0;
       l=8*strlen(sptr->ptrname)/2;
       k=0;
      if ((v<=g.nodes)&&(v>0))
	 {    p=frstgptr;
	      hh=get_ver_head(g,v);
	       while (p!=nil)
		   { if ((p->ptr==hh)&&(strcmp(p->ptrname,sptr->ptrname)) )
			n=n+1;
			p=p->next;
			k=k+1;

		   }
	   sptr->ptr=hh;
	   sptr->num=n%4+1;
	   switch(sptr->num)
		 {case    1:{ sptr->x=hh->x-l; sptr->y=hh->y-36;break; }
		  case    2:{ sptr->x=hh->x-l; sptr->y=hh->y+28;break; }
		  case    3:{ sptr->x=hh->x-2*l-28; sptr->y=hh->y-4;break; }
		  case    4:{ sptr->x=hh->x+28; sptr->y=hh->y-4; }
		 }
		 sptr->x=sptr->x+rdx;sptr->y=sptr->y+rdy;
	       ptrcases(sptr,l);
	   }
	else if( v==0)
	    { sptr->x=0;sptr->y=0;sptr->ptr=nil ;}
   }

   void fifild(adjhlink& t,int orxor)
      {  putimage(t->x+1,t->y+1,datafild,orxor) ;  }
   void cur_cover(adjhlink& t,int orxor)
      {  putimage(t->x-rdx/2,t->y-rdy/4,curblk,orxor);  }
   void cur_gnode_onoff(datagraph& g ,int gnode)
      { cur_cover_node(g,gnode,1); }
   void write_atgnode_angle(datagraph& g ,int v,int an,string ss)
      {int  x1,y1,l; adjhlink t; float angle;
	l=an/360; t=get_ver_head(g,v); angle=an*2*PI/360;
	     x1=t->x+Round(rdx*(2+l)*cos(angle))+rdx;
	     y1=t->y-Round(rdy*(2+l)*sin(angle))+rdy;
	     outtextxy(x1,y1,ss) ;
       }
   void writestr_atgnode_angle(datagraph& g ,int v,int an,string ss)
      { write_atgnode_angle(g,v,an,ss) ;  }
   void writeint_atgnode_angle(datagraph& g ,int v,int an,int ii)
     {unsigned char ss[10]="";
       Convs(ii,ss);
      write_atgnode_angle(g,v,an,ss);  }

   void dispstr_atgnode_angle(string ss, datagraph& g ,int v,int an)
      { write_atgnode_angle(g,v,an,ss) ;  }
   void dispint_atgnode_angle(int ii,datagraph& g,int  v,int an)
     {unsigned char ss[10]="";
       Convs(ii,ss);
      write_atgnode_angle(g,v,an,ss);
      }

   void writeint_gnode(datagraph& g ,int v,int ld,int xe)
      { adjhlink h;
	int xx,yy;
	h=get_ver_head(g,v);
	 if (ld==up||ld==down||ld==left||ld==right )

	  switch(ld)
	  {
	   case up:   { xx=h->x+rdx; yy=h->y-rdy; }  break;
	   case down: { xx=h->x+rdx; yy=h->y+3*rdy; }break;
	   case left: { xx=h->x-rdx; yy=h->y+rdy; }    break;
	   case right:{ xx=h->x+3*rdx;yy=h->y+rdy;}  break;
	   }
	   Convs(xe,st);
	   outtextxy(xx,yy,st);
	   getch();
     }

   void cur_cover_node(datagraph& g ,int v,int orxor)
      {adjhlink h=nil;
       h=get_ver_head(g,v);
       cur_cover(h,orxor) ;
      }
   void disnodedat(adjhlink& t)
    {  unsigned char  ss[10];
       Convs(t->nodenum,ss);
       fifild(t,2);
       fifild(t,1);
       outtextxy(t->x+rdx-5,t->y+rdy-3,ss);

⌨️ 快捷键说明

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