图结构在计算机中一般用邻接矩阵或者邻接表来存储。
图结构可分为 ‘顶点’ 和 ‘点与点之间的连线’ 两部分。
图的邻接矩阵存储结构:
typedef struct
{
int vexs[MaxVex]; //顶点数组
int arc[MaxVex][MaxVex]; //邻接矩阵
int numVertexes, numEdges; //顶点数和边数
}MGraph;
图的构建(数据的输入):
void CreateMGraph(MGraph *G)
{
cin>>G->numVertexes>>G->numEdges;
for (i=0;i<G->numVertexes;i++)
cin>>vexs[i]; //输入顶点表
for (i=0;i<G->numVertexes;i++)
for (j=0;j<G->numVertexes;j++)
cin>>G->numEdges[i][j] //输入(i->j)边上的权重,用权重无限大代表无路。
}
图的邻接表存储:
typedef struct EdgeNode //边结构
{
int adjvex; //顶点在定点表中的下标
int weight; //权重
struct EdgeNode* next; //指向下一个邻接顶点的指针
}EdgeNode;
typedef struct VertexNode //顶点表结构
{
int data;
EdgeNode* firstedge; //firstedge指针指向第一个邻接结点
}VertexNode,AdjList[MAXVEX]
typedef struct //图结构
{
AdjList adjList; //顶点列表
int numVertexes,numEdges; //顶点数、边数
}GraphAdjList;
图的构建(数据的输入):
void CreateGraph(GraphAdjList *G)
{
cin>>G->numVertexes>>G->numEdges; //输入图的顶点数和边条数
for (i=0;i<G->numVertexes;i++) //创建顶点表
{
cin>>G->adjList[i].data;
G->firstedge=NULL;
}
for (i=0;i<G->numEdges;i++) //创建边表
{
cin>>i>>j>>w; //从(i->j)路径上的权重w
EdgeNode *e=new EdgeNode; //创建一个新的点结点
e->weight=w;
e->next=G->adjList[i].firstedge; //利用头插法,创建边表
G->adjList[i].firstedge=e;
}
}