/*
图:
数组表示法创建
*/
#include
using namespace std;
#define INFINITY 95533 // 最大值
#define MAX_VERTEX_NUM 20 //最大顶点个数
#define VRType int //顶点关系类型,对无权图,用1或0表示相邻否;对带权图,则为权值类型
#define InfoType int //
#define VErtexType int //图顶点类型
typedef enum {DG,DN,UDG,UDN}GraphKind; //图的种类(有向图,有向网,无向图,无向网)****枚举类型enum
typedef struct ArcCell {
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;
int LocateVex(MGraph *G,VErtexType point) // 查找相应的顶点在顶点向量中的位置
{
for(int i=0;i< G->vexnum;i++){
if(G->vexs[i] == point){
return i;
}
}
}
void CreateDG(MGraph* &G) // 有向图
{
int vexnum,arcnum; // 有向图的顶点数和边数
VErtexType origin, terminus; //边的起点,终点
cout<<"输入有向图的顶点数和边数:";
cin >> vexnum >> arcnum;
G->vexnum = vexnum;
G->arcnum = arcnum;
cout<
for( i=0;i
}
for( i=0;i
G->arcs[i][j].adj = INFINITY;
G->arcs[i][j].info = NULL;
G->arcs[j][i].adj = INFINITY;
G->arcs[j][i].info = NULL;
}
}
cout<<"输入"<
i = LocateVex(G,origin);
j = LocateVex(G,terminus);
G->arcs[i][j].adj = 0;
}
}
void CreateDN(MGraph* &G) // 有向网
{
int vexnum,arcnum,weight; // 有向网的顶点数 边数 权重
VErtexType origin, terminus; //边的起点,终点
cout<<"输入有向网的顶点数和边数:";
cin >> vexnum >> arcnum;
G->vexnum = vexnum;
G->arcnum = arcnum;
cout<
for( i=0;i
}
for( i=0;i
G->arcs[i][j].adj = INFINITY;
G->arcs[i][j].info = NULL;
G->arcs[j][i].adj = INFINITY;
G->arcs[j][i].info = NULL;
}
}
cout<<"输入"<
i = LocateVex(G,origin);
j = LocateVex(G,terminus);
G->arcs[i][j].adj = 0;
G->arcs[i][j].info = new InfoType;
*(G->arcs[i][j].info) = weight; //记录相应的权重
}
}
void CreateUDG(MGraph* G)
{
int vexnum,arcnum; // 无向图的顶点数和边数
VErtexType origin, terminus; //边的起点,终点
cout<<"输入无向图的定点数和边数:";
cin >> vexnum >> arcnum;
G->vexnum = vexnum;
G->arcnum = arcnum;
cout<
for( i=0;i
}
for( i=0;i
G->arcs[i][j].adj = INFINITY;
G->arcs[i][j].info = NULL;
G->arcs[j][i].adj = INFINITY;
G->arcs[j][i].info = NULL;
}
}
cout<<"输入"<
i = LocateVex(G,origin);
j = LocateVex(G,terminus);
G->arcs[i][j].adj = 0;
G->arcs[j][i].adj = 0;
}
}
void CreateUDN(MGraph* &G) // 无向网
{
int vexnum,arcnum,weight; // 无向网的顶点数 边数 权重
VErtexType origin, terminus; //边的起点,终点
cout<<"输入无向网的定点数和边数:";
cin >> vexnum >> arcnum;
G->vexnum = vexnum;
G->arcnum = arcnum;
cout<
for( i=0;i
}
for( i=0;i
G->arcs[i][j].adj = INFINITY;
G->arcs[i][j].info = NULL;
G->arcs[j][i].adj = INFINITY;
G->arcs[j][i].info = NULL;
}
}
cout<<"输入"<
i = LocateVex(G,origin);
j = LocateVex(G,terminus);
G->arcs[i][j].adj = 0;
G->arcs[i][j].info = new InfoType;
*(G->arcs[i][j].info) = weight; //记录相应的权重
G->arcs[j][i].adj = 0;
G->arcs[j][i].info = new InfoType;
*(G->arcs[j][i].info) = weight;
}
}
void Create(MGraph* &G) // 创建图G 选择创建图的类型
{
int kind;
cout<<"输入图类型(0.DG/1.DN/2.UDG/3.UDN):"<
switch(kind){
case DG :
CreateDG(G);
break;
case DN:
CreateDN(G);
break;
case UDG:
CreateUDG(G);
break;
case UDN:
CreateUDN(G);
break;
default:
break;
}
}
void TraverUD(MGraph* G)
{
VErtexType origin, terminus; //边的起点,终点
for(int i=0;i
for(int j=0;j<=i;j++){
if(G->arcs[i][j].adj != INFINITY){
terminus = G->vexs[i];
origin = G->vexs[j];
cout << origin << "----" << terminus ;
if(G->arcs[j][i].info){
cout<<" info= " << *(G->arcs[i][j].info);
}
cout<
origin = G->vexs[i];
terminus = G->vexs[j];
cout << origin << "----" << terminus ;
if(G->arcs[i][j].info){
cout<<" info= " << *(G->arcs[i][j].info);
}
cout<
}
}
}
cout<<"====================="<
void TraverD(MGraph* G)
{
VErtexType origin, terminus; //边的起点,终点
for(int i=0;i
for(int j=0;j
if(G->arcs[i][j].adj != INFINITY){
origin = G->vexs[i];
terminus = G->vexs[j];
cout << origin << "----" << terminus ;
if(G->arcs[i][j].info){
cout<<" info= " << *(G->arcs[i][j].info);
}
cout<
}
}
cout<<"====================="<
void destroy(MGraph* G)
{
delete G;
G = NULL;
}
int main()
{
while(1){
MGraph *G = new MGraph;
Create(G); //创建无向图
if(G->kind == UDN || G->kind == UDG){
TraverUD(G);
}
else{
TraverD(G);
}
destroy(G);
}
system("pause");
return 0;
}