图的表示除了邻接矩阵表示,还可以使用链表数组。对每个顶点(表头节点)建立一个单链表,第i个单链表中节点表示依附于顶点vi 的边(对有向图而言,是以顶点vi为尾的弧)。所以在邻接表中,除了节点外,还有表头节点。
假设图有V个顶点,E条边。空间权衡方面,邻接矩阵使用的空间正比于V^2;而邻接表所使用的空间正比于V+E。如果边数较少(也叫稀疏图),则优先选用邻接表。若大多数顶点对都由边相接(也叫稠密图),则使用邻接矩阵,避免为不存在的边分配任何空间。在复杂度方面,邻接矩阵表示可以在O(n)时间内解决“顶点i和顶点j之间是否存在有边” 的问题。其他的时候,用邻接表表示更有效,允许在正比于V+E的时间内而不是V^2的时间内遍历图的所有边
#include <iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#define Max_Vertex_Num 100 //最大顶点数
typedef char VertexType; //顶点数类型定义
typedef int EdgeType; //边类型定义
typedef struct EdgeNode
{
int adjvex; // 该边所指的顶点的位置
EdgeType weight; //该边的权值
struct EdgeNode *NextEdge; //指向下一条边的指针
}EdgeNode;
typedef struct VertexNode
{
VertexType data; // 顶点信息
EdgeNode *firstEdge; //指向第一条依附该顶点的边表头指针
}VertexNode, AdjList[Max_Vertex_Num];
typedef struct
{
AdjList adjList;
int EdgeNum; // 图的当前边数
int VertexNum; //图的当前顶点数
}ALGraph;
// 返回顶点v的位置
int LocateVertex(ALGraph *G, VertexType v)
{
int i = 0;
for(i = 0; v != G->adjList[i].data && i < G->VertexNum; i ++);
if(i >= G->VertexNum)
return -1;
return i;
}
//增加节点
void AddVertex(ALGraph *G)
{
cout << "input vertex number" << endl;
cin >> G->VertexNum;
cout << "input vertex value" << endl;
for(int i = 0; i < G->VertexNum; i++)
{
cin >> G->adjList[i].data;
G->adjList[i].firstEdge = NULL;
}
}
//增加边表
void AddEdge(ALGraph *G)
{
cout << "input edge number" << endl;
cin >> G->EdgeNum ;
VertexType V1, V2;
cout << "input two vertex" << endl;
for(int k = 0; k < G->EdgeNum; k ++)
{
cin >> V1 >> V2;
int i = LocateVertex(G,V1);
int j = LocateVertex(G,V2);
EdgeNode *pe1 = (EdgeNode *)malloc(sizeof(EdgeNode));
pe1->adjvex = i;
pe1->NextEdge = G->adjList[j].firstEdge;
G->adjList[j].firstEdge = pe1;
EdgeNode *pe2 = (EdgeNode *)malloc(sizeof(EdgeNode));
pe2->adjvex = j;
pe2->NextEdge = G->adjList[i].firstEdge;
G->adjList[i].firstEdge = pe2;
}
}
void CreatALGraph(ALGraph *G)
{
AddVertex(G);
AddEdge(G);
}
void PrintALGrap(ALGraph *G)
{
EdgeNode *pe;
cout << "编号 顶点 邻点编号" << endl;
for(int i = 0; i < G->VertexNum; i ++)
{
cout << " " << i << " " << G->adjList[i].data << " ";
for(pe = G->adjList[i].firstEdge; pe; pe = pe->NextEdge)
cout << pe->adjvex << " ";
cout << endl;
}
}
int main()
{
ALGraph GL;
CreatALGraph(&GL);
PrintALGrap(&GL);
}
原文地址:http://blog.csdn.net/zwhlxl/article/details/45080715