图:邻接表法创建无向图并深度优先搜索遍历

无向图样式:

邻接表是图的一种链式存储方式,有两部分组成:表头结点表和边表

邻接表法创建无向图过程:

一,输入总顶点数和边数(几个点,几条边)

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");
}

猜你喜欢

转载自blog.csdn.net/qq_46423166/article/details/106169806