付笑 发表于 2013-10-6 11:09:15

构造无向网出错,是怎么回事,求解?

本帖最后由 付笑 于 2013-10-6 11:12 编辑

问题:

1.网的顶点,初始赋值的是时候是{v0,v1,v2,v3,v4,v5,v6,v7,v8}
   可是经调试,运行到代码   “G->arcs=G->arcs;//无向,两个单元的信息相同” 时,有几次竟然改变了,顶点中的一些值,结果造成输出的顶点错误,而且也造成邻接矩阵的值也没有完全正确,就是有些边没有加上,

请问是什么原因了? 同样的代码我在构造另一个图是却是有正确的结果,不解



要构造的网如下:
http://blog.fishc.com/wp-content/uploads/2013/06/22.jpg

构造代码如下:

#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;
};


typedef struct ArcCell //边或弧信息结构
{
VRType adj;//VRType 是顶点关系类型。对无权图,用1或0
//表示相邻否;对带权图,则为权值类型。

InfoType *info;//该弧相关信息指针
}ArcCell,AdjMatrix; //邻接矩阵

typedef struct
{
VertexType vexs;//顶点向量
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;
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.name)==0)//
{
return i;
}



}
return -1;
}



//==============================================================构造无向网G 方法3
void CreateUDN3(MGraph *G)
{
//采用数组表示法(邻接矩阵),构造有向图
int i,j,k,IncInfo;//IncInfo为0则弧不含相关信息;
VRType w,weight;
VertexType verchar,vchar1,vchar2;//verchar 为顶点数组,vchar1,vchar2为边的起点和终点数组

VertexType v1,v2;//顶点类型

char c;

for(i=0;i<9;i++)
{
verchar.name='V';
verchar.name='\0';
c='0'+i;
c='\0';
strcat(verchar.name,c);
}

//下面是每条边的起点,终点,和权值
vchar1=verchar; vchar2=verchar;weight=1;
vchar1=verchar; vchar2=verchar;weight=5;
vchar1=verchar; vchar2=verchar;weight=3;
vchar1=verchar; vchar2=verchar;weight=7;
vchar1=verchar; vchar2=verchar;weight=5;
vchar1=verchar; vchar2=verchar;weight=1;
vchar1=verchar; vchar2=verchar;weight=7;
vchar1=verchar; vchar2=verchar;weight=2;
vchar1=verchar; vchar2=verchar;weight=3;
vchar1=verchar; vchar2=verchar;weight=3;
vchar1=verchar; vchar2=verchar;weight=6;
vchar1=verchar; vchar2=verchar;weight=9;
vchar1=verchar; vchar2=verchar;weight=5;
vchar1=verchar; vchar2=verchar;weight=2;
vchar1=verchar; vchar2=verchar;weight=7;
vchar1=verchar; vchar2=verchar;weight=4;


G->vexnum=9;//输入顶点数
G->arcnum=16;//边数
IncInfo=0;

//给各个顶点赋值
for(i=0;i<G->vexnum;i++)
{

G->vexs=verchar;
}

for(i=0;i<G->vexnum;i++)//初始化二维邻接矩阵
{
for(j=0;j<G->vexnum;j++)
{
G->arcs.adj=INFINITY;
G->arcs.info=NULL;//无相关信息
}
}

//构造边
for(k=0;k<G->arcnum;k++)
{


v1=vchar1;v2=vchar2;w=weight;
i=LocateVex(*G,v1);//顶点1的序号
j=LocateVex(*G,v2);//顶点2的序号
G->arcs.adj=w;//图

if(IncInfo)
{
InputArc(&G->arcs.info);
}

G->arcs=G->arcs;//无向,两个单元的信息相同

}
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.name);
}



printf("\n下面是邻接矩阵\n");

for(i=0;i<G.vexnum;i++)
{
for(j=0;j<G.vexnum;j++)
{
printf("%6d ",(G).arcs.adj);
}
printf("\n");

}
}




main()
{
MGraph G;


CreateUDN3(&G);
print(G);
return 0;
}

付笑 发表于 2013-10-6 11:34:48

知道错在哪里了

牡丹花下死做鬼 发表于 2013-10-6 16:29:14

付笑 发表于 2013-10-6 11:34 static/image/common/back.gif
知道错在哪里了

那你就把帖子删了吧

欧阳柏 发表于 2013-10-25 16:01:42

天文数字:cry

猪猪BBUn咕咕 发表于 2013-11-17 08:49:28

好文章转过来方便自己看
页: [1]
查看完整版本: 构造无向网出错,是怎么回事,求解?