图的邻接表表示转换成邻接矩阵表示的算法。
下面这个是有向图邻接表表示转换成邻接矩阵
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int a[100][100];//邻接矩阵的载体
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode; //表结点
typedef struct VNode{
char data;
ArcNode *firstarc;
}VNode,AdjList[20];//头结点
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;//邻接表
int LocateVex(ALGraph G,char e)
{
int i;
for(i=0;i<G.vexnum;i++)
{
if(G.vertices[i].data==e)
return i;//找到后 返回i
}
return -1;
}
void CreatAdList(ALGraph &G)
{//根据输入的有向图G的顶点数及边数,建立图G的邻接表
int i,j,k;
char v1,v2;
ArcNode *s,*p;
scanf("%d%d",&G.vexnum,&G.arcnum);
getchar();
for(i=0;i<G.vexnum;i++) //初始化头结点
{
scanf("%c",&G.vertices[i].data);
getchar();
G.vertices[i].firstarc=NULL;
}
for(i=0;i<G.vexnum;i++)//输出一遍这些头
{
printf("%c ",G.vertices[i].data);
}
printf("\n");
for(k=0;k<G.arcnum;k++)
{//输入边
scanf("%c %c",&v1,&v2);
getchar();
i=LocateVex(G,v1);
j=LocateVex(G,v2);
s= (ArcNode *)malloc(sizeof(ArcNode));
s->adjvex=j;
s->nextarc=NULL;
p=G.vertices[i].firstarc;
if(!p)
{
G.vertices[i].firstarc = s;
}
else
{
while(p->nextarc)
p=p->nextarc;
p->nextarc=s;
}
}
}//CreateAdiMatrix
void trans(ALGraph G)
{//转换函数
int i,j;
ArcNode *p;
for(i=0;i<=G.vexnum;i++)//先初始化,全部赋值为0
for(j=0;j<=G.vexnum;j++)
{
a[i][j]=0;
}
for(i=0;i<G.vexnum;i++)
{
p=G.vertices[i].firstarc;
while(p)
{
a[i][p->adjvex]=1;
p=p->nextarc;
}
}
}
void Output(ALGraph &G)
{
int i,j;
for(i=0;i<G.vexnum;i++)
{
for(j=0;j<G.vexnum;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}
int main()
{
ALGraph G;
printf("有向图处理篇\n");
CreatAdList(G);
trans(G);
Output(G);
return 0;
}
无向图
邻接表表示转换成邻接矩阵
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int a[100][100];//邻接矩阵的载体
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode; //表结点
typedef struct VNode{
char data;
ArcNode *firstarc;
}VNode,AdjList[20];//头结点
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;//邻接表
int LocateVex(ALGraph G,char e)
{
int i;
for(i=0;i<G.vexnum;i++)
{
if(G.vertices[i].data==e)
return i;//找到后 返回i
}
return -1;
}
void CreatAdList(ALGraph &G)
{//根据输入的有向图G的顶点数及边数,建立图G的邻接表
int i,j,k,tmp;
char v1,v2;
ArcNode *s,*p;
scanf("%d%d",&G.vexnum,&G.arcnum);
getchar();
for(i=0;i<G.vexnum;i++) //初始化头结点
{
scanf("%c",&G.vertices[i].data);
getchar();
G.vertices[i].firstarc=NULL;
}
for(i=0;i<G.vexnum;i++)//输出一遍这些头
{
printf("%c ",G.vertices[i].data);
}
printf("\n");
for(k=0;k<G.arcnum;k++)
{//输入边
scanf("%c %c",&v1,&v2);
getchar();
i=LocateVex(G,v1);
j=LocateVex(G,v2);
s= (ArcNode *)malloc(sizeof(ArcNode));
s->adjvex=j;
s->nextarc=NULL;
p=G.vertices[i].firstarc;
if(!p)
{
G.vertices[i].firstarc = s;
}
else
{
while(p->nextarc)
p=p->nextarc;
p->nextarc=s;
}
tmp=i;
i=j;
j=tmp;
s= (ArcNode *)malloc(sizeof(ArcNode));
s->adjvex=j;
s->nextarc=NULL;
p=G.vertices[i].firstarc;
if(!p)
{
G.vertices[i].firstarc = s;
}
else
{
while(p->nextarc)
p=p->nextarc;
p->nextarc=s;
}
}
}//CreateAdiMatrix
void trans(ALGraph G)
{//转换函数
int i,j;
ArcNode *p;
for(i=0;i<=G.vexnum;i++)//先初始化,全部赋值为0
for(j=0;j<=G.vexnum;j++)
{
a[i][j]=0;
}
for(i=0;i<G.vexnum;i++)
{
p=G.vertices[i].firstarc;
while(p)
{
a[i][p->adjvex]=1;
p=p->nextarc;
}
}
}
void Output(ALGraph &G)
{
int i,j;
for(i=0;i<G.vexnum;i++)
{
for(j=0;j<G.vexnum;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}
int main()
{
ALGraph G;
printf("有向图处理篇\n");
CreatAdList(G);
trans(G);
Output(G);
return 0;
}
个人感觉无向图和有向图差别其实跟小,就是把下面这串代码复制一下,i,j换一下值就好了
i=LocateVex(G,v1);
j=LocateVex(G,v2);
s= (ArcNode *)malloc(sizeof(ArcNode));
s->adjvex=j;
s->nextarc=NULL;
p=G.vertices[i].firstarc;
if(!p)
{
G.vertices[i].firstarc = s;
}
else
{
while(p->nextarc)
p=p->nextarc;
p->nextarc=s;
}
版权,仅供参考。。。。。