首页 > 其他 > 详细

图的存储结构

时间:2021-03-27 12:38:59      阅读:107      评论:0      收藏:0      [点我收藏+]

声明:图片及内容基于https://www.bilibili.com/video/BV1Qf4y1m77B?from=articleDetail

邻接矩阵(数组表示法)

技术分享图片

无向图的邻接矩阵

技术分享图片

技术分享图片

 

技术分享图片

技术分享图片

有向图的邻接矩阵

技术分享图片

技术分享图片

技术分享图片

技术分享图片

网图的邻接矩阵

技术分享图片

邻接矩阵存储无向图的类的实现

类的声明

技术分享图片

template <class T>
class MGraph {
    private:
        T *vertex;         //顶点信息
        int **arc; //邻接矩阵
        int vertexNum,arcNum;        //顶点数,边数
    public:
        MGraph(T v[],int n,int e);
        ~MGraph();
        void DFSTraverse(int v);
        void BFSTraverse(int v);
        void display();
};

构造函数

技术分享图片

技术分享图片

template <class T>
MGraph<T>::MGraph(T v[],int n,int e) {  //n是顶点数,e是边数
    vertexNum=n;
    arcNum=e;
    vertex = new T[vertexNum];         //建立顶点信息
    arc = new int*[vertexNum];         //建立邻接表
    for(int i=0; i<vertexNum; i++)
        arc[i]=new int[vertexNum];

    for(int i=0; i<vertexNum; i++) {   //初始化顶点信息 
        vertex[i]=v[i];
    }
    for(int i=0;i<vertexNum;i++)       //初始化邻接表 
        for(int j=0;j<vertexNum;j++)
            arc[i][j]=0;
    int vi,vj;
    for(int i=0;i<arcNum;i++){
        cout<<"请输入边的两个顶点"<<endl; 
        cin>>vi>>vj;   //输入边依附的两个顶点的编号 
        arc[vi][vj]=1; //有边标志 
        arc[vj][vi]=1;
    }
}

完整代码

#include<iostream>
using namespace std;
template <class T>
class MGraph {
    private:
        T *vertex;         //顶点信息
        int **arc; //邻接矩阵
        int vertexNum,arcNum;        //顶点数,边数
    public:
        MGraph(T v[],int n,int e);
        ~MGraph();
        void DFSTraverse(int v);
        void BFSTraverse(int v);
        void display();
};
template <class T>
MGraph<T>::MGraph(T v[],int n,int e) {  //n是顶点数,e是边数
    vertexNum=n;
    arcNum=e;
    vertex = new T[vertexNum];         //建立顶点信息
    arc = new int*[vertexNum];         //建立邻接表
    for(int i=0; i<vertexNum; i++)
        arc[i]=new int[vertexNum];

    for(int i=0; i<vertexNum; i++) {   //初始化顶点信息 
        vertex[i]=v[i];
    }
    for(int i=0;i<vertexNum;i++)       //初始化邻接表 
        for(int j=0;j<vertexNum;j++)
            arc[i][j]=0;
    int vi,vj;
    for(int i=0;i<arcNum;i++){
        cout<<"请输入边的两个顶点"<<endl; 
        cin>>vi>>vj;   //输入边依附的两个顶点的编号 
        arc[vi][vj]=1; //有边标志 
        arc[vj][vi]=1;
    }
}

template <class T>
void MGraph<T>::display(){
    for(int i=0;i<vertexNum;i++){
        for(int j=0;j<vertexNum;j++){
            cout<<arc[i][j]<<" ";
        }
        cout<<endl;
    }
    cout<<endl;
//    for(int i=0;i<vertexNum;i++){
//        for(int j=0;j<vertexNum;j++){
//            if(arc[i][j]==1){
//                cout<<vertex[i]<<" ";
//            }else{
//                cout<<" 0 ";
//            }
//        }
//        cout<<endl;
//    }
    for(int i=0;i<arcNum;i++){
        cout<<vertex[i]<<" ";
    }
}

template <class T>
MGraph<T>::~MGraph(){
    delete []vertex;
    for(int i=0;i<vertexNum;i++)
        delete [] arc[i];
    delete [] arc;
}
int main(){
    char* v[4]={"v0","v1","v2","v3"};
    MGraph<char*> mgraph(v,4,4);
    mgraph.display();
    return 0;
}

邻接表

定义

技术分享图片

 

技术分享图片

技术分享图片

无向图的邻接表

技术分享图片

技术分享图片

技术分享图片

有向图的邻接表

技术分享图片

技术分享图片

技术分享图片

网图的邻接表

技术分享图片

邻接表中图的基本操作

技术分享图片

技术分享图片

完整代码

#include<iostream>
using namespace std;
const int MAX=10;
typedef struct ArcNode{     //边结点 
    int adjvex;
    ArcNode *next;
}ArcNode;
typedef struct {  //表头 
    int vertex;
    ArcNode *firstEdge;
}VertexNode[MAX];
class ALGraph{
    private:
        int vertexNum;
        int arcNum;
        VertexNode adjList;
    public:
        ALGraph(int v[],int n,int e);
        void display();
};
ALGraph::ALGraph(int v[],int n,int e){
    vertexNum=n;
    arcNum=e;
    for(int i=0;i<vertexNum;i++){
        adjList[i].vertex=v[i];
        adjList[i].firstEdge=NULL;
    }
    int vi,vj;
    ArcNode *s;
    for(int i=0;i<arcNum;i++){
        cout<<"请输入第"<<i+1<<"条边的两个顶点在数组中的坐标"<<endl;
        cin>>vi>>vj;
        s=new ArcNode;
        s->adjvex=vj;
        s->next=adjList[vi].firstEdge;
        adjList[vi].firstEdge=s;
    }
}
void ALGraph::display(){
    for(int i=0;i<vertexNum;i++){ 
        ArcNode *p=adjList[i].firstEdge;
        cout<<adjList[i].vertex;
        if(p) cout<<"->";
        while(p){
            cout<<p->adjvex<<" ";
            p=p->next;
            if(p) cout<<"->";
        } 
        cout<<endl;
    } 
}
int main(){
    int v[4]={0,1,2,3};
    ALGraph algraph(v,4,4);
    algraph.display();
    return 0;
}

输入:

0 1

0 2

2 3

3 0

输出:

0->2 ->1
1
2->3
3->0

技术分享图片

 

十字链表

技术分享图片

技术分享图片

图的存储结构的比较———邻接矩阵和邻接表

技术分享图片

图的存储结构

原文:https://www.cnblogs.com/gonghr/p/14585169.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!