鱼C论坛

 找回密码
 立即注册
查看: 3498|回复: 4

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

[复制链接]
发表于 2013-10-6 11:09:15 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 付笑 于 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;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-6 11:34:48 | 显示全部楼层
知道错在哪里了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-6 16:29:14 | 显示全部楼层
付笑 发表于 2013-10-6 11:34
知道错在哪里了

那你就把帖子删了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-25 16:01:42 | 显示全部楼层
天文数字:cry
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-17 08:49:28 | 显示全部楼层
好文章转过来方便自己看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 04:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表