//邻接多重表是无向图的另一种链式存储结构,相比较于邻接表,多重链表更易于删除弧等操作
//结构上,邻接多重表和邻接表的差别,仅仅在于同一条边在邻接表中用两个结点表示,而在邻接多重表中只有一个结点
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTEX_NUM 20
typedef int Status;
#define OK 1
#define ERROR 0
typedef int InfoType; //定义弧相关信息为整形
typedef char VertexType; //定义顶点类型为字符型
typedef enum {unvisited,visited} VisitIF; //定义{未访问,已访问}等枚举常量,同时定义VisitIF为枚举变量类型
typedef struct ArcNode
{
VisitIF mark; //访问标记
int ivex,jvex; //该弧所依附的两个顶点在顺序结构中的位置
struct ArcNode *ilink,*jlink; //分别指向依附这两个顶点的下一条边
InfoType *info; //该弧相关信息的指针
}ArcNode; //弧结构
typedef struct VNode
{
VertexType data; //顶点
ArcNode *firstarc; //指向第一条依附该顶点的弧的指针
}VNode,AMLList[MAX_VERTEX_NUM]; //顶点结构
typedef struct
{
AMLList vertices; //顶点数组
int vexnum,arcnum; //顶点数和弧数
}AMLGraph; //多重邻接表表示的图结构
Status CreateAMLGraph(AMLGraph *G);
int LocateVex(AMLGraph G,VertexType v);
int main()
{
AMLGraph *G;
G=(AMLGraph *)malloc(sizeof(AMLGraph));
CreateAMLGraph(G);
int i,j;
//打印邻接多重表
for(i=0;i<G->vexnum;i++)
{
ArcNode *p;
p=(ArcNode *)malloc(sizeof(ArcNode));
p=G->vertices[i].firstarc;
printf("%c: ",G->vertices[i].data);
while(p)
{
int n1,n2;
n1=p->ivex;
n2=p->jvex;
printf("%c---%c ",G->vertices[n1].data,G->vertices[n2].data);
if(p->ivex==i)
p=p->ilink;
else
p=p->jlink;
}
printf("\n");
}
return 0;
}
int LocateVex(AMLGraph G,VertexType v)
{
int i;
for(i=0;i<G.vexnum;i++)
if(G.vertices[i].data==v)
return i;
}
//创建无向图
Status CreateAMLGraph(AMLGraph *G)
{
int i,IncInfo;
printf("输入顶点数量:");
scanf("%d",&G->vexnum);
printf("输入弧数量:");
scanf("%d",&G->arcnum);
printf("弧是否含有其他信息(否---0,是---1):");
scanf("%d",&IncInfo);
//头结点处理
for(i=0;i<G->vexnum;i++)
{
fflush(stdin);
printf("输入第%d个顶点:",i+1);
scanf("%c",&G->vertices[i].data); //输入头结点的顶点信息
G->vertices[i].firstarc=NULL; //初始化头结点的弧指针
}
//弧结点处理
for(i=0;i<G->arcnum;i++)
{
char v1,v2;
int node1,node2;
fflush(stdin);
printf("输入第%d条弧的依附的第一个结点:",i+1);
scanf("%c",&v1);
fflush(stdin);
printf("输入第%d条弧的依附的第二个结点:",i+1);
scanf("%c",&v2);
node1=LocateVex(*G,v1);
node2=LocateVex(*G,v2);
ArcNode *p;
p=(ArcNode *)malloc(sizeof(ArcNode));
p->ivex=node1;
p->jvex=node2;
p->ilink=G->vertices[node1].firstarc;
G->vertices[node1].firstarc=p;
p->jlink=G->vertices[node2].firstarc;
G->vertices[node2].firstarc=p;
if(IncInfo)
{
int *info;
info=(int *)malloc(sizeof(int));
printf("输入弧的其他信息:");
scanf("%d",info);
p->info=info;
}
else
p->info=NULL;
}
return OK;
}
图的表示方法---邻接多重表
最新推荐文章于 2022-08-16 19:23:54 发布