数据结构与算法-图的邻接矩阵

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#include

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define OVERFLOW -1
#define ERROR 0

typedef int Status;
#define VRType int
#define VertexType int

#define INFINITY 32767 //最大值 无穷
#define MAX_VERTEX_NUM 20 //最大顶点个数
typedef enum {DG,DN,UDG,UDN}GraphKind ;//{有向图,有向网,无向图,无向网}
typedef struct ArcCell
{
VRType adj;
// InfoType *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
VertexType vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;
GraphKind kind;
}MGraph;

Status LocateVex(MGraph G,int v)
{
int i;
for(i=0;i{
if(G.vexs[i]==v)
return i;
}
return -1;
}

Status CreateUDN(MGraph &G)
{
//采用数组(邻接矩阵)表示法,构造图G
int i,j,k;
int v1,v2,w;
printf("请输入定点数,边数(用,间隔):");
scanf("%d,%d",&G.vexnum,&G.arcnum);
printf("请输入顶点数据:");

//构造顶点向量
for(i=0;iscanf("%d",&G.vexs[i]);

//初始化邻接矩阵
for(i=0;ifor (j=0;j//G.arcs[i][j]={INFINITY,Null};
G.arcs[i][j].adj =INFINITY;

//构造邻接矩阵
for(k=0;k{
printf("请输入边的起点,终点和权值(用,隔开)");
scanf("%d,%d,%d",&v1,&v2,&w); //输入一条边依附的顶点和权值
i=LocateVex(G,v1);
j=LocateVex(G,v2);
if(i!=-1&&j!=-1)
{
G.arcs[i][j].adj=w;
G.arcs[j][i].adj=G.arcs[i][j].adj ;
}
else
printf("输入错误");
}
return OK;
}

//打印邻接矩阵
int PrintMGraph(MGraph G)
{
int i=0,j;

printf("%4c",' ');
for(i=0;iprintf("%4d",G.vexs[i]);
printf("\n");
for(i=0;iprintf("%4c",'-');
printf("\n");
for(i=0;i{
printf("%2d",G.vexs[i]);
printf("%2c",'|');
for(j=0;j{
if(G.arcs[i][j].adj!=32767)
printf("%4d",G.arcs[i][j].adj);
else
printf(" ∞");
}
printf("\n");
}
return 0;

}
//========================================================
//选作
// 求下标为v的顶点的第1个邻接点,返回该邻接点在顶点数组中的下标;若找不到这样的邻接点,返回-1。
int FirstAdjVex(MGraph G,int v)
{
int i;
for(i=0;i{
if(G.arcs[v][i].adj!=32767)
return i;
}
return -1;

}

//求下标为v的顶点相对于下标为w的顶点的下一个邻接点,返回该邻接点的下标;若找不到这样的邻接点,返回-1。
int NextAdjVex(MGraph G,int v,int w)
{
int i;
for(i=w+1;i{
if(G.arcs[v][i].adj!=32767)
return i;
}
return -1;
}
//主函数
int main()
{
MGraph G;
int v,k,t,w;
CreateUDN(G);
printf("该图的

邻接矩阵如下:\n");
PrintMGraph(G);
printf("请输入要查找第一个邻结点的下标:");
scanf("%d",&v);
k=FirstAdjVex(G,v);
if(k==-1)
printf("此结点无邻结点\n");
else
printf("下标为%d的顶点的第1个邻接点在顶点数组中的下标是:%d\n",v,k);
printf("下标为v的顶点相对于下标为w的顶点的下一个邻接点,请输入v,w的值用“,”隔开:");
scanf("%d,%d",&v,&w);
t=NextAdjVex(G,v,w);
if(t==-1)
printf("相对于下标为%d的顶点相对于下标为%d的顶点的无下一个邻接点\n",v,w);
else
printf("下标为%d的顶点相对于下标为%d的顶点的下一个邻接点是:%d\n",v,w,t);
return 0;
}

相关文档
最新文档