邻接表存储无向图

adjacentList.h

#pragma once
//邻接表存储的无向图
# include<iostream>
# include"vertex.h"
typedef struct _listNode//表节点
{
    int iAdjaVeretex;//邻接点编号
    int info;//边上信息
    struct _listNode*next=NULL;
}listNode;
typedef struct _vertexNode//顶点节点
{
    int iVertex;//顶点编号
    listNode* fistEdge=NULL;//边表头指针
}vertexNode;

class undiGraph
{
public:
    undiGraph(int numOfVertex , int numOfEdge );
    ~undiGraph();
    void crete();
    void setVisitedFalse();//将访问标志设为flase,每次遍历前都需调用此函数
    void DFS(int i);//深度优先搜索 从第i+1个结点开始 
    void BFS(int i);//广度优先搜索
private:
    vertex* vertexElem;//顶点元素
    int iVertex;
    int iEdge;
    vertexNode *verNode;//顶点节点

    void addListNode(int a, int b, int _info);//给编号为a的顶点添加一个表节点
};

adjacentList.cpp

# include"adjacentList.h"
# include<iostream>
# include"myQuene.h"
using namespace std;

undiGraph::undiGraph(int numOfVertex = 0, int numOfEdge = 0):iVertex(numOfVertex),iEdge(numOfEdge)
{
    vertexElem = new vertex[numOfVertex];
    verNode = new vertexNode[numOfVertex];
}

undiGraph::~undiGraph()
{
    for (int i = 0;i < iVertex;++i)//销毁所有的表结点
        //每次循环,销毁第i+1个顶点结点的表结点
    {
        listNode *p = verNode[i].fistEdge;

        while (p)
        {
            listNode *p1 = p;
            p = p->next;
            delete p1;
        }
    }
    delete []vertexElem;
    delete[]verNode;
}

void undiGraph::crete()
{
    cout << "请依次输入顶点信息:" << endl;
    char elem;
    for (int i = 0;i < iVertex;i++)
    {
        cin >> elem;
        vertexElem[i].data = elem;
        verNode[i].iVertex = i;
    }

    cout << "请依次输入有向图中相关联的顶点(0表示第一个顶点)及弧的权值:" << endl;
    int a, b;
    double weight;
    for (int j = 0;j < iEdge;j++)
    {
        cin >> a >> b >> weight;
        addListNode(a, b, weight);
        addListNode(b, a, weight);
    }
}

void undiGraph::addListNode(int a, int b, int _info)//给编号为a的顶点添加一个表节点
{
    listNode*(&p) = verNode[a].fistEdge;//第一次添加时,需要改变firstEdge, 这里打错字了就不改了
    if (p == NULL)//第一次添加,为NULL
    {
        p= new listNode;
        p->iAdjaVeretex = b;
        p->info = _info;
        return;
    }

    listNode*p1 = verNode[a].fistEdge;
    while (p1->next!= NULL)
    {
        p1 = p1->next;
    }
    listNode *p2 = new listNode;
    p2->iAdjaVeretex = b;
    p2->info = _info;
    p1->next = p2;
}

void undiGraph::setVisitedFalse()
{
    for (int i = 0;i < iVertex;++i)
        vertexElem[i].isVisited = false;
}

void undiGraph::DFS(int i)//深度优先搜索 从第i+1个结点开始  
{
    if (!vertexElem[i].isVisited)//如果第i+1个节点未被访问,则访问该节点
    {
        vertexElem[i].visited();
        vertexElem[i].isVisited = true;
    }
    else return;

    //在第i+1个顶点的所有邻接点中调用DFS

    listNode*p = verNode[i].fistEdge;
    while (p)//第i+1个节点
    {
        DFS(p->iAdjaVeretex);
        p = p->next;
    }
}   

void undiGraph::BFS(int i)//广度优先搜索
{
    if (!vertexElem[i].isVisited)//如果第i+1个节点未被访问,则访问该节点
    {
        vertexElem[i].visited();
        vertexElem[i].isVisited = true;
    }
    else return;

    myQuene<int> q(30);
    q.in(i);
    int x;

    while (!q.empty())//只要队列不为空
    {
        q.out(x);

        listNode*p = verNode[x].fistEdge;
        while (p)
        {
            if (!vertexElem[p->iAdjaVeretex].isVisited)//如果节点未被访问,则访问该节点
            {
                vertexElem[p->iAdjaVeretex].visited();
                vertexElem[p->iAdjaVeretex].isVisited = true;
                q.in(p->iAdjaVeretex);
            }
            p = p->next;
        }
    }
}

main.cpp

# include<iostream>
# include"adjacentList.h"

using namespace std;

int main()
{
    undiGraph myUndiGraph(8, 9);
    myUndiGraph.crete();
    myUndiGraph.setVisitedFalse();

    cout << "深度优先遍历:" << endl;
    myUndiGraph.setVisitedFalse();
    myUndiGraph.DFS(0);
    cout << endl;

    cout << "广度优先遍历:" << endl;
    myUndiGraph.setVisitedFalse();
    myUndiGraph.BFS(0);
    cout << endl;

    system("pause");
    return 0;
}

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值