1、 图的存储方法:邻接矩阵存储(无向图)
测试数据:
4 5
A B C D
0 1
0 2
0 3
1 2
1 3
邻接矩阵:
顶点 | A | B | C | D |
---|---|---|---|---|
A | 0 | 1 | 1 | 1 |
B | 1 | 0 | 1 | 1 |
C | 1 | 1 | 0 | 0 |
D | 1 | 1 | 0 | 0 |
#include<iostream>
#include<malloc.h>
using namespace std; //vertex:顶点 arc:弧 adjacent:邻近的
#define MaxVertexNum 100 //最大顶点数
typedef char VertexType; //顶点的数据类型
typedef int EdgeType; //边的数据类型
typedef struct{
VertexType Vex[MaxVertexNum]; //定点表
EdgeType Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵,边表
int vernum,arcnum; //图的当前顶点数和弧数
}MGraph; //适合存储稠密图
//邻接矩阵法创建一个图
void CreateGraph(MGraph *G)
{
int i,j,k,w;
printf("请输入图的顶点数和边数:");
cin>>G->vernum>>G->arcnum;
printf("请输入图的各个顶点的信息(A,B…):");
for(i=0;i<G->vernum;i++)
cin>>G->Vex[i];//"%c"中%c后面要有空格
for(i=0;i<G->vernum;i++)
{
for(j=0;j<G->vernum;j++)
G->Edge[i][j]=0;
}
printf("请输入各条边的信息(例:1 2表示在A顶点和B顶点之间有一条边):\n");
for(k=0;k<G->arcnum;k++)
{//此为创建有向图的邻接矩阵
int Iindex,Jindex;
cin>>Iindex>>Jindex;
G->Edge[Iindex][Jindex]=1;
//如果加上G->Edge[j][i]=1;则建立的是无向图的邻接矩阵
G->Edge[Jindex][Iindex]=1;
}
}
//打印邻接矩阵
void DisplayMGraph(MGraph G)
{
int i,j;
printf(" ");
for(i=0;i<G.vernum;i++)
printf("%c ",G.Vex[i]);
for(i=0;i<G.vernum;i++)
{
printf("\n%c\t",G.Vex[i]);
for(j=0;j<G.vernum;j++)
printf("%d ",G.Edge[i][j]);
}
}
//求图G中顶点x的第一个邻接点
int FirstNeighbor(MGraph G,char x)
{
int i,j;
for(i=0;i<G.vernum;i++)//找到x在顶点表中的位置
{
if(x==G.Vex[i])
break;
}
for(j=0;j<G.vernum;j++)//在邻接矩阵中找到x所在行的值为1的元素。
{
if(G.Edge[i][j]==1)
break;
}
if(j<G.vernum)
return j;
else
return -1;
}
//求图G中顶点y是顶点x的一个邻接点,返回除y外顶点x的下一个邻接点的顶点号
//若y是x的最后一个邻接点,则返回-1
int NextNeighbor(MGraph G, char x,char y)
{
int i,j,k;
for(i=0;i<G.vernum;i++)
{
if(x==G.Vex[i])
break;
}
for(j=0;j<G.vernum;j++)//在邻接矩阵中找到x所在行的值为1的元素。
{
if(G.Vex[j]==y&&G.Edge[i][j]==1)
break;
}
for(k=j+1;k<G.vernum;k++)
if(G.Edge[i][k]==1)
break;
if(k<=G.vernum)
return k;
else
return -1;
}
int main()
{
MGraph G;
CreateGraph(&G);
printf("图的邻接矩阵如下:\n");
DisplayMGraph(G);
int index1=FirstNeighbor(G,'A');
if(index1!=-1)
printf("\n顶点A的第一个邻接点是%c\n",G.Vex[index1]);
else
printf("顶点A没有邻接点!\n");
int index2=NextNeighbor(G,'A','C');
if(index2!=-1)
printf("\n顶点A的第一个邻接点是%c\n",G.Vex[index2]);
else
printf("顶点C是顶点A的最后一个邻接点!\n");
return 0;
}