以邻接矩阵作为存储结构实现图的创建与基本操作:
typedef int Status;
typedef int VRType;
typedef char InfoType;
typedef char VertexType;
/*①图的邻接矩阵存储结构定义*/
typedef struct ArcCell
{
//VRType是顶点的关系类型,对无权图用1或0表示是否相邻,对带权图(网)用权值
VRType adj;
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;
#include<stdio.h> #include<stdlib.h> #include<string.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define INFINITY 0 //最大值无穷 #define MAX_VERTEX_NUM 20 //最大顶点数 typedef int Status; typedef int VRType; typedef char InfoType; typedef char VertexType[MAX_VERTEX_NUM]; typedef enum {DG,DN,UDG,UDN} GraphKind; //{0有向图、1有向网、2无向图、3无向网} /*①图的邻接矩阵存储结构定义*/ 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; //构造有向图 Status CreateDG(MGraph &G); //构造有向网 Status CreateDN(MGraph &G); //构造无向图 Status CreateUDG(MGraph &G); //构造无向网 Status CreateUDN(MGraph &G); //1-创建图 Status CreateGraph(MGraph &G); //2-销毁图 Status DestroyGraph(MGraph &G); //3-获取顶点位置 Status LocateVex(MGraph G, VertexType u); //构造有向图 Status CreateDG(MGraph &G) { int i,j,k,IncInfo,w; VertexType v1,v2; printf("请输入有向图G的顶点数,边数,边是否含有其他信息(是:1,否:0):\n"); scanf("%d%d%d",&G.vexnum ,&G.arcnum,&IncInfo); printf("请输入顶点的值:\n"); 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; } for(k=0;k<G.arcnum;++k) { scanf("%s%s%d",&v1,&v2,&w); i=LocateVex(G,v1); //弧尾 j=LocateVex(G,v2); //弧头 G.arcs[i][j].adj=w; if(IncInfo) { printf("请输入该边的相关信息:"); gets(G.arcs[i][j].info); } } G.kind=DG; return OK; } //构造有向网 Status CreateDN(MGraph &G) { int i,j,k,w,IncInfo; VertexType v1,v2; printf("请输入有向网G的顶点数,边数,边是否含有其他信息(是:1,否:0):\n"); scanf("%d%d%d",&G.vexnum ,&G.arcnum,&IncInfo); 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条弧的弧尾 弧头 权值(以空格作为间隔):\n",G.arcnum); for(k=0;k<G.arcnum;++k) { scanf("%s%s%d%",&v1,&v2,&w); i=LocateVex(G,v1); j=LocateVex(G,v2); G.arcs[i][j].adj=w;//有向网 if(IncInfo) { printf("请输入该边的相关信息:"); gets(G.arcs[i][j].info); } } G.kind=DN; return OK; } //构造无向图 Status CreateUDG(MGraph &G) { int i,j,k,IncInfo,w; VertexType v1,v2; printf("请输入无向图G的顶点数,边数,边是否含有其他信息(是:1,否:0):\n"); scanf("%d%d%d",&G.vexnum,&G.arcnum,&IncInfo); printf("请输入顶点的值:\n"); 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; } for(k=0;k<G.arcnum;++k) { scanf("%s%s%d",&v1,&v2,&w); i=LocateVex(G,v1); j=LocateVex(G,v2); G.arcs[i][j].adj=w;//无向图 if(IncInfo) { printf("请输入该边的相关信息:"); gets(G.arcs[i][j].info); } G.arcs[j][i]=G.arcs[i][j]; } G.kind=UDG; return OK; } //构造无向网 Status CreateUDN(MGraph &G) { int i,j,k,IncInfo,w; VertexType v1,v2; printf("请输入无向网G的顶点数,边数,边是否含有其他信息(是:1,否:0):\n"); scanf("%d%d%d",&G.vexnum ,&G.arcnum,&IncInfo); printf("请输入顶点的值:\n"); for(i=0;i<G.vexnum;++i) scanf("%s",&G.vexs); 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) { scanf("%s%s%d",&v1,&v2,&w); i=LocateVex(G,v1); j=LocateVex(G,v2); G.arcs[i][j].adj =w; if(IncInfo) { printf("请输入该边的相关信息:"); gets(G.arcs[i][j].info); } G.arcs[j][i]=G.arcs[i][j]; } G.kind=UDN; return OK; }//CreateUDN //1-创建图 Status CreateGraph(MGraph &G) { printf("***********图的创建与实现**************\n"); printf("1.有向图\n2.有向网\n3.无向图\n4.无向网\n请选择需要创建的图的类型:"); scanf("%d",&G.kind); switch (G.kind-1){ case DG:return CreateDG(G); case DN:return CreateDN(G); case UDG:return CreateUDG(G); case UDN:return CreateUDN(G); default:return ERROR; } }//CreateGraph //2-销毁图 Status DestroyGraph(MGraph &G) { int i,j; if(G.kind<2)//有向 { for(i=0;i<G.vexnum;i++)//释放相关信息(如果有) for(j=0;j<G.vexnum;j++) if(G.arcs[i][j].adj==1&&G.kind==0||G.arcs[i][j].adj!=INFINITY&&G.kind==1)//有向图的弧||有向网的弧 if(G.arcs[i][j].info)//有相关信息 { free(G.arcs[i][j].info); G.arcs[i][j].info=NULL; } } else//无向 { for(i=0;i<G.vexnum;i++)//释放相关信息(如果有) for(j=i+1;j<G.vexnum;j++) if(G.arcs[i][j].adj==1&&G.kind||G.arcs[i][j].adj!=INFINITY&&G.kind==3)//无向图的边||无向网的边 if(G.arcs[i][j].info)//有相关信息 { free(G.arcs[i][j].info); G.arcs[i][j].info=G.arcs[j][i].info=NULL; } } G.vexnum=0; G.arcnum=0; printf("图销毁成功!"); printf("\n\n"); return OK; } //3-获取顶点位置 Status LocateVex(MGraph G, VertexType u) { int i; for(i=0;i<G.vexnum;++i) if(strcmp(u,G.vexs[i])==0) return i; return FALSE; } void main() { MGraph G; CreateGraph(G); }