温习数据结构之图的邻接矩阵的相关操作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; }
我是一名在校大学生,热爱编程,虽然起步晚了些,但我会努力的。呵呵!
数据结构 算法