小编满血复活,更新力度感人~
先让我们看看有向图长什么样吧
有向图是指节点与节点之间连线是有方向性的。
一.图的介绍
图分为有向图和无向图。
图由许多的节点组成,这些节点我们称为顶点。
有向图是指顶点之间的指向有方向性,顶点之间用<x,y>表示;
无向图的顶点之间没有单一的方向,是双向的 顶点之间用(x,y)表示。
对于两个相互连接的(不论有无方向性)顶点,它们互称邻接点。
度,分为入度和出度,入度是指指向该顶点的边个数,出度是指从这个顶点出去的边的个数,入度和出度相加就是度。
二.邻接矩阵的创建
邻接矩阵是用来表示图中顶点关系的一种方式。
它通过一个二维数组来表示一个图的结点之间的相互关系。
上图!:
这就是一个邻接矩阵, 我们在其中举个例子,假设这个二维数组命名为str。
str[a][d]的值是1, 这说明顶点a可以到顶点d,但str[d][a]是0,说明a到d是单向的。
由此,我们只需要遍历这个图,把所有的位置关系表示出来即可。
#define Maxvex 100
typedef int undform;
typedef struct UND//邻接矩阵
{
undform form[Maxvex][Maxvex];
}UND;
void CreatUND(Graph* gp, UND* u)//创建邻接矩阵
{
cout << "---------------------------" << endl;
cout << "邻接矩阵为:" << endl;
for (int i = 0; i < gp->vexnum; i++)//邻接矩阵的初始化
{
for (int j = 0; j < gp->vexnum; j++)
{
u->form[i][j] = 0;
}
}
for (int i = 0; i < gp->vexnum; i++)//邻接矩阵的创建
{
Arcnode* arc = gp->vexall[i].Nextarc;
while (arc)
{
u->form[i][arc->arcnode] = 1;
arc = arc->nextarcnode;
}
}
//邻接矩阵的打印
cout << " ";
for (int i = 0; i < gp->vexnum; i++)
{
cout << " " << gp->vexall[i].val;
}
cout << endl;
for (int i = 0; i < gp->vexnum; i++)
{
cout << gp->vexall[i].val << " ";
for (int j = 0; j < gp->vexnum; j++)
{
cout << u->form[i][j] << " ";
}
cout << endl;
}
}
三.邻接表的创建
邻接表能够利用指针把顶点关系表示出来,就是图的一种创建方式。
先让我们看看邻接表长什么样子吧:
邻接表由顶点表和边表两个部分组成 。
顶点表可以理解成是一个结构体数组,图中的顶点依次放入每一个结构体中,每个结构体里除了这个顶点还有一个指向边表的指针,这个指针指向的边表里装着这个顶点所指向的下一个顶点。
边表里头装着的也是顶点,但边表不能作为头节点。
一个定点表结构体(a)指向一个边表(b),这个边表(b)所代表的顶点就是该定点表结构体(a)所代表的顶点指向的,同理,这个边表(b)指向的边表(c),也是该结构体(a)指向的。
typedef char vextype;
#define Maxvex 100
typedef struct arcnode//边表
{
int arcnode;//
struct arcnode* nextarcnode;//下一个此根节点指向的边节点
int weight;//边的权值
}Arcnode;
typedef struct vexnode//节点表
{
vextype val;//节点值
Arcnode* Nextarc;//节点指向的第一个边
}Vexnode[Maxvex], onevexnode;
typedef struct Graph//图
{
Vexnode vexall;//所有的节点作为一个数组
int vexnum, arcnum;//节点,边的个数
}Graph;
void CreatGraph(Graph* gp)
{
cout << "节点数:"; cin >> gp->vexnum;
cout << "边数:"; cin >> gp->arcnum;
for (int i = 0; i < gp->vexnum; i++)//初始化节点
{
cout << "输入第" << i + 1 << "个节点:";
cin >> gp->vexall[i].val ;
gp->vexall[i].Nextarc = NULL;
}
cout << "进行图的创建:" << endl;
for (int i = 0; i < gp->arcnum; i++)//图的创建
{
char g1, g2;
cout << "输入第一个节点:"; cin >> g1;
cout << "输入第二个节点:"; cin >> g2;
int s1 = Findvex(gp, g1), s2 = Findvex(gp, g2);
//节点与边的正向链接
Arcnode* newarc = new Arcnode;
newarc->arcnode = s2;
newarc->nextarcnode = gp->vexall[s1].Nextarc;
gp->vexall[s1].Nextarc = newarc;
}
int Findvex(Graph* gp, vextype a)//找到对应的节点
{
int sub;//对应的节点下标
for (int i = 0; i < gp->vexnum; i++)
{
if (gp->vexall[i].val == a)
{
sub = i;
break;
}
}
return sub;
}
创作不易,恳求三连,如有错误,敬请斧正