【求助,非常急!】【代码检错不出错,但程序不能运行】
#define MaxVertices 1000#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include "CreatAdjLGraph.h"
void main()
{
AdjLGraph *G;
AdjInitiate(G);
int n,c;
printf("修道士与野人各有n人,请输入n:\n");
scanf("%d",&n);
printf("船只可容纳c人,请输入c:\n");
scanf("%d",&c);
CreatGraph(G, n,c);
}
//头文件
typedef struct
{int mon; //修道士人数
int sav; //野人人数
int pos; //船的位置
}DataType; //定义Data结构体类型(三元组)
typedef struct Node
{
int dest;
struct Node *next;
} Edge; //邻接边单链表结构体
typedef struct
{
DataType data;
int sorce;
Edge *adj;
} AdjLHeight; //邻接表数组的结构体
typedef struct
{
AdjLHeight a[MaxVertices];
int numOfVerts;
int numOfEdges;
} AdjLGraph; //邻接表结构体
void CreatData(int n,DataType* pos1,DataType* pos0)//创建所有有保险的Data(三元组)
{
int a=n,b=0;//n来源于人数
int i=0;
while(a<=b)
{
pos1[i].mon=a;
pos1[i].sav=b;
pos1[i].pos=1;
pos0[i].mon=a;
pos0[i].sav=b;
pos0[i].pos=0;
i++;
a--;
b++;
}
pos1[i+1].mon=-1;
pos0[i+1].mon=-1;
}
void InsertVertex(AdjLGraph *G, int i, DataType vertex)//插入顶点的功能函数
{
if(i >= 0 && i < MaxVertices)
{
G->a[i].data = vertex; //a[numOfVerts/2].data前是此岸顶点,后是彼岸顶点
G->numOfVerts++;
}
else printf("顶点越界");
}
void CreatVertex(AdjLGraph* G,DataType* pos1,DataType* pos0)//创建所有顶点,并赋予Data
{ int i=0;//i为顶点序号
for( ;pos1[i+1].mon=-1;i++)InsertVertex(G,i,pos1[i]);//插入此岸顶点
for( ;pos0[i+1].mon=-1;i++)InsertVertex(G,i,pos0[i]);//插入彼岸顶点
}
//以上是创建顶点,以下是创建边
void InsertEdge(AdjLGraph *G, int v1, int v2)//插入边的功能函数
{
Edge *p;
if(v1 < 0 || v1 >= G->numOfVerts || v2 < 0 || v2 >= G->numOfVerts)
{
printf("参数v1或v2越界出错!");
exit(0);
}
p = (Edge *)malloc(sizeof(Edge));
p->dest = v2;
p->next = G->a[v1].adj;
G->a[v1].adj = p;
G->numOfEdges++;
}
void CreatEdge(AdjLGraph *G,int c)//创建边,c为船可容纳的人数
{int i;
for(i=0;i==G->numOfVerts/2;i++)
{
for(int j=G->numOfVerts/2+1;j<=G->numOfVerts;j++)
{ while((G->a[i].data.mon-G->a[j].data.mon)+(G->a[i].data.sav-G->a[j].data.sav)<=c)//船上人数不可超过限制
{
if((G->a[i].data.mon-G->a[j].data.mon)>=(G->a[i].data.sav-G->a[j].data.sav)||(G->a[i].data.mon-G->a[j].data.mon)==0)
InsertEdge(G,i,j);//建立序号为i,j的顶点的边<i,j>,由此岸到彼岸的边
}
}
}
for(i=G->numOfVerts/2+1;i<=G->numOfVerts;i++)
{
for(int j=0;j<=G->numOfVerts/2;j++)
{
while((G->a[i].data.mon-G->a[j].data.mon)+(G->a[i].data.sav-G->a[j].data.sav)<=c)//船上人数不可超过限制
{
if((G->a[i].data.mon-G->a[j].data.mon)>=(G->a[i].data.sav-G->a[j].data.sav)||(G->a[i].data.mon-G->a[j].data.mon)==0)
InsertEdge(G,i,j);//建立序号为i,j的顶点的边<i,j>,由彼岸到此岸的边
}
}
}
}
//以上是创建边,以下是创建图
void AdjInitiate(AdjLGraph *G)//初始化图
{
int i;
G->numOfVerts = 0;
G->numOfEdges = 0;
for(i = 0; i < MaxVertices; i++)
{
G->a[i].sorce = i;
G->a[i].adj = NULL;
}
}
void CreatGraph( AdjLGraph *G, int n,int c)//创建图
{DataType pos1[500];
DataType pos0[500];
CreatData(n,pos1,pos0);//创建数据CreatData(int n,DataType* pos1,DataType* pos0)
CreatVertex(G,pos1,pos0);//创建顶点CreatVertex(AdjLGraph* G,DataType* pos1,DataType* pos0)
CreatEdge(G,c);//创建边CreatEdge(AdjLGraph *G,int c)
}