(一)邻接矩阵
1.无向图的邻接矩阵
2.有向图邻接矩阵
3.网(有权图)的邻接矩阵
4.
/*图的邻接矩阵存储表示法*/ //用两个数组分别存储顶点表和邻接矩阵 #define MaxInt 32767 //表示极大值,即无穷 #define MVNum 100 //最大顶点数 typedef char VerTexType; //假设顶点的数据类型为字符型 typedef int ArcType; //假设边的权值类型为整型 typedef struct { VerTexType vexs[MVNum]; //顶点表 ArcType arcs[MVNum][MVNum]; //邻接矩阵 int vexnum, arcnum; //图的当前顶点数和边数 }AMGraph;
5.采用邻接矩阵表示法创建无向网
【算法步骤】
1、输入总顶点数和边数
2、依次输入点的信息存入到顶点表中
3、初始化邻接矩阵,使每个权值初始化为极大值
4、构造邻接矩阵注意:
1、无向图需要为arcs[i][j]和arcs[j][i]赋值
2、有向图仅需为arcs[i][j]赋值/*采用邻接矩阵表示法创建无向网*/ Status CreateUDN(AMGraph& G) { cin >> G.vexnum >> G.arcnum;//输入总顶点数和总边数 for (int i = 0;i < G.vexnum;++i) cin >> G.vexs[i];//依次输入顶点的信息 for (int i = 0;i < G.vexnum;++i)//初始化邻接矩阵,边的权值均置为极大值 for (int j = 0;j < G.vexnum;++j) G.arcs[i][j] = MaxInt; for (int k = 0;k < G.arcnum;++k) { cin >> v1 >> v2 >> w;//输入一条边依附的顶点和权值 i = LocateVex(G, v1);j = LocateVex(G, v2);//确定两个顶点v1和v2在G中的位置 G.arcs[i][j] = w;//边<v1,v2>的权值置为w G.arcs[j][i] = G.arcs[i][j];//置边<v1,v2>的对称点<v2,v1>的权值也为w } return OK; } /*在图中查找顶点的位置LocateVex()函数*/ int LocateVex(AMGraph G, VertexType u) {//若在图中找到这个元素,则返回它的下标i,否则返回-1 int i; for (i = 0;i < G.vexnum;++i) if (u == G.vexs[i]) return i; return -1; }
(二)邻接表(链式)表示法
1.无向图的邻接表表示
2.有向图的邻接表表示
代码分三部分
1.图的结构定义
2.顶点的头结点结构
3.边的节点结构
/*图的邻接表的存储定义*/ //弧的结点结构 #define MVNum 100 //最大的顶点数 typedef struct ArcNode { int adjvex; //该边所指的顶点的位置 struct ArcNode* nextarc; //指向下一条边的指针 OtherInfo info; //和边相关的信息 }ArcNode; //顶点的结点结构 typedef struct VNode { VertexType data;//顶点信息 ArcNode* firstarc;//指向第一条依附该顶点的边 }VNode,AdjList[MVNum];//AdjList表示邻接表类型 //AdjList v相当于VNode v[MVNum] //图的结构定义(邻接表) typedef struct { AdjList vertices;//vertices是vertex的复数 int vexnum, arcnum;//图的当前顶点数和边数 }ALGraph; /*说明*/ ALGraph G;//定义了邻接表表示的图G G.vexnum = 5;G.arcnum = 6;//图G包含了5个顶点和6条边 G.vertices[1].data = 'v2';//图G中第2个顶点是v2 p = G.vertices[1].firstarc;//指针p指向顶点v2的第一个边结点 p->adjvex = 4;//p指针所指边结点是到下标为4的结点的边
4.采用邻接表表示法创建无向网
【算法步骤】
1、输入总顶点数和总边数
2、建立顶点表
1、依次输入点的信息存入顶点表中
2、使每个表头结点的指针域初始化为NULL
3、创建邻接表
1、依次输入每条边依附的两个顶点
2、确定这两个顶点的序号i和j
3、将此边结点分别插入vi和vj对应的两个边链表的头部
/*采用邻接表表示法创建无向图*/ Status CreateUDG(ALGraph& G) {//采用邻接表表示法,创建无向图G cin >> G.vexnum >> G.arcnum;//输入顶点数和弧数 for (int i = 0;i < G.vexnum;++i) { cin >> G.vertices[i].data;//输入顶点值 G.vertices[i].firstarc = NULL;//初始化表头结点的指针域为NULL } for (int k = 0;k < G.arcnum;++k)//输入各边,构造邻接表,头插法 { cin >> v1 >> v2;//输入一条边依附的两个顶点 i = LocateVex(G, v1);j = LocateVex(G.v2); p1 = new ArcNode;//生成一个新的边结点*p1 p1->adjvex = j;//邻结点序号为j p1->nextarc = G.vertices[i].firstarc;//firstarc为空,所以nextarc也指向空,即最后的一个结点 G.vertices[i].firstarc = p1;//将新结点*p1插入到顶点vi的边表头部 p2 = new ArcNode;//生成一个新的边结点*p2 p2->adjvex = i; p2->nextarc = G.vertices[j].firstarc;//插入弧结点到单链表 G.vertices[j].firstarc = p2;//将新结点*p2插入到顶点vi的边表头部 }//头插法 return OK; }
5.邻接矩阵与邻接表的比较