温习数据结构之图的邻接矩阵的相关操作2011.10.22
//图的数组(邻接矩阵)存储
#define INFINITY INT_MAX //用整型最大值
#define MAX_VERTEX_NUM 20 //最大顶点个数
typedef enum{DG,DN,AG,AN}GraphKind; //有向图,有向网,无向图,无向网
typedef struct
{
VRType adj;//顶点关系,对无权图,用1(是)或0(否)表示相邻否
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;
int LocateVex(MGraph G,VertexType u)
{//操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回-1
int i;
for(i=0;i<G.vexnum;++i)
if(strcmp(u,G.vexs[i])==0)
return i;
return -1;
}
Status CreateFAG(MGraph *G)
{//采用数组(邻接矩阵)表示法,由文件构造没有相关信息的无向图G
int i,j,k;
char filename[13];
VertexType va,vb;
FILE*graphlist;
printf("请输入数据文件名:");
scanf("%s",filename);
graphlist=fopen(filename,"r");
fscanf(graphlist,"%d",&(*G).vexnum);
fscanf(graphlist,"%d",&(*G).arcnum);
for(i=0,i<(*G).vexnum;++i) //初始化邻接矩阵
for(j=0;j<(*G).vexnum;++j)
{
(*G).arcs[i][j].adj=0;
(*G).arcs[i][j].info=NULL;//没有相关信息
}
for(k=0;k<(*G).arcnum;++k)
{
fscanf(graphlist,"%s%s",va,va);
i=LocateVex(*G,va);
j=LocateVex(*G,vb);
(*G).arcs[i][j].adj=(*G).arcs[j][i]=1; //无向图
}
fclose(graphlist);
(*G).kind=AG;
return OK;
}
Status CreateDG(MGraph *G)
{ //构造有向图
int i,j,k,l,IncInfo;
char s[MAX_INFO],*info;
VertexType va,vb;
printf("请输入有向图的顶点,弧数,弧是否含其他信息(是:1,否:0):");
scanf("%d,%d,%d",&(*G).vexnum,&(*G).arcnum,&IncIfo);
printf("请输入%d个顶点的值(%d个字符)\n",(*G).vexnum,(*G),MAX_NAME);
for(i=0;i<(*G).vexnum;++i)
scanf("%s",(*G).vexs[i]);
for(i=0;i<(*G).vexnum;++i) //初始化邻接矩阵
for(j=0;j<(*G).vexnum;++j)
{
(*G).arcs[i][j].adj=0; //图
(*G).arcs[i][j].info=NULL;
}
printf("请输入%d条弧的弧尾 弧头(以空格为间隔):\n",(*G).arcnum);
for(k=0;k<(*G).arcnum;++j)
{
scanf("%s%s%*c",va,vb); //%*C吃掉回车符
i=LocateVex(*G,va);
j=LocateVex(*G,vb);
(*G).arcs[i][j].adj=1; //有向图
if(IncInfo)
{
printf("请输入该弧的相关信息(%d个字符):",MAX_INF);
gets(s);
l=strlen(s);
if(l)
{
info=(char*)malloc((l+1)*sizeof(char));
strcpy(info,s);
(*G).arcs[i][j].info=info; //有向
}
}
}
(*G).kind=DG;
}
Status CreateDN(MGraph*G)
{//采用数组(邻接矩阵)表示法,构造有向网G
int i,j,w,IncInfo;
char s[MAX_INFO],*info;
VertexType va,vb;
printf("请输入有向网G的顶点数,弧数,弧是否含有其它信(是:1,否:0): ");
scanf("%d,%d,%d",&(*G).vexnum,&(*G).arcnum,&IncInfo);
printf("请输入%d个顶点的值(%d个字符)\n",(*G).vexnum,(*G),MAX_NAME);
for(i=0;i<(*G).vexnum;++i)
scanf("%s",(*G).vexs[i]);
for(i=0;i<(*G).vexnum;++i) //初始化
for(j=0;<(*G).vexnum;++j)
{
(*G).arcs[i][j].adj=INFINITY; //网
(*G).arcs[i][j].info=NULL;
}
printf("请输入%d条弧的弧尾 弧头 权值(以空格作为间隔): \n",(*G).arcnum);
for(k=0;k<(*G).arcnum;++k)
{
scanf("%s%s%d%*c",va,vb,&w);//%*c吃掉回车符
i=LocateVex(*G,va);
j=LocateVex(*G,vb);
(*G).arcs[i][j].adj=w; //有向网
if(IncInfo)
{
printf("请输入该弧的相关信息(<%d个字符): ",MAX_INFO);
gets(s);
w=strlen(s);
if(w);
{
info=(char*)malloc((w+1)*sizeof(char));
strcpy(info,s);
(*G).arcs[i][j].info=info; //有向
}
}
}
(*G).kind=DN;
return OK;
}
Status CreateAN(MGraph *G)
{ /* 采用数组(邻接矩阵)表示法,构造无向网G。算法7.2 */
int i,j,k,w,IncInfo;
char s[MAX_INFO],*info;
VertexType va,vb;
printf("请输入无向网G的顶点数,边数,边是否含其它信息(是:1,否:0): ");
scanf("%d,%d,%d",&(*G).vexnum,&(*G).arcnum,&IncInfo);
printf("请输入%d个顶点的值(<%d个字符):\n",(*G).vexnum,MAX_NAME);
for(i=0;i<(*G).vexnum;++i) /* 构造顶点向量 */
scanf("%s",(*G).vexs[i]);
for(i=0;i<(*G).vexnum;++i) /* 初始化邻接矩阵 */
for(j=0;j<(*G).vexnum;++j)
{
(*G).arcs[i][j].adj=INFINITY; /* 网 */
(*G).arcs[i][j].info=NULL;
}
printf("请输入%d条边的顶点1 顶点2 权值(以空格作为间隔): \n",(*G).arcnum);
for(k=0;k<(*G).arcnum;++k)
{
scanf("%s%s%d%*c",va,vb,&w); /* %*c吃掉回车符 */
i=LocateVex(*G,va);
j=LocateVex(*G,vb);
(*G).arcs[i][j].adj=(*G).arcs[j][i].adj=w; /* 无向 */
if(IncInfo)
{
printf("请输入该边的相关信息(<%d个字符): ",MAX_INFO);
gets(s);
w=strlen(s);
if(w)
{
info=(char*)malloc((w+1)*sizeof(char));
strcpy(info,s);
(*G).arcs[i][j].info=(*G).arcs[j][i].info=info; /* 无向 */
}
}
}
(*G).kind=AN;
return OK;
}
我是一名在校大学生,热爱编程,虽然起步晚了些,但我会努力的。呵呵!
数据结构 算法

浙公网安备 33010602011771号