![]ND2JVUI{JTVU(BP47M0B{7.png](/uploads/projects/beichenandjojo@csgo/960f74b285c0393e8a6a6619ced657ca.png)
adjvex 邻接点域:存放与Vi邻接的顶点在表头数组的位置
nextarc 链域:指示下一条边或弧
顶点:
- 按标号顺序将顶点顺序储存在一维数组中;
关联同一顶点的边(以顶点为尾的弧):
- 用线性链表储存
无向图
特点:
- 邻接表不唯一
- 若无向图中有n个顶点、e条边,则其邻接表则需要n个头结点和2e个表节点。适合储存稀疏图 O(n+2e)
- 无向图中顶点v1的度为第i个单链表中的结点数
有向图
-邻接表
-逆邻接表
邻接表储存表示
顶点的节点结构:data | firstarc**
typedef struct VNode{VerTexType data; //顶点信息ArcNode *firstarc; //指向第一条依附该顶点的边的指针}VNode,AdjList[MVNum]; //AdjList表示邻接表类型
说明: 例如,AdjList v; 相当于 VNode v[MVNum];
弧(边)的节点结构 adjvex | nextarc | info
#define MVNum 100 //最大顶点数typedef struct ArcNode{ //边节点int adjvex; //该边所指向的顶点的位置struct ArcNode *nextarc; //指向下一条边的指针OtherInfo info; //和边相关的信息}ArcNode;
图的结构定义
typedef struct{AdjList vertices; //vertices--vertex的复数int vexnum,arcnum; //图的当前顶点数和弧数}ALGraph;
邻接表操作举例说明![G]D(~I5R_VJ20O{BK(E_@Y2.png](/uploads/projects/beichenandjojo@csgo/25db7d8ca12484716fba61771d8d5307.png)
算法6.2 邻接表表示法创建无向网
【算法思想】
- 输入总顶点数和总边数
- 建立顶点表
依次输入点的信息存入顶点表中
使每个表头结点的中指针域初始化为NULL
- 创建邻接表
依次输入每条边依附的两个顶点
确定两个顶点的序号i和j,建立边结点
将此边结点分别插入到vi和vj对应的两个边链表的头部
Status CreateUDG(ALGraph &G){cin>>G.vexnum>>G.arcnum; //总顶点数,边数for(i = 0;i<G.vexnum;i++){ //输入各点,构造表头结点表cin>>G.vertices[i].data; //输入顶点值G.vertices[i].firstarc = NULL; //初始化表头结点的指针域}for(k = 0;k<G.arcnum;k++){cin>>v1>>v2; //输入一条边依附的两个顶点i = LocateVex(G,v1);j = LocateVex(G,v2);p1 = nex ArcNode; //生成一个新的边结点 *p1p1 -> adjvex = j; //邻接点序号为jp1 ->nextarc = G.vertices[i].firstarc;G.vertices[i].firstarc = p1; //将新结点*p1插入顶点vi的边表头部p2 = nex ArcNode; //生成另一个对称的新的边结点*p2p2 -> adjvex = i; //邻接点序号为ip2 ->nextarc = G.vertices[j].firstarc;G.vertices[j].firstarc = p2; //将新结点*p2插入顶点vj的边表头}return OK;}
