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

📄 graph2.h

📁 该包是数据结构的实验软件,来源于合肥工业大学人工智能与数据挖掘实验室,用来实现数据结构.
💻 H
📖 第 1 页 / 共 4 页
字号:

	while( !(key==10||key==13||key==esc) );

	Menu(" ");


       if (key==esc)
	    { putimage(t->x,t->y,ff,1);
	      delete t;
	      t=nil;
	     }
     }

  void crttre1(datagraph& g ,int& num)
    {
      adjhlink  h1,t,p,fa;
      int curx,cury,v1,v2,wt;
      string ss;
	curx=getmaxx()/2;
	cury=getmaxy()/2;
	putimage(curx,cury,cursor,2);
	window(57,23,76,24);
	do
	{
	  dismenu(-1);
	  Getkey(key,funckey);
	 if( funckey&& ( key==up||key==down||key==left||key==right||key==bigleft||key==bigright) )
	   move_cursor(curx,cury,key,funckey) ;

	else   if (key==ctrlv||key==upv||key==lowv)
	     {   t=new adjhead;
		     t->x=curx-rdx+2;
		     t->y=cury-2*rdx-2;
		     t->nodenum=num+1;
		     t->firstadj=new adjnode;
		     t->nexthead=nil;
			{ t->firstadj->nodenum=0;
			  t->firstadj->nextadj=nil;
			}
		     putimage(t->x,t->y,nilnd,2);
		     disnodedat(t);
		     getimage(t->x,t->y,t->x+2*rdx+1,t->y+2*rdy+1,vn);
		     locttnod(t,vn);
		     if (t!=nil)
		     {  num=num+1;
			 g.nodes=num;
			 h1=get_ver_head(g,num-1);
			 h1->nexthead=t;
		      }
	       }
	   else if (key==ctrle||key==upe||key==lowe)
		   {  dismenu(1);
		      window(57,23,76,24);
		     if (g.haveweight)
			  Menu("输入边: 起点, 终点 和权值;  空格键以输入另一新边");
		     else
			  Menu("输入边: 起点  终点;  空格键以输入另一新边");
		   do
		   {
		    if (g.haveweight)
		       {   clrscr();
			   cin>>v1>>v2>>wt;
		       }
		    else
			{   clrscr();
			     cin>>v1>>v2;
			     wt=1;
			  }
		    if (!have_edge(g,v1,v2) )
			{ insert_edge_weight(g,v1,v2,wt);
		    if (! g.direct)
			 insert_edge_weight(g,v2,v1,wt);
			}
		      else
			 {
			 ss="边 <";
			 Convs(v1,st);
			 strcat(ss,st);
			 strcat(ss,",");
			 Convs(v2,st) ;
			 strcat(ss,st);
			 strcat(ss,">已存在, 不能插入, 可重新输入 ");
			 Error(ss);
			}
		     display_edge(g,v1,v2);
		     Getkey(key,funckey);
		    }
		 while( (key==' ') ||(key==ctrle||key==upe||key==lowe) );
		 }
	   else
		if (!funckey&&(key==lowm||key==upm)&&(g.nodes>0) )
		     modify_vertex_card(g) ;
		else if (!funckey&&(key==lowc||key==upc) )
			modify_edges_weight(g) ;
		     else  if (!key==ctrlw)
			   cout<<'\007';
	}
     while(key!=ctrlw);
   }

  void create_graph(datagraph& g )
     {       initial_graph();
	//with g do
	     g.haveweight=Answer_yes(" Have Weight[y/n]?");
	     g.direct=Answer_yes(" Have Direct[y/n]?");

	     g.nodes=0;
	     num=0;
	     g.firsthead=new adjhead;
	     g.firsthead->nodenum= 0;
	     g.firsthead->nexthead=nil;
	     g.firsthead->firstadj=nil;


	  crttre1(g,num);
	  Menu("建图完毕");
	  disp_graph("created graph",g);
	  window(1,1,80,25); Menu("  ");
       }

  void append_graph(datagraph& g )
     {   initial_graph();
	 num=nodes(g);
	display_all_vertex(g);
	display_all_edge(g);
	crttre1(g,num);
	Menu("编辑完毕");
	disp_graph("Appended graph",g);
	window(1,1,80,25);
	Menu(" ");
     }

  void edit_graph(datagraph& g )
     {   initial_graph();
	 num=nodes(g);
	display_all_vertex(g);
	display_all_edge(g);
	crttre1(g,num);
	Menu("编辑完毕");
	disp_graph("Edited graph",g);
	window(1,1,80,25);
	Menu(" ");
     }

  void modify_vertex_card(datagraph& g )
     {
     int  nn,xl,yl,xr,yr,curx,cury;
     adjhlink t;
     Menu("改变顶点位置: 请输入要移动的顶点号, 输入0结束操作");
     window(1,4,6,6);
     cin>>nn;
     while ( (nn>0)&&(nn<=g.nodes) )
	{
	 t=get_ver_head(g,nn);
	 getimage(t->x,t->y,t->x+2*rdx,t->y+2*rdy,vn);
	 locttnod(t,vn);
	 clear_graph_range(g);
	 display_all_vertex(g);
	 display_all_edge(g);
	 Menu("改变顶点位置: 请输入要移动的顶点号, 输入0结束操作");
	 clrscr();
	 cin>>nn;
       }

	display_all_vertex(g);
	display_all_edge(g);
	Menu(" ");
     }

  void modify_weight(datagraph& g ,int v1,int v2,int www)
     {adjhlink  h1;
      adjlink a1;
      if (have_edge(g,v1,v2) )
	     {   h1=get_ver_head(g,v1);
		 a1=h1->firstadj;
		 while ( (a1!=nil)&&(a1->nodenum!=v2) )
			 a1=a1->nextadj;
		    a1->weight=www;
	      }
      else
	  insert_edge_weight(g,v1,v2,www);
     }


  void modify_edges_weight(datagraph& g )
    {int v1,v2,ww,xl,yl,xr,yr;
      if (g.haveweight)
       {
	  Menu("改变边的权值: 请输入边的 起点号 终点号和权值 输入0 0 0结束操作");
	  cin>>v1;
	  cin>>v2>>ww;
	while (v1>0 )
	{   modify_weight(g,v1,v2,ww);
	    graph_range(g,xl,yl,xr,yr);
	    if(!g.direct )
	       modify_weight(g,v2,v1,ww);
	    clear_graph_range(g);
	    display_all_vertex(g);
	    display_all_edge(g);
	    cin>>v1>>v2>>ww;
	}
	display_all_vertex(g);
	display_all_edge(g);
	Menu(" ");
     }
 }
 void modify_graph(datagraph& g )
   {   initial_graph();
       display_all_vertex(g);
       display_all_edge(g);
       window(60,23,78,24);
       do
      {
      Menu("修改图  M:改变顶点位置, C:修改边的权值, ^W:返回");
       Getkey(key,funckey);
       if(!(key==upm||key==lowm||key==upc||key==lowc||key==ctrlw) )
	    cout<<'\007';
	 else  if (key==upm||key==lowm)
		    modify_vertex_card(g);
		else if (key==lowc||key==upc)
		       modify_edges_weight(g);
       }
     while(key!=ctrlw);
     window(1,1,80,25);
     Menu(" ");
   }

 void save_graph_file(datagraph& g ,string ss)
    {
	adjhlink h;adjlink a;
	int v1,v2,w;
	FILE* ff;
	if((ff=fopen(ss,"w"))==NULL)
		 cout<<"file "<<ss<<"can't write!"<<endl;
	fprintf(ff,"%s\n"," graph");
	       fprintf(ff,"%5d",g.nodes);
	       if (g.haveweight) fprintf(ff,"%3d",0);
			     else fprintf(ff,"%3d",1);
	       if (g.direct)     fprintf(ff,"%3d",0);
			      else fprintf(ff,"%3d",1);
	       h=g.firsthead->nexthead;
	       if (h==nil)  fprintf(ff,"%3d\n",1);
		      else  fprintf(ff,"%3d\n", 0);
	       while (h!=nil)
		   { fprintf(ff,"%5d%5d%4d",h->x,h->y,h->nodenum);
		       if (h->nexthead==nil)  fprintf(ff,"%3d",1);
				       else  fprintf(ff,"%3d",0);
		       a=h->firstadj->nextadj;
		       if (a==nil) fprintf(ff,"%3d\n",1);
				 else  fprintf(ff,"%3d\n",0);
			 while (a!=nil)
			  { fprintf(ff,"%6d%4d",a->weight,a->nodenum);
				a=a->nextadj;
				if (a==nil)   fprintf(ff,"%3d\n",1);
					  else  fprintf(ff,"%3d\n",0);
			  }
			  h=h->nexthead;
		    }
		    fclose(ff);
	 }

  void save_graph(datagraph& g )
     {
      boolean canorno;
      unsigned char ss[60]="graphs\\*.grp";
      Savequestion("Save Graph to",ss,canorno);
	   if (canorno)
	      save_graph_file(g,ss) ;
     }

  void load_graph_file(datagraph& g ,string dosfile)
     { FILE* ff;
	adjhlink h;adjlink a;
	int   wt,dt,ht,at,v1,v2,w;
	char  s[40];
	if((ff=fopen(dosfile,"r"))==NULL)
	     cout<<"file"<<dosfile<<"can't open!"<<endl;

	fscanf(ff,"%s\n",s);
	if (strcmp("graph",s))
	      cout<<"error"<<endl;
	else
	    {
		       fscanf(ff,"%5d%3d%3d%3d\n",&g.nodes,&wt,&dt,&ht);
			g.haveweight=boolean(wt==0);
			g.direct=boolean(dt==0);
			g.firsthead=new adjhead;
			g.firsthead->nodenum=0;
			h=g.firsthead;
			h->firstadj=nil;

			 while (ht==0)
			       {            h->nexthead=new adjhead;
					    h=h->nexthead;
					    fscanf(ff,"%5d%5d%4d%3d%3d",&h->x,&h->y,&h->nodenum,&ht,&at);
					    a= new adjnode;
					    h->firstadj=a;
					    a->nodenum=0;
					    a->weight=1 ;
					   while (at==0)
					      {
						     a->nextadj=new adjnode;
						     a=a->nextadj;
						     fscanf(ff,"%6d%4d%3d",&a->weight,&a->nodenum,&at);
					       }
					    a->nextadj=nil;
			       }

			 h->nexthead=nil;


		  }
	 fclose(ff);
	 return;
    }


  void load_graph(datagraph& g )
      { boolean selected;
	char drive[3];
       char dir[25];
       char file[20];
       char ext[8];
	unsigned char ss[60]="graphs\\*.grp";
	Loadquestion("Load Graph from:",ss,selected);
	if (selected)
	 {
	    _splitpath(ss,drive,dir,file,ext);
	    boolean  bool=(boolean)strcmpi(ext,".grp");
	   if(bool!=0)
		{
		  Error("the file can't be loaded");
		  exit(0);
		}
	    else
		  load_graph_file(g,ss);
	}
     }
  void move_graph_dxy(string s,datagraph& g ,int dx,int dy)
   { adjhlink h;   int xl,yl,xr,yr;
     h=g.firsthead->nexthead;
      while( h!=nil)
	{ h->x=h->x+dx;h->y=h->y+dy;
	 h=h->nexthead;
	 }
      disp_graph(s,g);
    }
  void move_graph_to(string s,datagraph& g ,int x,int y)
    {int   dx,dy,x1,y1,x2,y2;
	 graph_range(g,x1,y1,x2,y2);
      dx=x-x1; dy=y-y1;
      move_graph_dxy(s,g,dx,dy);
    }

    void mvcur(int&  x,int& y,ffield1& ff)
      {int   key;
	boolean funckey;
	putimage(x,y,ff,1);//{wait;}
	Menu("Moving the grapg: Press Arrow, } by Retern");
	do
	{
	 Getkey(key,funckey);
	  if (!(key==10&&key==13) )
	  {
	     if( key==up||key==down||key==left||key==right||key==bigleft||key==bigright) //key in dir_keyset) then
	      {
		putimage(x,y,ff,1);
		calnew(x,y,key);
		putimage(x,y,ff,1) ;
		}
	     else
		cout<<'\007';
	   }
	}
       while( !(key==10||key==13) );
       Menu("Moving over, Press any key for the Re-display of the graph");
       Getkey(key,funckey);
       Menu(" ");
     }
  void move_graph(string s,datagraph& g )
    {
      adjhlink h ;
      int curx,cury,nn=0;

      window(1,7,1,6);
      do
      {
	  Menu("Moving graph: Input  reference  vertex for moving, end by 0: ");
	  cin>>(nn);
	 if ( (nn>0)&&(nn<=g.nodes) )
	  {  h=get_ver_head(g,nn);
	     curx=h->x;
	     cury=h->y;
	     mvcur(curx,cury,datafild);
	     move_graph_dxy(s,g,curx-h->x,cury-h->y);
	 }
      }
       while(nn!=0);
     }

  void move1_graph(string s,datagraph& g )
   {int xl,yl,xr,yr;
     graph_range(g,xl,yl,xr,yr);
     move_graph(s,g);
     Clear_range(xl,yl,xr,yr);
     disp_graph(s,g);
    }

  void set_graph_range(datagraph& g )
   {int x,y,dx,dy,xl,yl,xr,yr;
     adjhlink h;
       Menu("Set graph Left,up conner");
       x=70; y=70;
       mvcur(x,y,datafild);
       graph_range(g,xl,yl,xr,yr);
	dx=x-xl;
	dy=y-yl;
	h=g.firsthead->nexthead;
	while (h!=nil)
	      { h->x=h->x+dx;h->y=h->y+dy;h=h->nexthead; }
 }
 void handle_graph_event(pmenunode&  pmenu, datagraph& g )
   {
   int  xl,yl,xr,yr;
   unsigned char ss[50]="";

     switch(pmenu->command)
     {
     case  comgrcreategraph:  create_graph(g); break;
     case    commodigraph:      edit_graph(g); break;
     case    comreadgraph:      load_graph(g); break;
     case    comsavegraph:     save_graph(g);  break;
     case    comsetrange:      set_graph_range(g); break;
     case    comdisp:          { Inputstrinwnd(20,4,60,"Disp Graph ",ss);
				disp_graph("graph",g);
				}break;
     case    commove1:         { Inputstrinwnd(20,4,65,"Move1Disp Graph,Press enter to move",ss);
				 graph_range(g,xl,yl,xr,yr);
				 move1_graph("graph",g);
				 Clear_range(xl,yl,xr,yr);
				 disp_graph("graph",g);
				}break;
     case    commove2:         { Inputstrinwnd(20,4,60,"Move2Disp Graph ",ss);
				 move_graph("graph",g);
				}break;
		       }
    }

 void handle_graph_menu( mymenu& graphmenu1, boolean&  selectorno,
			      pmenunode& pmenu, datagraph& g )
   {   Mymenu_selectmenu( graphmenu1,pmenu,selectorno);
	if (selectorno)
	   if (Mymenu_issubmenuitem(graphmenu1) )
		 {
		   Mymenu_disabledispsubmenu(graphmenu1,pmenu->numofmenu/100);
		   handle_graph_event(pmenu,g);
		   }
	     else
		  return;
	else
		return;
      }

 void handle_graph(datagraph& g )
  {

	 pmenunode BMp=Newmenu1(
	 Newsubmenu1("建  图",
	    Newmenu1(
	      Newitem1("建新图"," ",0,0,comgrcreategraph,
	      Newitem1("修改原图"," ",0,0,commodigraph,
	      Newitem1("读文件"," ",0,0,comreadgraph,
	      Newitem1("存盘"," ",0,0,comsavegraph,
	      nil))))),
	 Newsubmenu1("显  示  图",
	    Newmenu1(
	      Newitem1("设定显示区域"," ",0,0,comsetrange,
	      Newitem1("按原定位置显示"," ",0,0,comdisp,
	      Newitem1("平移显示  并清除原位"," ",0,0,commove1,
	      Newitem1("平移显示  不清除原位"," ",0,0,commove2,
	      nil))))),
	 Newsubmenu1("返回",nil,nil))));
      Mymenu_init(graphmenu1,BMp);



    do
	handle_graph_menu(graphmenu1,selectorno,pmenu,g);
	while(strcmp(pmenu->menuname,"返回" ) );
	  Mymenu_clearmainmenu(graphmenu1);
	  Mymenu_reset_cursubmenu(graphmenu1);
	  Mymenu_done(graphmenu1);
  }
 void get_graph(datagraph& g )
    { initial_graph();
      handle_graph(g);    }


#endif


⌨️ 快捷键说明

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