无向图样式:
邻接表是图的一种链式存储方式,有两部分组成:表头结点表和边表
邻接表法创建无向图过程:
一,输入总顶点数和边数(几个点,几条边)
eg:如图所示即为4点,6边。(每个点都类似与一串链表的头结点)
二,依次输入点的信息存入顶点表中,并将每个表头结点的指针域初始化为NULL(每个点一个名字)
eg:如图即可以写为ABCDE。
三,构造邻接矩阵。
依次输入每条边依附的顶点,确定这两个顶点的序号n,m之后,将此边结点分别插入顶点对应的量的边链表的头部。
eg:输入AB,先找到AB在 vertices的位置,然后用先以A为头结点,将B头插到A的链表中,再以B为头,头插A。
邻接表法深度优先搜索遍历
和邻接矩阵法深度优先搜索类似,过程也类似于递归过程,只不过换成了链表。
先从你输入的呢一点开始遍历,按照链表的方法,按照结点连接依次向下。
(已经遍历的点visited[i]赋值为一,代表已经遍历)
若下一结点已经被遍历,则继续向下,否则跳转到该点为表头的链表。
等到某一点遍历过后,再返回到上一层
eg:
如果上图从C点开始遍历,默认的话,若赋值CE,CD,则以A为头结点的链表为CED;若赋值为CD,CE,则为CDE。
(此时按照下图运行中的输入方法,因为插入方式为头插(先写的排在链表尾),所以则结点为
A->D->B B->C->E->A C->D->E->B D->C->A E->C->B )
第一步:先找到C的下一个结点D,若D点尚未遍历,则跳转到D点
第二步:从D点再开始遍历,首先是C,因为C已经遍历,找下一个A,因为A未遍历,所以跳转到A开始
第三步:从A开始,下一个为D,因为D已经遍历,所以找下一个B
。。。。。。。。。。。
(根据代码可知遍历过程都是从i=0到i= A.point,所以每次都是按照ABCDEFGH进行遍历)
运行截图
代码:
#include<iostream>
using namespace std;
#define pointMax 100
struct VtNode //权值信息
{
int peace;
VtNode *nextVt;
int data;
};
struct PoNode //顶点信息
{
char data;
VtNode *firstPo;
};
struct ATgroup
{
PoNode vertices[pointMax]; //每一个verticse代表一个顶点
int point, vert;
};
int ATlocate(ATgroup A, char x) //找到位置
{
for (int i = 0; i < A.point; i++) //依次输入点的信息
{
if (A.vertices[i].data == x)
{
return i;
}
}
}
void CreatAT(ATgroup &A)
{
cout << "输入邻接矩阵顶点数:";
cin >> A.point;
cout << "输入邻接矩阵边数:";
cin >> A.vert;
getchar();
char q[100];
cout << "输入顶点信息:";
gets_s(q);
for (int i = 0; i < A.point; i++)
{
A.vertices[i].data = q[i]; //输入顶点值
A.vertices[i].firstPo = NULL; //初始化头结点为空
}
char v1, v2; int m, n;
for (int i = 0; i < A.vert; i++) //输入各边,构造邻接表
{
cout << "输入第"<<i<<"条边的依附的两个顶点:";
cin >> v1 >> v2;
m = ATlocate(A, v1); //确定位置
n = ATlocate(A, v2);
//第一个
VtNode *p1 = new VtNode;
p1->peace = m;
p1->nextVt = A.vertices[n].firstPo;
A.vertices[n].firstPo = p1;
//第二个
VtNode *p2 = new VtNode;
p2->peace = n;
p2->nextVt = A.vertices[m].firstPo;
A.vertices[m].firstPo = p2;
}
}
int visited[100] = { 0 };
void Show(ATgroup &A, int v)
{
cout << A.vertices[v].data;
visited[v] = 1;
VtNode *p = new VtNode;
p = A.vertices[v].firstPo;
int w;
while (p != NULL)
{
w = p->peace;
if (visited[w] == 0)
{
Show(A, w);
}
p = p->nextVt;
}
}
int main()
{
ATgroup *A = new ATgroup;
CreatAT(*A);
int n;
cout << "从第n个开始遍历:";
cin >> n;
Show(*A,n);
system("pause");
}