📄 trees.h
字号:
//tree
#include "btrechar.h"
int rdx=7;
int rdy=6;
struct grtnode{
struct grtnode * father,* firstson,* lbro,* nextbrother;
datatype data;
int x,y;
boolean hvdt;
};
typedef struct grtnode * grtlink;
typedef grtlink tree;
typedef tree tlink;
typedef grtlink grtree;
//typedef void far * ffield;
struct tnodeptr{
string ptrname;
tree ptr;
struct tnodeptr *next;
int x,y,num;
ffield fd0;
};
typedef struct tnodeptr *tptrlink;
tptrlink frsttptr=NULL;
int tnum=0;
int tree_graph_state=0;
void put_tnode_data(tree &t,datatype x);
void cur_tnode_onoff(tree t);
void create_tptr(tptrlink & sptr,string title);
void tptr_point_to(tptrlink & sptr,tree sp);
void disp_tptr_attnode(tptrlink & sptr,tree sp);
boolean have_tptr(string title);
void initial_tree();
void fifild(tree t,int orxor);
void disp_tnode_data(tree t);
void copy_tree(tree grt,tree &tre);
void copy_tree_bitre(tree tre,bitre &bt);
void copy_bitre_tree(bitre bt,tree &tre);
void save_tree_file(tree t, string ss);
void load_tree_file(tree &t,string ss);
void save_tree(tree t);
void load_tree(tree &t);
boolean is_tree_leaf(tree t);
void quest_save_tree(tree t);
void quest_load_tree(tree &t);
void comput_tree_card(tree &t);
void tree_range(tree &t, int &xl,int &yl,int &xr,int &yr);
void clear_tree_range(tree t);
void display_tree(string s,tree &t);
void disp_tree(string s,tree &t);
void dis_tree(tree t);
void disp_tree_at(string s,tree &t,int x,int y);
void change_trecard_dxy(tree &t, int dx,int dy);
void change_trecard_to(tree &t,int x,int y);
void move_tree_to(string s,tree &t,int x1,int y1);
void move_tree_dxy(string s,tree &t,int dx,int dy);
void move_tree(string s,tree &t);
void move1_tree(string s,tree &t);
void set_tree_range(tree &t);
void create_tree(tree &tre);
void write_attnode_angle(tree t,int an,string ss);
void writestr_attnode_angle(tree t,int an,string ss);
void writeint_attnode_angle(tree t,int an,int ii);
void dispstr_attnode_angle(string ss, tree t,int an);
void dispint_attnode_angle(int ii,tree t,int an);
void handle_tree_event(pmenunode &pmenu,tree &t);
void handle_tree_menu(mymenu &treemenu1,boolean &selectorno,pmenunode &pmenu,tree &t);
void handle_tree(tree &t);
void get_tree(tree &t);
void visite_tnode(tree t,int i);
void set_vtnode_mode();
void reset_vtnode_mode(int i);
//const int sd=4;
//const int d=0;
//const int m=2;
int steprowt=40;
//int startrow=30;
const int keystept=5;
//const int bigstep=40;
int stepcol=20;
//const int dirnum=6;
//int mvstep=5;
//typedef int move[dirnum][3];
//move mv={{0,-1, up},{0,1,down},{-1,0,left},{1,0,right},{-4,0,bigleft},{4,0,bigright}};
//int may,key;
//int dx,dy;
//int xl,yl,xr,yr,dxl,dyl,dxr,dyr,
//int k,j,xm,ym;
//unsigned int dir_keyset;//set of 1..255;
//ffield ff,datafild,ndcur;
ffield fd1t,fd2t,fd3t,fd4t;
//word size;
//char j1;
//string ss;
// treemenu
/*
const int comgrcreatetree=301;
const int comexcreatetree=302;
const int comreadtree=303;
const int comsavetree=304;
const int comsetranget=305;
const int comdispt=306;
const int commove1t=307;
const int commove2t=308;
*/
mymenu treemenu1;
//pmenunode bmp;
/*
const int comwritedata=801;
const int comnotwritedata=802;
const int comusecurmove=803;
const int comusecurkeep=804;
const int comnotusecur=805;
const int comwaitkey=806;
const int comdelay=807;
const int comnotpause=808;
const int comuseptr=809;
const int comnotuseptr=810;
const int comneedno=811;
const int comnotneedno=812;
const int comselectmodeno=813;
const int numofvstmode=4;
*/
struct visitemodet{
boolean ifwrite,ifcurcovermove,ifcurcoverkeep,ifwaitkey,ifdelay,ifuseptr,ifusenum,ifdispnum;
int delaytime,num,numangle;
tptrlink ptr;
string ptrname;
};
typedef struct visitemodet vstmdarrt[numofvstmode];
//mymenu vstmenu1,vstmenu2;
//pmenunode vstmp1,vstmp2;
//string yn1;
//char yn,ch;
//int vstno=1;
struct visitemodet onevisitemodet={true,true,false,true,false,true,/*false};*/true,true,
0,0,270,
NULL,"T"};
vstmdarrt visitetreemodes;
void initial_visitetreemode(vstmdarrt &visitemodes)
{
int i;
char stemp[255];
for(i=0;i<numofvstmode;i++){
Convs(i,stemp);
strcpy(visitemodes[i].ptrname,"T");
strcat(visitemodes[i].ptrname,stemp);
if ( visitemodes[i].ifuseptr && ! have_tptr(visitemodes[i].ptrname))
create_tptr(visitemodes[i].ptr,visitemodes[i].ptrname);
tptr_point_to(visitemodes[i].ptr,NULL);
if ( visitemodes[i].ifusenum ) visitemodes[i].num=0;
}
}
void reset_vtnode_mode(int i)
{
// with visitetreemodes[i-1]. do
if ( visitetreemodes[i-1].ifuseptr ) tptr_point_to(visitetreemodes[i-1].ptr,NULL);
visitetreemodes[i-1].num=0;
}
void visite_tnode(tree t,int i)
{
char ss[255],s1[255],stemp[255],sstemp[255];
Convs(i,stemp);
strcpy(ss,"访问模式 ");
strcat(ss,stemp);
strcat(ss," 访问元素方式: ");
strcpy(s1,"");
if (t!=NULL){
//with visitetreemodes[i] do
if ( visitetreemodes[i-1]. ifwrite ) strcat(s1," 打印元素");
if (visitetreemodes[i-1]. ifcurcovermove || visitetreemodes[i-1]. ifcurcoverkeep ) strcat(s1," 显示光标");
if ( visitetreemodes[i-1]. ifuseptr ) strcat(s1," 用指示器");
if ( visitetreemodes[i-1]. ifusenum ) strcat(s1," 显示序号");
if ( visitetreemodes[i-1]. ifwaitkey ) strcat(s1," 按键继续");
else
if (visitetreemodes[i-1]. ifdelay ) {
Convs(visitetreemodes[i-1].delaytime,stemp);
strcat(s1," delay ");
strcat(s1,stemp);
strcat(s1," ms to cont.");
}
strcat(ss," by");
strcat(ss,s1);
Menu(ss);
if ( visitetreemodes[i-1].ifwrite )
printf(" %c ",t->data);
if ( visitetreemodes[i-1].ifcurcovermove || visitetreemodes[i-1].ifcurcoverkeep)
cur_tnode_onoff(t);
if ( visitetreemodes[i-1].ifuseptr )
tptr_point_to(visitetreemodes[i-1].ptr,t);
if ( visitetreemodes[i-1].ifusenum )
visitetreemodes[i-1].num=visitetreemodes[i-1].num+1;
if ( visitetreemodes[i-1].ifusenum && visitetreemodes[i-1].ifdispnum )
dispint_attnode_angle(visitetreemodes[i-1].num, t,visitetreemodes[i-1].numangle);
if ( visitetreemodes[i-1].ifwaitkey ) getch();
else
if ( visitetreemodes[i-1].ifdelay ) delay(visitetreemodes[i-1].delaytime);
if ( visitetreemodes[i-1].ifcurcovermove)
cur_tnode_onoff(t);
}
}
/*
void handle_visitetree_event(pmenunode &pmenu,vstmdarrt &visitemodes)
{
int xl,yl,xr,yr,state;
boolean sv;
char stemp[255],sstemp[255];
if ( (pmenu->command>=800) && (pmenu->command<=815) ){
// with visitemodes[vstno] do
switch (pmenu->command){
case comselectmodeno:
do{
strcpy(stemp,"选择采用的访问方式号[1..");
Convs(numofvstmode,sstemp);
strcat(stemp,sstemp);
strcat(stemp,"] ");
Editintinwnd(20,4,60,stemp,vstno);
if ((vstno<1)||(vstno>4)) rangeerror();
}while ((vstno<1)||(vstno>4));
break;
case comwritedata:
do{
state=2-visitemodes[vstno-1].ifwrite;
Editintinwnd(20,4,60,"1--打印元素值 2--不打印元素值",state);
if ( (state!=1)&&(state!=2)) rangeerror();
else
if (state==1) visitemodes[vstno-1].ifwrite=true;
else visitemodes[vstno-1].ifwrite=false;
}while ( (state!=1)&&(state!=2));
break;
case comusecurmove:
do{
state=3-(2*(visitemodes[vstno-1].ifcurcovermove)+(visitemodes[vstno-1].ifcurcoverkeep));
Editintinwnd(10,4,70,"1--覆盖光棒然后移去 2--使用光棒不移去 3--不使用光棒",state);
if ((state!=1)&&(state!=2)&&(state!=3)) rangeerror();
else{
if (state==1) visitemodes[vstno-1].ifcurcovermove=true;
else visitemodes[vstno-1].ifcurcovermove=false;
if (state==2) visitemodes[vstno-1].ifcurcoverkeep=true;
else visitemodes[vstno-1].ifcurcoverkeep=false;
}
}while ((state!=1)&&(state!=2)&&(state!=3));
break;
case comwaitkey:
do{
state=3-(2*(visitemodes[vstno-1].ifwaitkey)+(visitemodes[vstno-1].ifdelay));
Editintinwnd(10,4,70,"1--等待按键继续 2--自动延迟时间 3--访问后不停顿",state);
if ((state!=1)&&(state!=2)&&(state!=3)) rangeerror();
else{
if (state==1) visitemodes[vstno-1].ifwaitkey=true;
else visitemodes[vstno-1].ifwaitkey=false;
if (state==2) visitemodes[vstno-1].ifdelay=true;
else visitemodes[vstno-1].ifdelay=false;
if ( state==2 )
do{
Editintinwnd(20,6,60,"延迟时间[0..10000]毫秒: ",visitemodes[vstno-1].delaytime);
if ( (visitemodes[vstno-1].delaytime<0) || (visitemodes[vstno-1].delaytime>10000)) rangeerror();
}while ((visitemodes[vstno-1].delaytime<0) || (visitemodes[vstno-1].delaytime>10000));
}
}while ((state!=1)&&(state!=2)&&(state!=3));
break;
case comuseptr:
do{
state=2-(visitemodes[vstno-1].ifuseptr);
visitemodes[vstno-1].ifuseptr=false;
Editintinwnd(20,4,60,"1--使用指示器 2--不使用指示器",state);
if ( state==1 )
do{
Convs(vstno,sstemp);
strcpy(visitemodes[vstno-1].ptrname,"t");
strcat(visitemodes[vstno-1].ptrname,sstemp);
Editstrinwnd(20,6,60,"所使用的指示器名称为:",visitemodes[vstno-1].ptrname);
if ( have_bptr(visitemodes[vstno-1].ptrname)) rangeerror();
else visitemodes[vstno-1].ifuseptr=true;
}while (have_bptr(visitemodes[vstno-1].ptrname));
else visitemodes[vstno-1].ifuseptr=false;
}while ((state!=1)&&(state!=2));
break;
case comneedno:
do{
state=2-(visitemodes[vstno-1].ifusenum);
Editintinwnd(20,4,60,"1--显示序号 2--不显示序号 ",state);
if ( state==1 )
do{
Editintinwnd(20,6,60,"显示序号的角度[0..360]:",visitemodes[vstno-1].numangle);
if ((visitemodes[vstno-1].numangle<0) || (visitemodes[vstno-1].numangle>360)) rangeerror();
}while ((visitemodes[vstno-1].numangle<0) || (visitemodes[vstno-1].numangle>360));
if (state==1) visitemodes[vstno-1].ifusenum=true;
else visitemodes[vstno-1].ifusenum=false;
}while ((state!=1)&&(state!=2));
break;
}
}
}
void handle_visitetree_menu(mymenu &vstmenu2,boolean &selectorno, pmenunode &pmenu,vstmdarrt &visitemodes)
{
// with vstmenu2 do
Mymenu_selectmenu(vstmenu2,pmenu,selectorno);
if ( selectorno)
if ( Mymenu_issubmenuitem(vstmenu2)){
Mymenu_disabledispsubmenu(vstmenu2,pmenu->numofmenu / 100);
handle_visitetree_event(pmenu,visitemodes);
}else return;
else return;
}
void handle_visitetree_mode(vstmdarrt &visitemodes)
{
for(i=0;i<4;i++) visitetreemodes[i]=onevisitemodet;
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,
NULL))))))),
Newsubmenu1("返回",NULL,NULL)));
Mymenu_init(vstmenu2,vstmp2);
initial_visitetreemode(visitetreemodes);
do{
handle_visitetree_menu(vstmenu2,selectorno,pmenu,visitemodes);
}while (strcmp(pmenu->menuname,"返回"));
Mymenu_clearmainmenu(vstmenu2);
// initial_visitetreemode(visitetreemodes);
}
void set_vtnode_mode()
{
handle_visitetree_mode(visitetreemodes);
}
// } of visite mode
*/
void put_tnode_data(tree &t,datatype x)
{
t->data=x;
disp_tnode_data(t);
}
void cur_tnode_onoff(tree t)
{
putimage(t->x-2,t->y-2,ndcur,1);
}
boolean have_tptr(string title)
{
tptrlink p;
if (tnum==0) frsttptr=NULL;
p=frsttptr;
while ((p!=NULL) && (strcmp(p->ptrname,title)) ) p=p->next;
if (p!=NULL) return true;
else return false;
}
void create_tptr(tptrlink & sptr,string title)
{
tptrlink p;
int l;
if (tnum==0) frsttptr=NULL;
p=frsttptr;
while (p!=NULL)
if (strcmp(p->ptrname,title)) p=p->next;
else{
Error("the pointer have exist!");//exit
}
sptr=(tptrlink)malloc(sizeof(struct tnodeptr));
tnum=tnum+1;
sptr->next=frsttptr;
frsttptr=sptr;
strcpy(sptr->ptrname,title);
sptr->x=-1;
sptr->y=-1;
sptr->ptr=NULL;
l=8*strlen(sptr->ptrname) / 2;
size=imagesize(1,1,2*l,9);
sptr->fd0=farmalloc(size);
getimage(1,1,2*l,9,sptr->fd0);
putimage(1,1,sptr->fd0,1);
outtextxy(l,5,sptr->ptrname);
getimage(1,1,2*l,9,sptr->fd0);
putimage(1,1,sptr->fd0,1);
}
void ptrcases(tptrlink & sptr, int l)
{
putimage(sptr->x,sptr->y,sptr->fd0,1);
switch (sptr->num){
case 1: putimage(sptr->x+l,sptr->y+8, fd1t,1);break;
case 2: putimage(sptr->x+l,sptr->y-20,fd2t,1);break;
case 3: putimage(sptr->x+2*l,sptr->y+4, fd3t,1);break;
case 4: putimage(sptr->x-20,sptr->y+4, fd4t,1);break;
}
}
void tptr_point_to(tptrlink & sptr,tree sp)
{
tptrlink p;
int k,n,l,sg;
n=0;
l=8*strlen(sptr->ptrname) / 2;
k=0;
if (sp!=NULL){
p=frsttptr;
while ((p!=NULL)){
if ((p->ptr==sp) && (strcmp(p->ptrname,sptr->ptrname))) n=n+1;
p=p->next;
k=k+1;
}
if ( sptr->x>0 ) ptrcases(sptr,l);
sptr->ptr=sp;
sptr->num=n % 4+1;
switch (sptr->num){
case 1:{sptr->x=sp->x-l;sptr->y=sp->y-36;break; }
case 2:{sptr->x=sp->x-l;sptr->y=sp->y+28;break; }
case 3:{sptr->x=sp->x-2*l-28;sptr->y=sp->y-4;break; }
case 4:{sptr->x=sp->x+28;sptr->y=sp->y-4;break; }
}
sptr->x=sptr->x+rdx;
sptr->y=sptr->y+rdy;
ptrcases(sptr,l);
}else{
sptr->x=0;
sptr->y=0;
sptr->ptr=NULL;
}
}
void disp_tptr_attnode(tptrlink & sptr,tree sp)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -