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

📄 menu.h

📁 数据结构 Balance-Bi-Tree 数据结构 Balance-Bi-Tree 数据结构 Balance-Bi-Tr
💻 H
字号:

//头文件
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<bios.h>
#include<dos.h>

//宏定义

//宏定义菜单信息
#define FILE 1
#define NEWBUILD 2
#define EDIT 3
#define BIOPT 4
#define HELP 5
#define FILE_FRESH 11
#define FILE_NEW 12
#define FILE_OPEN 13
#define FILE_SAVE 14
#define FILE_SAVEAS 15
#define FILE_EXIT 16
#define NEWBUILD_RNDNUM 21
#define NEWBUILD_INPUTNUM 22
#define EDIT_SEARCH 31
#define EDIT_ADD 32
#define EDIT_DEL 33
#define BIOPT_RANDNUM 41
#define BIOPT_COMPOUND 42
#define BIOPT_DEPART 43
#define HELP_HELP 51
#define HELP_ABOUT 52

//宏定义键盘键位信息
#define UP_KEY 0x4800
#define DOWN_KEY 0x5000
#define LEFT_KEY 0x4b00
#define RIGHT_KEY 0x4d00
#define F10_KEY 0x4400
#define RETURN_KEY 0x1c0d
#define BS_KEY 0x0e08
#define ESC_KEY 0x011b


//菜单结构定义
typedef struct menu{
	int ID;
	int x,y;
	int active;
	char content[20];
	struct menu *pSubMenu;
	int n_SubMenu;
}MENU;

//主菜单及子菜单初始化
MENU FileSub[6]={
	{ FILE_FRESH,3,2,0,"Refresh",NULL,0},
	{ FILE_NEW,3,3,0,"New",NULL,0},
	{ FILE_OPEN,3,4,0,"Open..",NULL,0},
	{ FILE_SAVE,3,5,0,"Save",NULL,0},
	{ FILE_SAVEAS,3,6,0,"Save As..",NULL,0},
	{ FILE_EXIT,3,7,0,"Exit",NULL,0}
};

MENU NewBuildSub[2]={
	{ NEWBUILD_RNDNUM,16,2,0,"RandData",NULL,0},
	{ NEWBUILD_INPUTNUM,16,3,0,"InputData",NULL,0},
};

MENU EditSub[3]={
	{ EDIT_SEARCH,33,2,0,"Search-Node",NULL,0},
	{ EDIT_ADD,33,3,0,"Add-Node",NULL,0},
	{ EDIT_DEL,33,4,0,"Delete-Node",NULL,0}

};

MENU BiOperateSub[3]={
	{ BIOPT_RANDNUM,48,2,0,"Rnd-Data",NULL,0},
	{ BIOPT_COMPOUND,48,3,0,"Compound-Tree",NULL,0},
	{ BIOPT_DEPART,48,4,0,"Depart-Tree",NULL,0}
};

MENU HelpSub[2]={
	{ HELP_HELP,65,2,0,"Help",NULL,0},
	{ HELP_ABOUT,65,3,0,"About..",NULL,0}
};

MENU MainMenu[5]={
	{ FILE,3,1,0,"File",FileSub,6},
	{ NEWBUILD,16,1,0,"NewBuild",NewBuildSub,2},
	{ EDIT,33,1,0,"Edit",EditSub,3},
	{ BIOPT,48,1,0,"BiOperate",BiOperateSub,3},
	{ HELP,65,1,0,"Help",HelpSub,2}
};

//绘制菜单
void MenuDraw(MENU *pMenu,int n)
{
	window(1,1,80,25);
	for(;n>0;n--){
	  textbackground(pMenu->active? GREEN:WHITE);
	  textcolor(RED);
	  gotoxy(pMenu->x,pMenu->y);
	  cprintf("%s",pMenu->content);
	  pMenu++;
	}
}

//绘制主菜单
void MenuDraw_M(MENU *pMenu,int n)
{
	window(1,1,80,25);
	for(;n>0;n--){
	  textbackground(pMenu->active? GREEN:CYAN);
	  textcolor(RED);
	  gotoxy(pMenu->x,pMenu->y);
	  cprintf("%s",pMenu->content);
	  pMenu++;
	}
}

//绘制界面框架
void FrameDraw()
{
	int i,j;
	textbackground(BLUE);
	clrscr();
	_setcursortype(_NOCURSOR);
	window(1,1,80,1);
	textbackground(CYAN);
	clrscr();
	window(1,25,80,25);
	clrscr();
	textbackground(WHITE);
	textcolor(BLACK);
	window(1,2,80,2);
	clrscr();
	window(1,24,80,24);
	clrscr();
	window(1,2,1,24);
	clrscr();
	window(80,2,80,24);
	clrscr();
	window(1,1,80,25);
	for(i=2;i<80;i++){
	  gotoxy(i,2);
	  cprintf("%c",205);
	  gotoxy(i,24);
	  cprintf("%c",205);
	}
	for(j=3;j<24;j++){
	  gotoxy(1,j);
	  cprintf("%c",186);
	  gotoxy(80,j);
	  cprintf("%c",186);
	}
	gotoxy(1,2);cprintf("%c",201);
	gotoxy(80,2);cprintf("%c",187);
	gotoxy(1,24);cprintf("%c",200);
	gotoxy(80,24);cprintf("%c",188);

	textbackground(LIGHTBLUE);
	window(2,3,54,23);
	clrscr();
	textbackground(YELLOW);
	window(56,3,79,12);
	clrscr();
	textbackground(GREEN);
	window(56,14,79,23);
	clrscr();
	window(1,1,80,25);
	textcolor(BLUE);
	textbackground(WHITE);
	for(j=3;j<24;j++){
	  gotoxy(55,j);
	  cprintf("%c",186);
	}
	for(i=56;i<80;i++){
	  gotoxy(i,13);
	  cprintf("%c",205);
	}

	gotoxy(55,2);cprintf("%c",203);
	gotoxy(55,24);cprintf("%c",202);
	gotoxy(55,13);cprintf("%c",204);
	textcolor(BLACK);
	gotoxy(80,13);cprintf("%c",185);
	textcolor(BLUE);

	gotoxy(60,2);cprintf("Input Information");
	gotoxy(60,13);cprintf("Node Information");

	textbackground(CYAN);
	textcolor(BLUE);
	gotoxy(4,25);
	cprintf("F10--(Menu)");
	gotoxy(19,25);
	cprintf("%c",26);
	gotoxy(20,25);
	cprintf("%c",27);
	gotoxy(21,25);
	cprintf("%c",24);
	gotoxy(22,25);
	cprintf("%c",25);
	gotoxy(23,25);
	cprintf("--(Move)");
	gotoxy(35,25);
	cprintf("%c",25);
	gotoxy(36,25);
	cprintf("--(RandNum)");
	gotoxy(53,25);
	cprintf("Enter--(OK)");
	gotoxy(67,25);
	cprintf("ESC--(Back)");

	MenuDraw_M(MainMenu,5);
}

//查找活动菜单
int SearchActiveMenu(MENU *pMenu,int n)
{
	for(n--;n>=0;n--){
		if(pMenu[n].active)
		  break;  }
	return(n);
}

//选择菜单
int MenuSelect()
{
	int b_Exit=0;
	int result=0;
	int b_SubMenu=0;
	int left=1,top=1,right=1,bottom=1,n;
	char buffer[500];
	MainMenu[0].active=1;
	MenuDraw_M(MainMenu,5);
	while(!b_Exit){
	  switch(bioskey(0)){
		case F10_KEY:
		  if(b_SubMenu){
			b_SubMenu=0;
			puttext(left,top,right,bottom,buffer);
		  }
		  break;
		case ESC_KEY:
		  n=SearchActiveMenu(MainMenu,5);
		  MainMenu[n].active=0;
		  if(b_SubMenu)
			puttext(left,top,right,bottom,buffer);
		  MenuDraw_M(MainMenu,5);
		  result=0;
		  b_Exit=1;
		  break;
		case UP_KEY:
		  if(b_SubMenu){
			int m;
			n=SearchActiveMenu(MainMenu,5);
			m=SearchActiveMenu(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
			(MainMenu[n].pSubMenu+m)->active=0;
			if(m==0)
			  (MainMenu[n].pSubMenu+MainMenu[n].n_SubMenu-1)->active=1;
			else
			  (MainMenu[n].pSubMenu+m-1)->active=1;
			MenuDraw(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
		  }
		  break;
		case DOWN_KEY:
		  if(b_SubMenu){
			int m;
			n=SearchActiveMenu(MainMenu,5);
			m=SearchActiveMenu(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
			(MainMenu[n].pSubMenu+m)->active=0;
			if(m==(MainMenu[n].n_SubMenu-1))
			MainMenu[n].pSubMenu->active=1;
			else
			  (MainMenu[n].pSubMenu+m+1)->active=1;
			MenuDraw(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
		  }
		  n=SearchActiveMenu(MainMenu,5);
		  if(!b_SubMenu){
			b_SubMenu=1;
			left=MainMenu[n].pSubMenu->x;
			top=2;
			right=left+15;
			bottom=top+MainMenu[n].n_SubMenu-1;
			gettext(left,top,right,bottom,buffer);
			window(left,top,right,bottom);
			textbackground(WHITE);
			clrscr();
			MenuDraw(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
		  }
		  break;
		case LEFT_KEY:
		  n=SearchActiveMenu(MainMenu,5);
		  MainMenu[n].active=0;
		  n=(n==0)?4:(n-1);
		  MainMenu[n].active=1;
		  MenuDraw_M(MainMenu,5);
		  if(b_SubMenu){
			puttext(left,top,right,bottom,buffer);
			left=MainMenu[n].pSubMenu->x;
			top=2;
			right=left+15;
			bottom=top+MainMenu[n].n_SubMenu-1;
			gettext(left,top,right,bottom,buffer);
			window(left,top,right,bottom);
			textbackground(WHITE);
			clrscr();
			MenuDraw(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
		  }
		  break;
		case RIGHT_KEY:
		  n=SearchActiveMenu(MainMenu,5);
		  MainMenu[n].active=0;
		  n=(n+1)%5;
		  MainMenu[n].active=1;
		  MenuDraw_M(MainMenu,5);
		  if(b_SubMenu){
			puttext(left,top,right,bottom,buffer);
			left=MainMenu[n].pSubMenu->x;
			top=2;
			right=left+15;
			bottom=top+MainMenu[n].n_SubMenu-1;
			gettext(left,top,right,bottom,buffer);
			window(left,top,right,bottom);
			textbackground(WHITE);
			clrscr();
			MenuDraw(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
		  }
		  break;
		case RETURN_KEY:
		  n=SearchActiveMenu(MainMenu,5);
		  if(!b_SubMenu){
			b_SubMenu=1;
			left=MainMenu[n].pSubMenu->x;
			top=2;
			right=left+15;
			bottom=top+MainMenu[n].n_SubMenu-1;
			gettext(left,top,right,bottom,buffer);
			window(left,top,right,bottom);
			textbackground(WHITE);
			clrscr();
			MenuDraw(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
		  }
		  else{
			int m;
			m=SearchActiveMenu(MainMenu[n].pSubMenu,MainMenu[n].n_SubMenu);
			result=(MainMenu[n].pSubMenu+m)->ID;
			MainMenu[n].active=0;
			puttext(left,top,right,bottom,buffer);
			MenuDraw_M(MainMenu,5);
			b_Exit=1;
		  }
		  break;
	  }
	}
	return (result);
}

//输出帮助界面
void printhelp()
{
	textbackground(GREEN);
	textcolor(BLACK);	
	window(1,2,80,25);
	clrscr();
	gotoxy(20,4);
	cprintf("This is a programe about balances bi-tree.");
	gotoxy(20,6);
	cprintf("You may prefer to the following tips:");
	gotoxy(20,9);
	cprintf("F10-----Menu");
	gotoxy(20,11);
	cprintf("%c%c%c%c-----Move",26,27,24,25);
	gotoxy(20,13);
	cprintf("%c-----RndNum",25);
	gotoxy(20,15);
	cprintf("Enter-----OK");
	gotoxy(20,17);
	cprintf("ESC-----Back");
	gotoxy(20,19);	
	cprintf("Before adding or deleting, you must creat tree.");
	_setcursortype(_NOCURSOR);
}

//输出关于界面
void printabout()
{
	textbackground(GREEN);
	textcolor(RED);	
	window(1,2,80,25);
	clrscr();
	gotoxy(25,5);
	cprintf("Balances Bi-Tree Display System");
	gotoxy(33,10);
	cprintf("(Version 1.0)");
	gotoxy(27,23);
	cprintf("Copyright @ Hawkyang 9-2005");
	_setcursortype(_NOCURSOR);
}

//输出封面
void printcover()
{
	textbackground(CYAN);
	textcolor(RED);	
	window(1,1,80,25);
	clrscr();
	gotoxy(32,4);
	cprintf("Welcome To The");
	gotoxy(25,7);
	cprintf("Balances Bi-Tree Display System");
	gotoxy(33,12);
	cprintf("(Version 1.0)");
	gotoxy(29,23);
	cprintf("Press any key . . . . . .");
	_setcursortype(_NOCURSOR);
	getch();
}


//输出结点
void printnode(int x,int y,int data,int bf)
{
    if(data>99){
      printf("\nError!\n");
      return;
    }
    else{
	textcolor(WHITE);
	gotoxy(x,y);
	cprintf("%c",218);
	gotoxy(x+3,y);
	cprintf("%c",196);
	gotoxy(x+4,y);
	cprintf("%c",191);
	gotoxy(x,y+1);
	cprintf("%c",179);
	gotoxy(x,y+2);
	cprintf("%c",192);
	gotoxy(x+1,y+2);
	cprintf("%c",196);
	gotoxy(x+2,y+2);
	cprintf("%c",196);
	gotoxy(x+3,y+2);
	cprintf("%c",196);
	gotoxy(x+4,y+1);
	cprintf("%c",179);
	gotoxy(x+4,y+2);
	cprintf("%c",217);
	gotoxy(x+2,y+1);
	cprintf("%d",data);
	gotoxy(x+2,y);
	textcolor(RED);
	cprintf("%d",bf);
	textcolor(WHITE);
    }
}

//输出结点(用于查找)
void printtnode(int x,int y,int data,int bf)
{
    if(data>99){
      printf("\nError!\n");
      return;
    }
    else{
	textcolor(RED);
	gotoxy(x,y);
	cprintf("%c",218);
	gotoxy(x+3,y);
	cprintf("%c",196);
	gotoxy(x+4,y);
	cprintf("%c",191);
	gotoxy(x,y+1);
	cprintf("%c",179);
	gotoxy(x,y+2);
	cprintf("%c",192);
	gotoxy(x+1,y+2);
	cprintf("%c",196);
	gotoxy(x+2,y+2);
	cprintf("%c",196);
	gotoxy(x+3,y+2);
	cprintf("%c",196);
	gotoxy(x+4,y+1);
	cprintf("%c",179);
	gotoxy(x+4,y+2);
	cprintf("%c",217);
	gotoxy(x+2,y+1);
	cprintf("%d",data);
	gotoxy(x+2,y);
	textcolor(GREEN);
	cprintf("%d",bf);
	textcolor(WHITE);
    }
}

//输出平衡二叉树的结点
void printree(int x,int y,int a[32],int d[32],int v[32])
{

    int i;
    clrscr();
	for(i=16;i<31;i++)
		if(a[i]==1){
		   textcolor(WHITE);
		   textbackground(LIGHTBLUE);
		   window(3,3,54,23);
		   clrscr();
		   gotoxy(4,5);
		   printf("Sorry! Nodes are too many.");
		   gotoxy(4,7);
		   printf("They can't be displayed correctly!");
		   return;
		}
    if(x<22 || y>10){
      printf("\nError!\n");
      return;
    }
    else{
	if(a[1])
	  printnode(x,y,d[1],v[1]);
	if(a[2]){
	  gotoxy(x-2,y+3);
	  cprintf("%c",47);
	  printnode(x-9,y+4,d[2],v[2]);}
	if(a[3]){
	  gotoxy(x+6,y+3);
	  cprintf("%c",92);
	  printnode(x+9,y+4,d[3],v[3]);}
	if(a[4]){
	  gotoxy(x-11,y+7);
	  cprintf("%c",47);
	  printnode(x-17,y+8,d[4],v[4]);}
	if(a[5]){
	  gotoxy(x-4,y+7);
	  cprintf("%c",92);
	  printnode(x-6,y+8,d[5],v[5]);}
	if(a[6]){
	  gotoxy(x+8,y+7);
	  cprintf("%c",47);
	  printnode(x+5,y+8,d[6],v[6]);}
	if(a[7]){
	  gotoxy(x+15,y+7);
	  cprintf("%c",92);
	  printnode(x+17,y+8,d[7],v[7]);}
	if(a[8]){
	  gotoxy(x-18,y+11);
	  cprintf("%c",47);
	  printnode(x-21,y+12,d[8],v[8]);}
	if(a[9]){
	  gotoxy(x-14,y+11);
	  cprintf("%c",92);
	  printnode(x-16,y+12,d[9],v[9]);}
	if(a[10]){
	  gotoxy(x-6,y+11);
	  cprintf("%c",47);
	  printnode(x-9,y+12,d[10],v[10]);}
	if(a[11]){
	  gotoxy(x-2,y+11);
	  cprintf("%c",92);
	  printnode(x-4,y+12,d[11],v[11]);}
	if(a[12]){
	  gotoxy(x+5,y+11);
	  cprintf("%c",47);
	  printnode(x+3,y+12,d[12],v[12]);}
	if(a[13]){
	  gotoxy(x+9,y+11);
	  cprintf("%c",92);
	  printnode(x+8,y+12,d[13],v[13]);}
	if(a[14]){
	  gotoxy(x+17,y+11);
	  cprintf("%c",47);
	  printnode(x+15,y+12,d[14],v[14]);}
	if(a[15]){
	  gotoxy(x+21,y+11);
	  cprintf("%c",92);
	  printnode(x+20,y+12,d[15],v[15]);}
    }
}

//查找平衡二叉树中的结点
void printsearchtree(int x,int y,int a[32],int d[32],int v[32],int &snode)
{
    clrscr();
    if(x<22 || y>10){
      printf("\nError!\n");
      return;
    }
    else{
	if(a[1])
	  if(d[1]==snode)
		printtnode(x,y,d[1],v[1]);
	  else
	    printnode(x,y,d[1],v[1]);
	if(a[2]){
	  gotoxy(x-2,y+3);
	  cprintf("%c",47);
	  if(d[2]==snode)
	    printtnode(x-9,y+4,d[2],v[2]);
	  else
	    printnode(x-9,y+4,d[2],v[2]);
	}
	if(a[3]){
	  gotoxy(x+6,y+3);
	  cprintf("%c",92);
	  if(d[3]==snode)
	    printtnode(x+9,y+4,d[3],v[3]);
	  else
	    printnode(x+9,y+4,d[3],v[3]);
	}
	if(a[4]){
	  gotoxy(x-11,y+7);
	  cprintf("%c",47);
	  if(d[4]==snode)
	     printtnode(x-17,y+8,d[4],v[4]);
	  else
	     printnode(x-17,y+8,d[4],v[4]);
	}
	if(a[5]){
	  gotoxy(x-4,y+7);
	  cprintf("%c",92);
	  if(d[5]==snode)
	    printtnode(x-6,y+8,d[5],v[5]);
	  else
	    printnode(x-6,y+8,d[5],v[5]);
	}
	if(a[6]){
	  gotoxy(x+8,y+7);
	  cprintf("%c",47);
	  if(d[6]==snode)
	     printtnode(x+5,y+8,d[6],v[6]);
	  else
	    printnode(x+5,y+8,d[6],v[6]);
	}
	if(a[7]){
	  gotoxy(x+15,y+7);
	  cprintf("%c",92);
	  if(d[7]==snode)
	    printtnode(x+17,y+8,d[7],v[7]);
	  else
	    printnode(x+17,y+8,d[7],v[7]);
	}
	if(a[8]){
	  gotoxy(x-18,y+11);
	  cprintf("%c",47);
	  if(d[8]==snode)
	   printtnode(x-21,y+12,d[8],v[8]);
	  else
	   printnode(x-21,y+12,d[8],v[8]);
	}
	if(a[9]){
	  gotoxy(x-14,y+11);
	  cprintf("%c",92);
	  if(d[9]==snode)
		printtnode(x-16,y+12,d[9],v[9]);
	  else
	    printnode(x-16,y+12,d[9],v[9]);
	}
	if(a[10]){
	  gotoxy(x-6,y+11);
	  cprintf("%c",47);
	  if(d[10]==snode)
	  printtnode(x-9,y+12,d[10],v[10]);
	  else
	  printnode(x-9,y+12,d[10],v[10]);
	}
	if(a[11]){
	  gotoxy(x-2,y+11);
	  cprintf("%c",92);
	  if(d[11]==snode)
	   printtnode(x-4,y+12,d[11],v[11]);
	  else
	  printnode(x-4,y+12,d[11],v[11]);
	}
	if(a[12]){
	  gotoxy(x+5,y+11);
	  cprintf("%c",47);
	  if(d[12]==snode)
	  printtnode(x+3,y+12,d[12],v[12]);
	  else
	  printnode(x+3,y+12,d[12],v[12]);
	}
	if(a[13]){
	  gotoxy(x+9,y+11);
	  cprintf("%c",92);
	  if(d[13]==snode)
	  printtnode(x+8,y+12,d[13],v[13]);
	  else
	  printnode(x+8,y+12,d[13],v[13]);
	}
	if(a[14]){
	  gotoxy(x+17,y+11);
	  cprintf("%c",47);
	  if(d[14]==snode)
	   printtnode(x+15,y+12,d[14],v[14]);
	  else
	   printnode(x+15,y+12,d[14],v[14]);
	}
	if(a[15]){
	  gotoxy(x+21,y+11);
	  cprintf("%c",92);
	  if(d[15]==snode)
	   printtnode(x+20,y+12,d[15],v[15]);
	  else
	   printnode(x+20,y+12,d[15],v[15]);
	}
    }
}

⌨️ 快捷键说明

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