【文件属性】:
文件名称:数据结构 图的结构 邻接表的实现
文件大小:28KB
文件格式:DOC
更新时间:2013-07-05 15:55:22
邻接表
这是我的作业。。。。希望对各位有#include
#include
#include
#define SIZE (xsize*ysize+1)
//一系列全局变量便于传递参数
int *location,*way,
xsize,ysize,firstx,firsty,
noworder;
int getnum (void);//取数函数,取数成功返回1,否则返回-1
int init (void); //初始化函数,申请数组空间,以及初始化数组,
//申请成功返回1,否则返回-1
int play (void); //下棋函数,下棋成功返回1,否则返回-1
int back (void); //悔棋函数,悔棋成功返回1,否则返回-1
void print (void);//输出函数,顺序输出马踩的棋盘一维坐标
////////////////////////////
void main ()
{
int canget,caninit,canplay,canback;
do
canget=getnum();
while(canget==-1);
caninit=init();
if(caninit==-1)
exit (0);//终止程序运行
for (;noworder0 && way[location[noworder]]<=8)
{
canplay=play();
if(canplay==-1)
way[location[noworder]]++;//当前方法不可行,改变方法
}
else
{
canback=back();
if(canback==-1)
{
printf("不可能遍历整个棋盘!\n");
getchar();getchar();
exit (0);//当程序不能再悔棋时终止程序运行
}
else
way[location[noworder]]++; //当前方法不可行,改变方法
}
}
if(noworder==SIZE-1)//已经遍历整个棋盘
print();
getchar();getchar();
}
////////////////////////////
int getnum()
{
printf("输入棋盘规格(假定无0点)和入口坐标:\n");
printf("输入棋盘规格xsize=");
scanf("%d",&xsize);
printf("输入棋盘规格ysize=");
scanf("%d",&ysize);
printf("输入入口坐标x=");
scanf("%d",&firstx);
printf("输入入口坐标y=");
scanf("%d",&firsty);
if (firstx>xsize || firsty>ysize || firstx<=0 || firsty<=0 || xsize <3 || ysize<3)
{
printf("输入有误,重新输入:\n\n\a");
return -1;
}
else
return 1;
}
////////////////////////////
int init (void)
{
location=(int *)malloc(sizeof(int)*SIZE);
way=(int *)malloc(sizeof(int)*SIZE);
if(location==NULL || way==NULL)
{
printf("系统申请内存空间失败!程序执行终止!\a");
return -1;
}
for(int i=0;i",location[i]);
printf("OK\n");
}
}
////////////////////////////
int play()
{
int x,y,nextlocation;
//一维坐标值à二维坐标值
x=location[noworder] % xsize;
if(x==0)
x=xsize;
y=(location[noworder]-x)/xsize+1;
switch (way[location[noworder]])
{
case 1 : x+=2;y-=1;break;
case 2 : x+=2;y+=1;break;
case 3 : x+=1;y+=2;break;
case 4 : x-=1;y+=2;break;
case 5 : x-=2;y+=1;break;
case 6 : x-=2;y-=1;break;
case 7 : x-=1;y-=2;break;
case 8 : x+=1;y-=2;break;
}
nextlocation = xsize*(y-1)+x;
if (x>xsize || y>ysize || x<=0 || y<=0 || way[nextlocation]!=0)//越界或重复
return -1;
else//下棋
{
noworder++;
location[noworder] = nextlocation;
way[location[noworder]]=1;
return 1;
}
}
////////////////////////////
int back (void)
{
if(noworder==1)//不能再悔棋,不能遍历
return -1;
else
{
way[location[noworder]]=0;//注意不能搞错语句顺序
location[noworder]=0;
noworder--;
return 1;
}
}用