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

📄 btrechar.h

📁 该包是数据结构的实验软件,来源于合肥工业大学人工智能与数据挖掘实验室,用来实现数据结构.
💻 H
📖 第 1 页 / 共 4 页
字号:
	else{
		y0=t->y+radiuy*7 / 10;
		switch (lr){
			case lt:
				if (y0<y1) {
					ellipse(x1-radiux / 2,y1,180,359,radiux / 2,radiuy / 2);
					Arrow(x1-radiux,y1,t->x-radiux*7 / 10*(Sgn(x1,t->x)+1) / 2,t->y+radiuy);
				}else
					if (y0==y1) Arrow(x1-radiux*3 / 10,y1-radiuy*3 / 10,t->x+radiux,t->y);
					else   Arrow(x1,y1,t->x-radiux*7 / 10*Sgn(x1,t->x),t->y-radiuy);//*7 / 10;
				break;
			case r:
				if (y0<y1) {
					ellipse(x1+radiux / 2,y1,180,359,radiux / 2,radiuy / 2);
					Arrow(x1+radiux,y1,t->x-radiux*7 / 10*(Sgn(x1,t->x)+1) / 2,t->y+radiuy);
				}else 
					if (y0==y1)  Arrow(x1,y1,t->x-radiux*7 / 10,t->y+radiuy*7 / 10);
					else  Arrow(x1,y1,t->x-radiux*7 / 10*Sgn(x1,t->x),t->y-radiuy);//*7 / 10
				break;
		}
	}
    setlinestyle(0,lpr.upattern,lpr.thickness);
    setcolor(clr);
}

void  rthread_point_to(bitre t1,bitre t2)
{
	int xs,ys;
	xs=t1->x+radiux*7 / 10;  
	ys=t1->y+radiux*7 / 10;
    thread(1,t2,xs,ys);
}

void  lthread_point_to(bitre t1,bitre t2)
{
	int xs,ys;
    xs=t1->x-radiux*7 / 10;  
    ys=t1->y+radiux*7 / 10;
    thread(-1,t2,xs,ys);
}
      
void  write_atbnode_angle(bitre t,int an,string ss)
{
	int x1,y1,l;
	float angle;
	l=an / 360; 
	angle=an*2*PI/360;
	x1=t->x+Round(radiux*(2+l)*cos(angle));
	y1=t->y-Round(radiuy*(2+l)*sin(angle));
	outtextxy(x1,y1,ss);
}

/*  void  writestr_atbnode_angle(bitre t,an:integer;string ss)
     {  write_atbnode_angle(t,an,ss)  }
  void  writeint_atbnode_angle(bitre t,an:integer;ii:integer)
     var string ss;
     { str(ii,ss);write_atbnode_angle(t,an,ss) }
   void  dispstr_atbnode_angle(string ss, bitre t,an:integer)
     {  write_atbnode_angle(t,an,ss)  }
 */
void  dispint_atbnode_angle(int ii,bitre t,int an)
{
	string ss;
	Convs(ii,ss);
	write_atbnode_angle(t,an,ss);
}

void  dis_btre1t(bitre tt,int x1,int y1)
{
	if (tt!=NULL){
		line(x1,y1,tt->x,tt->y-radiuy);
		ellipse(tt->x,tt->y,0,359,radiux,radiuy);
		outtextxy(tt->x,tt->y,conv(tt->data));
		if (tt->ltag==1)  thread(lt,tt->lchild,tt->x-xl,tt->y+yl);
		else dis_btre1t(tt->lchild,tt->x-xl,tt->y+yl);
		if (tt->rtag==1)  thread(r,tt->rchild,tt->x+xl,tt->y+yl);
		else dis_btre1t(tt->rchild,tt->x+xl,tt->y+yl);
	}
}

void  dis_thbitre(bitre tt)//string s;
{
	if (tt!=NULL){
		xl=radiux*7 / 10;
		yl=radiuy*7 / 10;
		ellipse(tt->x-20,tt->y-20,0,360,5,5);
		dis_btre1t(tt,tt->x-20,tt->y-20);
	}
	getch();
	getch();
}

boolean leaft(bitre p)
{
	if ((p->ltag==1) && (p->rtag==1))  return true;
	else return false;
}

void  comput_btre_widthpt(bitre &tt)
{
	if (tt!=NULL){
		if (tt->ltag==0) comput_btre_widthpt(tt->lchild);
		if (tt->rtag==0) comput_btre_widthpt(tt->rchild);
		if ((tt->ltag==1) && (tt->rtag==1)){
			tt->lw=0;
			tt->rw=0;
		}else
			if (tt->ltag==1){
				tt->lw=Max(0,tt->rchild->lw-1);
				tt->rw=tt->rchild->rw+1;
			}else
				if (tt->rtag==1){
					tt->rw=Max(0,tt->lchild->rw-1);
					tt->lw=tt->lchild->lw+1;
				}else
					if (leaft(tt->lchild)){
						tt->lw=Max(1,tt->rchild->lw-1);
						tt->rw=tt->rchild->rw+1;
					}else
						if (leaft(tt->rchild)){
							tt->rw=Max(1,tt->lchild->rw-1);
							tt->lw=tt->lchild->lw+1;
						}else{
							tt->lw=tt->lchild->w;
							tt->rw=tt->rchild->w;
						}
        tt->w=tt->lw+tt->rw+1;
    }
}

void  comput_btre_cardp0t(int tag,bitre &tt,int xt,int d)
{
	if ((tt!=NULL) && (tag==0)){
		d=d+1;
		tt->y=d;
		tt->x=xt;
		if (tt->ltag==1)  comput_btre_cardp0t(tt->rtag,tt->rchild,tt->x+1,d);
		else 
			if (tt->rtag==1) comput_btre_cardp0t(tt->ltag,tt->lchild,tt->x-1,d);
		    else 
		    	if (leaft(tt->lchild) || leaft(tt->rchild)){
		    		comput_btre_cardp0t(tt->ltag,tt->lchild,tt->x-1,d);
		    		comput_btre_cardp0t(tt->rtag,tt->rchild,tt->x+1,d);
		    	}else{
		    		comput_btre_cardp0t(tt->ltag,tt->lchild,tt->x-1-tt->lchild->rw,d);
		    		comput_btre_cardp0t(tt->rtag,tt->rchild,tt->x+1+tt->rchild->lw,d);
		    	}
	}
}

void  comput_node_card1t(bitre &tt)
{
	if (tt!=NULL){
		tt->x=tt->x*step_col+strt_col;
		tt->y=tt->y*step_row+strt_row;
		if (tt->ltag==0) comput_node_card1t(tt->lchild);
		if (tt->rtag==0) comput_node_card1t(tt->rchild);
	}
}

void  comput_thbtre_cardp(bitre &tt)
{
	comput_btre_widthpt(tt);
	comput_btre_cardp0t(0,tt,tt->lw,0);
	gtmaxxy(mx,my);
    if (tt->w*step_col-10<mx)   strt_col=(mx-tt->w*step_col-10) / 2;
    else step_col=mx / (tt->w+2);
    hi=highth(tt);
    if ((hi+1)*step_row-10<my)  strt_row=(my-(hi+1)*step_row-10) / 2;
    else step_row=my / (hi+3);
    comput_node_card1t(tt) ;
}

void  disp_thbitre(string s,bitre &tt)
{
	int v1,v2,v3,v4;
	if (tt==NULL){
		rectangle(mx / 2-40,my / 2-40,mx / 2+40,my / 2+40);
		outtextxy(mx / 2,my / 2-5,s);
		ellipse(mx / 2,my / 2,0,359,radiux,radiuy);
		line(mx / 2+10,my / 2-10,mx / 2-10,my / 2+10);
	}else{
		clear_bitre_range(tt);
		bitre_range(tt,v1,v2,v3,v4);
		v1=v1+8;
		v2=v2+12;
		v3=v3-8;
		v4=v4-8;
        rectangle(v1,v2,v3,v4);
        outtextxy((v1+v3) / 2,v2-5,s);
        dis_thbitre(tt);
	}
}

void display_threaded_bitre(string s,bitre &tt)
{
	initial_bitre();
	comput_thbtre_cardp(tt);
	disp_thbitre(s,tt);
	getch();//End_graph();
}

void  comput_thbitre_card(bitre &tt)
{
	comput_thbtre_cardp(tt);
}
      
void in_thread1(bitre &t,bitre &pre)
{
	if (t!=NULL){
		if (t->lchild==NULL){
			t->lchild=pre;
			t->ltag=1;
		}else{
			in_thread1(t->lchild,pre);
			pre->rchild=t;
		}
        pre=t;
		if (t->rchild==NULL) t->rtag=1;
        else  in_thread1(t->rchild,pre);
    }
}
         
void  in_thread_bitre(bitre t,bitre &tt)
{
	bitre pre;
	copy_bitre(t,tt);
	pre=NULL;
	in_thread1(tt,pre);
	display_threaded_bitre("  inorder threaded bitre",tt);
}

void  post_thread1(bitre &t,bitre &pre)
{
	if (t!=NULL){
		post_thread1(t->lchild,pre);
		if (t->rchild==NULL) t->rtag=1;
		else post_thread1(t->rchild,pre);
		if (t->lchild==NULL){
			t->ltag=1;
			t->lchild=pre;
		}
		if ((pre!=NULL) && (pre->rtag==1))  pre->rchild=t;
		pre=t;
	}
}

void  post_thread_bitre(bitre t,bitre &tt)
{
	bitre pre;
	copy_bitre(t,tt); 
	pre=NULL;
	post_thread1(tt,pre);
	display_threaded_bitre("  postorder threaded bitre",tt);
}

void  pre_thread1(bitre &tt,bitre &pre)
{
	if ((pre!=NULL) && (pre->rtag==1) && (pre->rchild==NULL))   pre->rchild=tt;
	if (tt!=NULL){
		if (tt->lchild==NULL){
			tt->ltag=1;
			tt->lchild=pre;
			pre=tt;
		}else{
			if (tt->rchild==NULL){
				tt->rtag=1;
				tt->rchild=tt->lchild;
			}
        	pre=tt;
        	pre_thread1(tt->lchild,pre);
    	}
        if ((tt->rtag==0))
        	if ((tt->rchild==NULL))  tt->rtag=1;
        	else pre_thread1(tt->rchild,pre);
    }
}

void  pre_thread_bitre(bitre t,bitre &tt)
{
	bitre pre;
	copy_bitre(t,tt);
	pre=NULL;
	pre_thread1(tt,pre);
    display_threaded_bitre("   pre_threaded bitre ",tt);
}

void save(bitre t,FILE *ff)
{
	boolean k1,k2;
	if (t!=NULL){
		fprintf(ff,"%c",t->data);
		if ((t->ltag==0) && (t->lchild!=NULL)) k1=true;
		else k1=false;
		if ((t->rtag==0) && (t->rchild!=NULL)) k2=true;
		else k2=false;
		if (k1) fprintf(ff,"  0");
		else fprintf(ff,"  1");
		if (k2) fprintf(ff,"  0\n");
		else fprintf(ff,"  1\n");
		if (k1) save(t->lchild,ff);
		if (k2) save(t->rchild,ff);
	}
} 

void  save_bitre_file(bitre t,string ss)
{
	FILE *ff;
	if ((ff=fopen(ss,"w"))==NULL){
		printf("\nCan't open file!\007");
		getch();
		exit(1);
	}
	fprintf(ff,"bitre\n");
	if (t!=NULL)  fprintf(ff,"  0\n");
	else fprintf(ff,"  1\n");
	save(t,ff);
	fclose(ff);
}

void  save_bitre(bitre t)
{
	char ss[255];
	boolean canorno;
	strcpy(ss,"bitres\*.");
	strcat(ss,extendname);
	Savequestion("save bitre to",ss, canorno);
	if (canorno)   save_bitre_file(t,ss);
}

void load(bitre &t,FILE *ff)
{
	int k1,k2;
	t=(bitre)malloc(sizeof(struct bnode));
	fscanf(ff,"%c%d%d",&(t->data),&k1,&k2);
	while (fgetc(ff)!='\n');
	if (k1==0){
		t->ltag=0;
		load(t->lchild,ff);
	}else{
		t->ltag=1;
		t->lchild=NULL;
	}
	if (k2==0){
		t->rtag=0;
		load(t->rchild,ff);
	}else{
		t->rtag=1;
		t->rchild=NULL;
	}
}

void  load_bitre_file(bitre &t,string ss)
{
	string bs;
	int x;
	FILE *ff;
	if ((ff=fopen(ss,"r"))==NULL){
		printf("\nCan't open file!\007");
		getch();
		exit(1);
	}

   fscanf(ff,"%s",bs);
   while (fgetc(ff)!='\n');
   fscanf(ff,"%d",&x);
   while (fgetc(ff)!='\n');
   if ( strcmp(bs,"bitre")) printf("file error!\007");
   else
	if (x==1)  t=NULL;
	else {
		load(t,ff);
		Into_graph();
		comput_bitre_card(t);
	}
	fclose(ff);
}

void  load_bitre(bitre &t)
{
	char ss[255]; 
	boolean selected=true;
	strcpy(ss,"bitres\\*.");
	strcat(ss,extendname);
	Loadquestion("load bitre from ",ss,selected);
	if ( selected )  load_bitre_file(t,ss);
}

//======   get bitre menu ======
void  handle_bitre_event(pmenunode &pmenu,bitre &t)
{
	int xl,yl,xr,yr;
	switch (pmenu->command){
		case comgrcreatebitre: create_gr_bitre(t);break;
		case comexcreatebitre: create_ex_bitre(t);break;
		case comreadbitre:     load_bitre(t);break;
		case comsavebitre:     save_bitre(t);break;
		case comsetrange:      set_bitre_range(t);break;
		case comdisp:{
				Inputstrinwnd(20,4,60,"disp bitre ",ss);
				disp_bitre("bitre",t);
				break;
        }
		case commove1:{
			bitre_range(t,xl,yl,xr,yr);
			Inputstrinwnd(20,4,65,"move1disp bitre,press enter to move root ",ss);
			move1_bitre("bitre",t);
			Clear_range(xl,yl,xr,yr);
			disp_bitre("bitre",t);
			break;
		}
        case commove2:{
       		Inputstrinwnd(20,4,60,"move2disp bitre ",ss);
       		move_bitre("bitre",t);
       		break;
       	}
	}
}

void  handle_bitre_menu(mymenu &bitremenu1,boolean &selectorno,pmenunode &pmenu,bitre &t)
{ 
//	with  bitremenu1 do
    Mymenu_selectmenu(bitremenu1,pmenu,selectorno);
    if (selectorno)
    	if (Mymenu_issubmenuitem(bitremenu1)){
    		Mymenu_disabledispsubmenu(bitremenu1,pmenu->numofmenu / 100);
            handle_bitre_event(pmenu,t);
        }else return;
    else return;
}

void  handle_bitre(bitre &t)
{
	bitre_graph_state=0;
	initial_bitre();
    bmp=Newmenu1(
         Newsubmenu1("建二叉树",
            Newmenu1(
              Newitem1("图形方式建二叉树"," ",0,0,comgrcreatebitre,
              Newitem1("扩展方式建二叉树"," ",0,0,comexcreatebitre,
              Newitem1("读文件"," ",0,0,comreadbitre,
              Newitem1("存盘"," ",0,0,comsavebitre,
              NULL))))),
         Newsubmenu1("显示二叉树",
            Newmenu1(
              Newitem1("设定显示区域"," ",0,0,comsetrange,
              Newitem1("按原定位置显示"," ",0,0,comdisp,
              Newitem1("平移显示  并清除原位"," ",0,0,commove1,
              Newitem1("平移显示  不清除原位"," ",0,0,commove2,
              NULL))))),
         Newsubmenu1("返回",NULL,NULL))));
    Mymenu_init(bitremenu1,bmp);
	do{
		handle_bitre_menu(bitremenu1,selectorno,pmenu,t);
	}while (strcmp(pmenu->menuname,"返回"));
	Mymenu_clearmainmenu(bitremenu1);
	Mymenu_reset_cursubmenu(bitremenu1);
}

void  get_bitre(bitre &t)
{
	handle_bitre(t);
}
   //======  } get bitre menu ======
   
/*void bitreinit(bitre &t)
{
	bitre_graph_state=0;
	initial_bitre();
    bmp=Newmenu1(
         Newsubmenu1("建二叉树",
            Newmenu1(
              Newitem1("图形方式建二叉树"," ",0,0,comgrcreatebitre,
              Newitem1("扩展方式建二叉树"," ",0,0,comexcreatebitre,
              Newitem1("读文件"," ",0,0,comreadbitre,
              Newitem1("存盘"," ",0,0,comsavebitre,
              NULL))))),
         Newsubmenu1("显示二叉树",
            Newmenu1(
              Newitem1("设定显示区域"," ",0,0,comsetrange,
              Newitem1("按原定位置显示"," ",0,0,comdisp,
              Newitem1("平移显示  并清除原位"," ",0,0,commove1,
              Newitem1("平移显示  不清除原位"," ",0,0,commove2,
              NULL))))),
         Newsubmenu1("返回",NULL,NULL))));
    Mymenu_init(bitremenu1,bmp);
   	for(i=0;i<4;i++) visitebtmodes[i]=onevisitemode;
       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_visitemode(visitebtmodes);
}*/

⌨️ 快捷键说明

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