#include<iostream> using namespace std; #define INFINITY INT_MAX #define MAX_VERTEX_NUM 20 #define OK 1 #define ERROR 0 //typedef enum{DG , DN, UDG, UDN} GraphKind;//{有向图,有向网,无向图,无向网} typedef int VRType; typedef char InfoType; typedef int VertexType;//向量类型 typedef int Status; typedef struct ArcCell{ VRType adj; //无权图表示0和1,有权是权值 InfoType *info; //该弧的相关信息指针 }ArcCell,AdjMaxtrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct {//邻接图结构 VertexType vexs[MAX_VERTEX_NUM]; //顶点向量 AdjMaxtrix arcs; //邻接矩阵 int vexnum; //当前顶点数 int arcnum; //弧度数 GraphKind kind; //图的种类标志 }MGraph; Status LocateVex(MGraph G,VertexType v); Status CreateDG(MGraph &G)//创建有向图 { //和创建无向网完全一样,就是将权值赋值为1 int IncInfo; int i,j,k; int v1,v2; printf("请输入当前顶点数和弧度数,以及弧的相关信息:"); scanf("%d%d",&G.vexnum,&G.arcnum);//如果IncInfo,表示弧没有信息 scanf("%d",&IncInfo); printf("请依次输入顶点: "); for(i=0;i<G.vexnum;i++) scanf("%d",&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("请输入两个邻接点和权重 "); for(k=0;k<G.arcnum;k++)//根据弧度数输入顶点 { scanf("%d%d",&v1,&v2); i=LocateVex(G,v1); j=LocateVex(G,v2); G.arcs[i][j].adj=1;//将权值赋为1就行了 if(IncInfo) scanf("%c",&(*(G.arcs[i][j].info))); } return OK; } Status CreateDN(MGraph &G)//创建有向网 { int IncInfo; int i,j,k; int v1,v2; int w;//权重 printf("请输入当前顶点数和弧度数,以及弧的相关信息:"); scanf("%d%d",&G.vexnum,&G.arcnum);//如果IncInfo,表示弧没有信息 scanf("%d",&IncInfo); printf("请依次输入顶点: "); for(i=0;i<G.vexnum;i++) scanf("%d",&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("请输入两个邻接点及其权重 "); for(k=0;k<G.arcnum;k++)//根据弧度数输入顶点 { scanf("%d%d%d",&v1,&v2,&w); i=LocateVex(G,v1); j=LocateVex(G,v2); //删掉使矩阵对称的语句就行 G.arcs[i][j].adj=w; if(IncInfo) scanf("%c",&(*(G.arcs[i][j].info))); } return OK; } Status CreateUDG(MGraph &G)//创建无向图 { //和创建无向网完全一样,就是将权值赋值为1 int IncInfo; int i,j,k; int v1,v2; printf("请输入当前顶点数和弧度数,以及弧的相关信息:"); scanf("%d%d",&G.vexnum,&G.arcnum);//如果IncInfo,表示弧没有信息 scanf("%d",&IncInfo); printf("请依次输入顶点: "); for(i=0;i<G.vexnum;i++) scanf("%d",&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("请输入两个邻接点(无权值) "); for(k=0;k<G.arcnum;k++)//根据弧度数输入顶点 { scanf("%d%d",&v1,&v2); i=LocateVex(G,v1); j=LocateVex(G,v2); G.arcs[i][j].adj=1;//将权值赋为1就行了 G.arcs[j][i].adj=1; if(IncInfo) scanf("%c",&(*(G.arcs[i][j].info))); } return OK; } Status CreateUDN(MGraph &G)//无向网 { int IncInfo; int i,j,k; int v1,v2; int w;//权重 printf("请输入当前顶点数和弧度数,以及弧的相关信息:"); scanf("%d%d",&G.vexnum,&G.arcnum);//如果IncInfo,表示弧没有信息 scanf("%d",&IncInfo); printf("请依次输入顶点: "); for(i=0;i<G.vexnum;i++) scanf("%d",&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("请输入两个邻接点及其权重 "); for(k=0;k<G.arcnum;k++)//根据弧度数输入顶点 { scanf("%d%d%d",&v1,&v2,&w); i=LocateVex(G,v1); j=LocateVex(G,v2); G.arcs[i][j].adj=w;//给v1和v2赋上权重 G.arcs[j][i].adj=w; if(IncInfo) scanf("%c",&(*(G.arcs[i][j].info))); } return OK; }//CreateUDN Status CreateGraph(MGraph &G)//创建图的种类 { printf("请输入创建图的种类: "); printf("0表示有向图 1表示有向网 "); printf("2表示无向图 3表示无向网 "); printf("请选择:"); scanf("%d",&G.kind); switch(G.kind) { case DG: return CreateDG(G);break; case DN: return CreateDN(G);break; case UDG: return CreateUDG(G);break; case UDN: return CreateUDN(G);break; default: return ERROR; } } Status LocateVex(MGraph G,VertexType v)//得到当前顶点矩阵的位置 { for(int i=0;i<G.vexnum;i++) if(G.vexs[i]==v) return i; return -1; } Status GetVex(MGraph G,int v)//返回v的某个顶点 { if(v>=G.arcnum||v<0) exit(ERROR); return G.vexs[v]; } //Status PutVex(MGraph &G,VertexType v,VertexType &value)//将v的值赋值给value //{ // value=v; // return OK; //} Status FirstAdjVex(MGraph &G, VertexType v)//返回为的第一个邻接顶点的序列号 { int i=LocateVex(G,v); for(int k=0;k<G.vexnum;k++) if(G.arcs[i][k].adj==1) return G.vexs[k]; return ERROR; } Status NextAdjVex(MGraph G,VertexType v,VertexType w)//返回w的的下一个邻接顶点 { int i=LocateVex(G,v); int k=LocateVex(G,w); for(int j=0;j<G.vexnum;j++) if(G.arcs[i][j].adj==1&&j>k) return G.vexs[j]; return ERROR; } Status InsertVex(MGraph &G,VertexType v)//在G图中新添结点 { int i; if(G.vexnum==MAX_VERTEX_NUM)//矩阵存满 return ERROR; else G.vexs[G.vexnum]=v; G.vexnum++; for( i=0;i<G.vexnum;i++)//将新增的行初始化 G.arcs[G.vexnum-1][i].adj=0; for( i=0;i<G.vexnum;i++)//将新增的列初始化 G.arcs[i][G.vexnum-1].adj=0; return OK; } void DeleteVex(MGraph &G,VertexType v)//删除结点v,针对无向图和无向网 { int loc=LocateVex(G,v); int i,j; for(j=0;j<G.vexnum;j++)//删掉相关的弧 if(G.arcs[loc][j].adj==1) G.arcnum--; for(i=0;i<G.vexnum;i++)//将所在的列删除 for(j=loc;j<G.vexnum-1;j++) G.arcs[i][j]=G.arcs[i][j+1]; for(i=loc;i<G.vexnum-1;i++) for(j=0;j<G.vexnum-1;j++) G.arcs[i][j]=G.arcs[i+1][j]; for(i=loc;i<G.vexnum-1;i++) G.vexs[i]=G.vexs[i+1]; G.vexnum--;//结点数减一 } Status InsertArc(MGraph &G,VertexType v,VertexType w)//在G图中添加<v,w>序列 { int i,j;//获取w和v在矩阵当中的位置 i=LocateVex(G,v); j=LocateVex(G,w); G.arcs[i][j].adj=1; if(G.kind==UDN||G.kind==UDG)//如果是无向图或者无向网 G.arcs[j][i].adj=1; return OK; } Status DeleteArc(MGraph &G,VertexType v,VertexType w) { //删除弧<v,w>,若G是无向的则还需删除对称弧<w,v> int i,j; G.vexnum-=2; G.arcnum-=1; i=LocateVex(G,v); j=LocateVex(G,w); G.arcs[i][j].adj=0; if(G.kind==UDN||G.kind==UDG)//如果是无向图或者无向网,删除对称偶序 G.arcs[j][i].adj=0; return OK; } void PrintVex(MGraph G) { printf("邻接矩阵为: "); for(int i=0;i<G.vexnum;i++) { for(int j=0;j<G.vexnum;j++) printf("%d ",G.arcs[i][j].adj); printf(" "); } } int main() { VertexType v,w; VertexType m,n; MGraph G; CreateGraph(G); PrintVex(G); printf("获取v的邻接点w后面的一个邻接点: "); scanf("%d%d",&v,&w); printf("%d ",NextAdjVex(G,v,w)); scanf("%d%d",&m,&n);//重新增加弧 InsertArc(G,m,n); PrintVex(G); return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。