图的存储结——邻接表
开始建立一个数组用来储存图的各个顶点,如上图(0-5)为数组下标然后判断各个顶点的邻居是哪个,并把它的各个邻居顶点存入一个单链表(在单链表中切忌无先后顺序)
此处内容涉及链表建议复习链表知识点。
废话少叙上代码。
#include <bits/stdc++.h>
using namespace std;
typedef struct AdjVNode * PtrToAdjVNode;
//邻接点
struct AdjVNode{
int AdjV; //邻居顶点编号
PtrToAdjVNode Next; //下一个邻居
};
typedef struct VNode {
PtrToAdjVNode FirstEdge; //指向邻居链表的指针
} AdjList[100];
typedef struct GNode * PtrToGNode;
struct GNode {
int Nv;
int Ne; //边数
AdjList G; //等同于struct VNode G[100]
};
//生成顶点数组
PtrToGNode CreateGraph(int Nv)
{
PtrToGNode Graph;
Graph =new GNode();
Graph->Nv = Nv;
Graph->Ne = 0;
for(int v=0; v<Nv; v++)
{
Graph->G[v].FirstEdge = NULL;
}
return Graph;
}
//在无向图内加入一条边 (v, w)
void InsertEdge(PtrToGNode Graph, int v, int w)
{
PtrToAdjVNode newNode;
newNode = new AdjVNode();
newNode->AdjV = w; //记住w是v的邻居
//把newNode插入到顶点v的邻居(链表)内
newNode->Next = Graph->G[v].FirstEdge;
Graph->G[v].FirstEdge = newNode;
newNode = new AdjVNode();
newNode->AdjV = v; //记住v是w的邻居
//把newNode插入到顶点w的邻居(链表)内
newNode->Next = Graph->G[w].FirstEdge;
Graph->G[w].FirstEdge = newNode;
}
//构建图的邻接表
PtrToGNode BuildGraph()
{
PtrToGNode Graph; //指向邻接表的指针
int v, w;
int Nv;
cin>>Nv;
Graph = CreateGraph(Nv);
cin>>Graph->Ne;
if(Graph->Ne != 0) {
for(int i=0; i<Graph->Ne; i++)
{
cin>>v>>w;
InsertEdge(Graph, v, w);
}
}
return Graph;
}
int main()
{
PtrToGNode graph = BuildGraph();
cout<<graph->Nv<<","<<graph->Ne;
}