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

📄 trees.h

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