|
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;
- }
复制代码 |
|