邻接链表
邻接矩阵是不错的⼀种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构是存在对存储空间的极大浪费的。比如说,如果我们要处理下图这样的稀疏有向图,邻接矩阵中除了arc[1][0]有权值外,没有其他弧,其实这些存储空间都浪费掉了。
因此选择一种新的数据结构来存储这种稀疏图则尤为重要了。此时则使用链表结构来存储原来的连接信息。
定义如下数据结构
//图的邻接链表存储结构
//边表节点结构,一个adjvex用来存储邻接点的位置,一个next指针用来指向下一个节点
typedef struct EdgeNode
{
int adjvex; //存储顶点下标信息
struct EdgeNode *next;
} EdgeNode;
//顶点表节点结构
typedef struct
{
string Vexs; //用来存储顶点信息
EdgeNode *firstedge; //用来存储当前顶点的下一个顶点
} VexList;
//这里用动态数组存储顶点表,然后numVertex,numEdge是一个图的顶点数和边数
typedef struct
{
vector<VexList> VexList;
int Vertexs, Edges;
} GraphList;
创建图
此处创建边表使用的方法是尾插法,《大话数据结构》中使用的是头插法,个人感觉尾插法比较容易理解。其他的方面和邻接矩阵创建图时的思路基本一样。
void CreateGraph(GraphList * G)
{
string v1, v2;
EdgeNode * e, *p, *q;
cout << "请输入顶点数和边数:" << endl;
cin >> G->Vertexs >> G->Edges;
cout << "请输入顶点的信息:" << endl;
for (int i = 0; i < G->Vertexs; ++i){
VexList tmp;
cin >> tmp.Vexs;
tmp.firstedge = NULL;
G->VexList.push_back(tmp);
}
for (int k =