本帖最后由 付笑 于 2013-10-6 11:12 编辑
问题:
1.网的顶点,初始赋值的是时候是{v0,v1,v2,v3,v4,v5,v6,v7,v8}
可是经调试,运行到代码 “G->arcs[j][i]=G->arcs[j];//无向,两个单元的信息相同” 时,有几次竟然改变了,顶点中的一些值,结果造成输出的顶点错误,而且也造成邻接矩阵的值也没有完全正确,就是有些边没有加上,
请问是什么原因了? 同样的代码我在构造另一个图是却是有正确的结果,不解
[/i]
要构造的网如下:
构造代码如下:
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#define INFINITY 9999
#define MAX_INFO 20
#define MAX_VERTEX_NUM 20
#define MAX_NAME 9
typedef int VRType;
typedef char InfoType;
typedef enum{DG,DN,UDG,UDN} GraphKind;//{有向图,有向网,无向图,无向网}
struct VertexType
{
char name[MAX_NAME];
};
typedef struct ArcCell //边或弧信息结构
{
VRType adj;//VRType 是顶点关系类型。对无权图,用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;
//==============================================与顶点类型配套的访问顶点的函数
void Visit(VertexType ver)
{
printf("%s",ver.name);
}
//==================================================与顶点类型配套的输入顶点信息的函数
void Input(VertexType *ver)
{
scanf("%s",ver->name);
}
//==================================================与弧或边类型配套的输入弧或边的相关信息的函数
void InputArc(InfoType **arc)
{
char s[MAX_INFO];
int m;
printf("请输入该弧(边)的相关信息(<%d个字符):",MAX_INFO);
gets(s);
m=strlen(s);
if(m>0)
{
*arc=(char*)malloc((m+1)*sizeof(char));
strcpy(*arc,s);
}
}
void OutputArc(InfoType *arc)
{
printf("%s\n",arc);
}
//============================================ =====求顶点在图中的位置
int LocateVex(MGraph G,VertexType u)
{
//初始条件:图G存在,u和G中顶点有相同的特征(顶点名称相同)
//操作结果:若G中存在顶点u,则返回该顶点在图中位置(序号);否则返回-1
//位置就是顶点数组的下标
int i;
for(i=0;i<MAX_VERTEX_NUM;i++)
{
if(strcmp(u.name,G.vexs[i].name)==0)//
{
return i;
}
}
return -1;
}
//==============================================================构造无向网G 方法3
void CreateUDN3(MGraph *G)
{
//采用数组表示法(邻接矩阵),构造有向图
int i,j,k,IncInfo;//IncInfo为0则弧不含相关信息;
VRType w,weight[16];
VertexType verchar[9],vchar1[16],vchar2[16];//verchar 为顶点数组,vchar1,vchar2为边的起点和终点数组
VertexType v1,v2;//顶点类型
char c[5];
for(i=0;i<9;i++)
{
verchar[i].name[0]='V';
verchar[i].name[1]='\0';
c[0]='0'+i;
c[1]='\0';
strcat(verchar[i].name,c);
}
//下面是每条边的起点,终点,和权值
vchar1[0]=verchar[0]; vchar2[0]=verchar[1];weight[0]=1;
vchar1[1]=verchar[0]; vchar2[1]=verchar[2];weight[1]=5;
vchar1[2]=verchar[1]; vchar2[2]=verchar[2];weight[2]=3;
vchar1[3]=verchar[1]; vchar2[3]=verchar[3];weight[3]=7;
vchar1[4]=verchar[1]; vchar2[4]=verchar[4];weight[4]=5;
vchar1[5]=verchar[2]; vchar2[4]=verchar[3];weight[5]=1;
vchar1[6]=verchar[2]; vchar2[6]=verchar[5];weight[6]=7;
vchar1[7]=verchar[3]; vchar2[7]=verchar[4];weight[7]=2;
vchar1[8]=verchar[3]; vchar2[8]=verchar[6];weight[8]=3;
vchar1[9]=verchar[4]; vchar2[9]=verchar[5];weight[9]=3;
vchar1[10]=verchar[4]; vchar2[10]=verchar[6];weight[10]=6;
vchar1[11]=verchar[4]; vchar2[11]=verchar[7];weight[11]=9;
vchar1[12]=verchar[5]; vchar2[12]=verchar[7];weight[12]=5;
vchar1[13]=verchar[6]; vchar2[13]=verchar[7];weight[13]=2;
vchar1[14]=verchar[6]; vchar2[14]=verchar[8];weight[14]=7;
vchar1[15]=verchar[7]; vchar2[15]=verchar[8];weight[15]=4;
G->vexnum=9;//输入顶点数
G->arcnum=16;//边数
IncInfo=0;
//给各个顶点赋值
for(i=0;i<G->vexnum;i++)
{
G->vexs[i]=verchar[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;//无相关信息
}
}
//构造边
for(k=0;k<G->arcnum;k++)
{
v1=vchar1[k];v2=vchar2[k];w=weight[k];
i=LocateVex(*G,v1);//顶点1的序号
j=LocateVex(*G,v2);//顶点2的序号
G->arcs[i][j].adj=w;//图
if(IncInfo)
{
InputArc(&G->arcs[i][j].info);
}
G->arcs[j][i]=G->arcs[i][j];//无向,两个单元的信息相同
}
G->kind=UDN;
}
//==============================================================打印图
void print(MGraph G)
{
int i,j;
printf("\n无向网顶点如下:\n");
for(i=0;i<G.vexnum;i++)
{
printf("%s \n",(G).vexs[i].name);
}
printf("\n下面是邻接矩阵\n");
for(i=0;i<G.vexnum;i++)
{
for(j=0;j<G.vexnum;j++)
{
printf("%6d ",(G).arcs[i][j].adj);
}
printf("\n");
}
}
main()
{
MGraph G;
CreateUDN3(&G);
print(G);
return 0;
}
|