📄 linklist.h
字号:
#include "tools.h"
typedef int datatype;
//定义单链表
struct node
{
struct node * next;
datatype data;
boolean hvds;
datatype x,y;
};
typedef struct node * llink;
typedef llink link;
typedef link slnklist;
//定义双链表
struct dunode
{
struct dunode * prior,* next;
datatype data;
boolean hvds;
datatype x,y;
};
typedef struct dunode * dullink;
typedef dullink dulink;
typedef byte ndfd[200];
typedef byte ndfd0[800];
struct snodeptr
{
string ptrname;
link ptr;
struct snodeptr * next;
int x,y;
ndfd fd0;
};
typedef struct snodeptr * sptrlink;
struct dnodeptr
{
string ptrname;
dulink ptr;
struct dnodeptr * next;
int x,y;
ndfd fd0;
};
typedef struct dnodeptr *dptrlink;
int snum=0;
int dnum=0;
int linkcount=0;
sptrlink frstsptr=NULL;
dptrlink frstdptr=NULL;
int frstcx=80;
int frstcy=120;
const int ndhi=10;
const int sndwd=48;
const int dndwd=52;
const int arrlen=12;
const int nddtwd=40;
const int ptrwd=6;
const datatype num_of_end=-9999;
void print_llist(link l,boolean nohead);
void dispose_llist(link &l);
void create_hsingle_llist(link &l);
void display_hsingle_llist(string s,link l);
void create_cchsingle_llist(link &l);
void display_cchsingle_llist(string s,link l);
void create_single_llist(link &l);
void display_single_llist(string s,link l);
void create_ccsingle_llist(link &l);
void display_ccsingle_llist(string s,link l);
void create_hsllist(link &l);
void display_hsllist(string s,link l);
void create_sllist(link &l);
void display_sllist(string s,link l);
void create_cchsllist(link &l);
void display_cchsllist(string s,link l);
void create_ccsllist(link &l);
void display_ccsllist(string s,link l);
void disp_hsllist(string s,link l);
void disp_sllist(string s,link l);
void disp_cchsllist(string s,link l);
void disp_ccsllist(string s,link l);
void print_dullist(dulink l,boolean nohead);
void dispose_dullist(dulink &l);
void create_hdual_llist(dulink &l);
void display_hdual_llist(string s,dulink l);
void create_cchdual_llist(dulink &l);
void display_cchdual_llist(string s,dulink l);
void create_dual_llist(dulink &l);
void display_dual_llist(string s,dulink l);
void create_ccdual_llist(dulink &l);
void display_ccdual_llist(string s,dulink l);
void create_hdllist(dulink &l);
void display_hdllist(string s,dulink l);
void create_dllist(dulink &l);
void display_dllist(string s,dulink l);
void create_cchdllist(dulink &l);
void display_cchdllist(string s,dulink l);
void create_ccdllist(dulink &l);
void display_ccdllist(string s,dulink l);
void disp_hdllist(string s,dulink l);
void disp_dllist(string s,dulink l);
void disp_cchdllist(string s,dulink l);
void disp_ccdllist(string s,dulink l);
void load_hsllist_file(link &l,string ss);
void load_cchsllist_file(link &l,string ss);
void load_sllist_file(link &l,string ss);
void load_ccsllist_file(link &l,string ss);
void load_hdllist_file(dulink &l,string ss);
void load_cchdllist_file(dulink &l,string ss);
void load_dllist_file(dulink &l,string ss);
void load_ccdllist_file(dulink &l,string ss);
void load_hsllist(link &l);
void load_cchsllist(link &l);
void load_sllist(link &l);
void load_ccsllist(link &l);
void load_hdllist(dulink &l);
void load_cchdllist(dulink &l);
void load_dllist(dulink &l);
void load_ccdllist(dulink &l);
void save_hsllist_file(link l,string ss);
void save_cchsllist_file(link l,string ss);
void save_sllist_file(link l,string ss);
void save_ccsllist_file(link l,string ss);
void save_hdllist_file(dulink l,string ss);
void save_cchdllist_file(dulink l,string ss);
void save_dllist_file(dulink l,string ss);
void save_ccdllist_file(dulink l,string ss);
void save_hsllist(link l);
void save_cchsllist(link l);
void save_sllist(link l);
void save_ccsllist(link l);
void save_hdllist(dulink l);
void save_cchdllist(dulink l);
void save_dllist(dulink l);
void save_ccdllist(dulink l);
void create_sptr(sptrlink &sptr,string title);
void sptr_point_to(sptrlink &sptr,link sp);
void disp_sptr_atsnode(sptrlink &sptr,link sp);
boolean have_sptr(string title);
void create_dptr(dptrlink &sptr,string title);
void dptr_point_to(dptrlink &sptr,dulink sp);
void disp_dptr_atdnode(dptrlink &sptr,dulink sp);
boolean have_dptr(string title);
void comput_snode_card(llink &tt,int frstcx,int frstcy);
void comput_sllist_card(llink &tt,int frstcx,int frstcy);
void dis_llist1(llink tp,llink tt,int x1,int y1,boolean nohead,boolean is_first);
void dis_sllist(string s,llink tt,boolean nohead);
void disp_sllisthd(string s,llink tt,boolean havehead);
void display_llist_from(string s,link &l,boolean nohead,int x,int y);
void display_llist(string s,link &l,boolean nohead);
void comput_dnode_card(dullink &tt,int frstcx,int frstcy);
void comput_dllist_card(dullink &tt,int frstcx,int frstcy);
void dis_llist2(dullink tp,dullink tt,int x1,int y1,boolean nohead,boolean is_first);
void dis_dllist(string s,dullink tt,boolean nohead);
void disp_dllisthd(string s,dullink tt,boolean havehead);
void display_dullist_from(string s,dulink &l,boolean nohead,int x,int y);
void display_dullist(string s,dulink &l,boolean nohead);
void disp_card_sllist(string s,llink l,boolean havehead,int x,int y);
void disp_card_dllist(string s,dulink l,boolean havehead,int x,int y);
void disp_snode_data(link p);
void disp_dnode_data(dulink p);
void sllink_range(link l,int &xl,int &yl,int &xr,int &yr);
void clear_sllink_range(link l);
void dllink_range(dulink l,int &xl,int &yl,int &xr,int &yr);
void clear_dllink_range(dulink l);
void move_sllist(string s,link &l);
void move_hsllist(string s,link &l);
void move_ccsllist(string s,link &l);
void move_cchsllist(string s,link &l);
void move1_sllist(string s,link &l);
void move1_hsllist(string s,link &l);
void move1_ccsllist(string s,link &l);
void move1_cchsllist(string s,link &l);
void set_sllist_range(link &l);
void move_dllist(string s,dulink &l);
void move_hdllist(string s,dulink &l);
void move_ccdllist(string s,dulink &l);
void move_cchdllist(string s,dulink &l);
void move1_dllist(string s,dulink &l);
void move1_hdllist(string s,dulink &l);
void move1_ccdllist(string s,dulink &l);
void move1_cchdllist(string s,dulink &l);
void set_dllist_range(dulink &l);
void initial_llist();
void cur_snode_onoff(link p);
void cur_dnode_onoff(dulink p);
void put_snode_data(link &p,datatype x);
void put_dnode_data(dulink &p,datatype x);
void dispint_atsnode_angle(int num,link l,int angle);
void dispint_atdnode_angle(int num,dulink l,int angle);
void dispstr_atsnode_angle(string s,link l,int angle);
void dispstr_atdnode_angle(string s,dulink l,int angle);
void handle_sllist_event(pmenunode &pmenu,link &t);
void handle_sllist_menu(mymenu &linkmenu1,boolean &selectorno,pmenunode &pmenu,link &t);
void handle_sllist(link &t);
void get_hsllist(link &t);
void get_sllist(link &t);
void get_cchsllist(link &t);
void get_ccsllist(link &t);
void handle_dllist_event(pmenunode &pmenu,dulink &t);
void handle_dllist_menu(mymenu &linkmenu1,boolean &selectorno,pmenunode &pmenu,dulink &t);
void handle_dllist(dulink &t);
void get_hdllist(dulink &t);
void get_dllist(dulink &t);
void get_cchdllist(dulink &t);
void get_ccdllist(dulink &t);
void set_vsnode_mode();
void set_vdnode_mode();
void visite_snode(link &l,int i);
void visite_dnode(dulink &l,int i);
void reset_vsnode_mode(int i);
void reset_vdnode_mode(int i);
//link menu
const int comcreatelink=101;
const int comreadlink=103;
const int comsavelink=104;
const int comsetrange=105;
const int comdisp=106;
const int commove1=107;
const int commove2=108;
mymenu linkmenu1;
pmenunode bmp;
string ss,yn1;
char yn,ch;
boolean mnhavehead,mniscircle;
int mnlknum,n;
ndfd nd1,nd2,fd1,fd2;
ndfd0 dtfd,snd,dnd;
const int keystep=5;
const int bigstep=40;
const int dirnum=6;
const int mvstep=5;
typedef int move[dirnum][3];
const move mv={
{0,-1,up},
{0,1,down},
{-1,0,left},
{1,0,right},
{-4,0,bigleft},
{4,0,bigright}
};
int dxl,dyl,dxr,dyr,i,j;
unsigned int dir_keyset;
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 visitemode
{
boolean ifwrite,ifcurcovermove,ifcurcoverkeep,ifwaitkey,ifdelay,
ifuseptr,ifusenum,ifdispnum;
int delaytime,num,numangle;
string ptrname;
boolean sord;
union{
sptrlink sptr;
dptrlink dptr;
}ptrlink;
};
typedef struct visitemode vstmdarr[2][numofvstmode];
mymenu vstmenu2;
pmenunode vstmp2;
int vstno=1;
struct visitemode onevisitemode={true,true,false,true,false,true,true,true,
0,0,270,
"P",false,NULL
};
vstmdarr visitelinkmodes;
//初始化访问模式
void initial_visitemode(vstmdarr &visitemodes,int sd)
{
int i,j;
char stemp[255],sstemp[255];
j=sd;
for(i=0;i<numofvstmode;i++){
Convs(i+1,stemp);
if (j==1) strcpy(sstemp,"P");
else if (j==2) strcpy(sstemp,"Q");
strcat(sstemp,stemp);
strcpy(visitemodes[j-1][i].ptrname,sstemp);
if (j==1) visitemodes[j-1][i].sord=true;
else visitemodes[j-1][i].sord=false;
if (visitemodes[j-1][i].ifuseptr)
if (visitemodes[j-1][i].sord)
{if (!have_sptr(visitemodes[j-1][i].ptrname)) create_sptr(visitemodes[j-1][i].ptrlink.sptr,visitemodes[j-1][i].ptrname);}
else
{if (!have_dptr(visitemodes[j-1][i].ptrname)) create_dptr(visitemodes[j-1][i].ptrlink.dptr,visitemodes[j-1][i].ptrname);}
if (visitemodes[j-1][i].sord)
sptr_point_to(visitemodes[j-1][i].ptrlink.sptr,NULL);
else dptr_point_to(visitemodes[j-1][i].ptrlink.dptr,NULL);
if (visitemodes[j-1][i].ifusenum) visitemodes[j-1][i].num=0;
}
}
void reset_vsnode_mode(int i)
{
visitelinkmodes[0][i-1].num=0;
if (visitelinkmodes[0][i-1].ifuseptr) sptr_point_to(visitelinkmodes[0][i-1].ptrlink.sptr,NULL);
}
void reset_vdnode_mode(int i)
{
visitelinkmodes[1][i-1].num=0;
if (visitelinkmodes[1][i-1].ifuseptr) dptr_point_to(visitelinkmodes[1][i-1].ptrlink.dptr,NULL);
}
int rsgn(float r)
{
if (r<0) return -1;
else if (r>0) return 1;
else return 0;
}
void disp_card(int xm,int ym,int angle,int &x,int &y)
{
float ang;
if ((angle<60)&&(angle>=0)) angle=60;
else if ((angle>=121)&&(angle<=180)) angle=120;
else if ((angle>=181)&&(angle<=240)) angle=240;
else if ((angle>300)&&(angle<=360)) angle=300;
ang=angle*PI/180;
x=xm+Round(sndwd*cos(ang));
y=ym-rsgn(sin(ang))*3*ndhi / 2;
}
void dispint_atsnode_angle(int num,link l,int angle)
{
int xm,ym,x,y;
char stemp[255];
xm=l->x+sndwd / 2;
ym=l->y+ndhi / 2;
disp_card(xm,ym, angle, x,y);
Convs(num,stemp);
outtextxy(x,y,stemp);
}
void dispint_atdnode_angle(int num,dulink l,int angle)
{
int xm,ym,x,y;
char stemp[10];
xm=l->x+sndwd / 2;
ym=l->y+ndhi / 2;
disp_card(xm,ym, angle, x,y);
Convs(num,stemp);
outtextxy(x,y,stemp);
}
void dispstr_atsnode_angle(string s,link l,int angle)
{
int xm,ym,x,y;
xm=l->x+sndwd / 2;
ym=l->y+ndhi / 2;
disp_card(xm,ym, angle, x,y);
outtextxy(x,y,s);
}
void dispstr_atdnode_angle(string s,dulink l,int angle)
{
int xm,ym,x,y;
xm=l->x+sndwd / 2;
ym=l->y+ndhi / 2;
disp_card(xm,ym, angle, x,y);
outtextxy(x,y,s);
}
void visite_snode(link &l,int i)
{
char ss[255]="",s1[255]="";
char stemp[255],sstemp[255];
strcpy(ss,"访问模式");
Convs(i,stemp);
strcat(ss,stemp);
strcat(ss," 访问元素方式:");
if (l!=NULL){
if (visitelinkmodes[0][i-1].ifwrite) strcat(s1," 打印元素");
if (visitelinkmodes[0][i-1].ifcurcovermove ||visitelinkmodes[0][i-1].ifcurcoverkeep) strcat(s1," 显示光标");
if (visitelinkmodes[0][i-1].ifuseptr) strcat(s1," 用指示器");
if (visitelinkmodes[0][i-1].ifusenum) strcat(s1," 显示序号");
if (visitelinkmodes[0][i-1].ifwaitkey) strcat(s1," 按键继续");
else if (visitelinkmodes[0][i-1].ifdelay) {
Convs(visitelinkmodes[0][i-1].delaytime,sstemp);
strcat(s1," delay ");
strcat(s1,sstemp);
strcat(s1," ms to cont.");
}
strcat(ss," by");
strcat(ss,s1);
Menu(ss);
if (visitelinkmodes[0][i-1].ifwrite) printf("%d ",l->data);
if (visitelinkmodes[0][i-1].ifcurcovermove ||visitelinkmodes[0][i-1].ifcurcoverkeep)
cur_snode_onoff(l);
if (visitelinkmodes[0][i-1].ifuseptr) sptr_point_to(visitelinkmodes[0][i-1].ptrlink.sptr,l);
if (visitelinkmodes[0][i-1].ifusenum) visitelinkmodes[0][i-1].num=visitelinkmodes[0][i-1].num+1;
if (visitelinkmodes[0][i-1].ifusenum && visitelinkmodes[0][i-1].ifdispnum)
dispint_atsnode_angle(visitelinkmodes[0][i-1].num,l,visitelinkmodes[0][i-1].numangle);
if (visitelinkmodes[0][i-1].ifwaitkey) getch();
else if (visitelinkmodes[0][i-1].ifdelay) delay(visitelinkmodes[0][i-1].delaytime);
if (visitelinkmodes[0][i-1].ifcurcovermove)
cur_snode_onoff(l);
}
}
void visite_dnode(dulink &l, int i)
{
char ss[255]="",s1[255]="",stemp[255],sstemp[255];
Convs(i,stemp);
strcpy(ss,"访问模式");
strcat(ss,stemp);
strcat(ss," 访问元素方式:");
if (l!=NULL){
if (visitelinkmodes[1][i-1].ifwrite) strcat(s1," 打印元素");
if (visitelinkmodes[1][i-1].ifcurcovermove ||visitelinkmodes[1][i-1].ifcurcoverkeep) strcat(s1," 显示光标");
if (visitelinkmodes[1][i-1].ifuseptr) strcat(s1," 用指示器");
if (visitelinkmodes[1][i-1].ifusenum) strcat(s1," 显示序号");
if (visitelinkmodes[1][i-1].ifwaitkey) strcat(s1," 按键继续");
else if (visitelinkmodes[1][i-1].ifdelay) {
Convs(visitelinkmodes[1][i-1].delaytime,sstemp);
strcat(s1," delay ");
strcat(s1,sstemp);
strcat(s1," ms to cont.");
}
strcat(ss," by");
strcat(ss,s1);
Menu(ss);
if (visitelinkmodes[1][i-1].ifwrite) printf("%d ",l->data);
if (visitelinkmodes[1][i-1].ifcurcovermove ||visitelinkmodes[1][i-1].ifcurcoverkeep)
cur_dnode_onoff(l);
if (visitelinkmodes[1][i-1].ifuseptr) dptr_point_to(visitelinkmodes[1][i-1].ptrlink.dptr,l);
if (visitelinkmodes[1][i-1].ifusenum) visitelinkmodes[1][i-1].num=visitelinkmodes[1][i-1].num+1;
if (visitelinkmodes[1][i-1].ifusenum && visitelinkmodes[1][i-1].ifdispnum)
dispint_atdnode_angle(visitelinkmodes[1][i-1].num,l,visitelinkmodes[1][i-1].numangle);
if (visitelinkmodes[1][i-1].ifwaitkey) getch();
else if (visitelinkmodes[1][i-1].ifdelay) delay(visitelinkmodes[1][i-1].delaytime);
if (visitelinkmodes[1][i-1].ifcurcovermove)
cur_dnode_onoff(l);
}
}
void rangeerror()
{
printf("\007");
Error("数据范围错!");
}
void handle_visite2_event(pmenunode &pmenu,vstmdarr &visitemodes,int sd)
{
int xl,yl,xr,yr,state;
boolean sv,haveerr;
char stemp[255],sstemp[255];
if ((pmenu->command>=800)&&(pmenu->command<=815)){
switch (pmenu->command){
case comselectmodeno:{
Convs(numofvstmode,sstemp);
strcpy(stemp,"选择采用的访问方式号[1..");
strcat(stemp,sstemp);
strcat(stemp,"] ");
do {
Editintinwnd(20,4,60,stemp,vstno);
if (! ((vstno>=1)&&(vstno<=numofvstmode))) rangeerror();
}while (!((vstno>=1)&&(vstno<=4)));
break;
}
case comwritedata:{
do {
state=2-visitemodes[sd-1][vstno-1].ifwrite;
Editintinwnd(20,4,60,"1--打印元素值 2--不打印元素值",state);
if (!((state>=1)&&(state<=2))) rangeerror();
else if (state==1) visitemodes[sd-1][vstno-1].ifwrite=true;
else visitemodes[sd-1][vstno-1].ifwrite=false;
}while (!((state>=1)&&(state<=2)));
break;
}
case comusecurmove:{
do{
state=3-(2*visitemodes[sd-1][vstno-1].ifcurcovermove+visitemodes[sd-1][vstno-1].ifcurcoverkeep);
Editintinwnd(10,4,70,"1--覆盖光棒然后移去 2--使用光棒不移去 3--不使用光棒",state);
if (!((state>=1)&&(state<=3))) rangeerror();
else{
if (state==1) visitemodes[sd-1][vstno-1].ifcurcovermove=true;
else visitemodes[sd-1][vstno-1].ifcurcovermove=false;
if (state==2) visitemodes[sd-1][vstno-1].ifcurcoverkeep=true;
else visitemodes[sd-1][vstno-1].ifcurcoverkeep=false;
}
}while (!((state>=1)&&(state<=3)));
break;
}
case comwaitkey:{
do{
state=3-(2*visitemodes[sd-1][vstno-1].ifwaitkey+visitemodes[sd-1][vstno-1].ifdelay);
Editintinwnd(10,4,70,"1--等待按键继续 2--自动延迟时间 3--访问后不停顿",state);
if (!((state>=1)&&(state<=3))) rangeerror();
else {
if (state==1) visitemodes[sd-1][vstno-1].ifwaitkey=true;
else visitemodes[sd-1][vstno-1].ifwaitkey=false;
if (state==2) visitemodes[sd-1][vstno-1].ifdelay=true;
else visitemodes[sd-1][vstno-1].ifdelay=false;
if (state==2)
do{
Editintinwnd(20,6,60,"延迟时间[0..10000]毫秒: ",visitemodes[sd-1][vstno-1].delaytime);
if ((visitemodes[sd-1][vstno-1].delaytime<0)||(visitemodes[sd-1][vstno-1].delaytime>10000)) rangeerror();
}while (!((visitemodes[sd-1][vstno-1].delaytime<0)&&(visitemodes[sd-1][vstno-1].delaytime<=10000)));
}
}while (!((state>=1)&&(state<=3)));
break;
}
case comuseptr:{
do{
state=2-visitemodes[sd-1][vstno-1].ifuseptr;
visitemodes[sd-1][vstno-1].ifuseptr=false;
Editintinwnd(20,4,60,"1--使用指示器 2--不使用指示器",state);
if (state==1){
do{
Convs(vstno,stemp);
strcpy(visitemodes[sd-1][vstno-1].ptrname,"P");
strcpy(visitemodes[sd-1][vstno-1].ptrname,stemp);
haveerr=false;
Editstrinwnd(20,6,60,"所使用的指示器名称为:",visitemodes[sd-1][vstno-1].ptrname);
if (visitemodes[sd-1][vstno-1].sord && have_sptr(visitemodes[sd-1][vstno-1].ptrname)||! visitemodes[sd-1][vstno-1].sord && have_dptr(visitemodes[sd-1][vstno-1].ptrname)){
rangeerror();
haveerr=true;
}
else visitemodes[sd-1][vstno-1].ifuseptr=true;
}while (haveerr);
}else visitemodes[sd-1][vstno-1].ifuseptr=false;
}while (!((state>=1)&&(state<=2)));
break;
}
case comneedno:{
do{
state=2-visitemodes[sd-1][vstno-1].ifusenum;
Editintinwnd(20,4,60,"1--显示序号 2--不显示序号",state);
if (state==1)
do{
Editintinwnd(20,6,60,"显示序号的角度[0..360]:",visitemodes[sd-1][vstno-1].numangle);
if ((visitemodes[sd-1][vstno-1].numangle<0)||(visitemodes[sd-1][vstno-1].numangle>360)) rangeerror();
}while (!((visitemodes[sd-1][vstno-1].numangle>=0) && (visitemodes[sd-1][vstno-1].numangle<=360)));
if (state==1) visitemodes[sd-1][vstno-1].ifusenum=true;
else visitemodes[sd-1][vstno-1].ifusenum=false;
}while (!((state>=1)&&(state<=2)));
break;
}
}
}
}
void handle_visite2_menu(mymenu &vstmenu2,boolean &selectorno,pmenunode &pmenu,vstmdarr &visitemodes,int sd)
{
for(j=0;j<2;j++)
for(i=0;i<4;i++)
visitelinkmodes[j][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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -