📄 graph2.h
字号:
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 + -