以邻接矩阵作为存储结构实现图的创建与基本操作

以邻接矩阵作为存储结构实现图的创建与基本操作:

typedef int Status;

typedef int VRType;

typedef char InfoType;

typedef char VertexType;

 

/*①图的邻接矩阵存储结构定义*/

typedef struct ArcCell

{

   //VRType是顶点的关系类型,对无权图用10表示是否相邻,对带权图(网)用权值

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);
}


未完待更新。。。。。。 委屈

猜你喜欢

转载自blog.csdn.net/qq_40953393/article/details/78936433