zoukankan      html  css  js  c++  java
  • 【算法与数据结构】图 -- 邻接表

    /************************************************************************
    
    边(弧)结点
    --------------------------
    |adjvex | info | nextarc |
    --------------------------
    
    adjvex:邻接点域,该点在图中的位置
    info  :相关信息,比如可以保存从某顶点到该点的权值
    nextac:指向下一个与该点有相同邻接点的顶点
    
    顶点结点
    ------------------
    |data | firstarc |
    ------------------
    data    :该顶点的数据
    firstarc:第一个与该顶点邻接的顶点 
    
    e.g.
    顶点1,2,3,4
       ---------    --------    ---------
     0 | 1 |   |--->| 2 |  |--->| 1 | ^ |
       ---------
     1 | 2 | ^ |
       ---------    ---------
     2 | 3 |   |--->| 3 | ^ |
       ---------    ---------
     3 | 4 |   |--->| 0 | ^ |
       ---------    ---------
    
    PS:画上面这个图 容易么我
    
    ************************************************************************/

     

     

    //最大顶点个数
    const int MAX_VERTEX = 100;
    
    //最大值
    const int MAX_VALUE = (1 << 31) - 1;
    
    //边(弧)结点
    typedef struct _tagArcNode
    {
        int                 adjvex;  //该边(弧)所指向的顶点在图中的位置
        struct _tagArcNode* nextarc; //下一个与该顶点有相同邻接点的边(弧)结点
        char                info;    //相关信息,比如可以保存该边(弧)的权值
    }ArcNode;
    
    //顶点节点
    typedef struct _tagVNode
    {
        char data;          //顶点信息
        ArcNode* firstArc;  //该顶点的第一条边(弧)所指向的顶点
    }VNode, AdjList[MAX_VERTEX];
    
    typedef struct _tagGraph
    {
        AdjList vertices;  //该图的所有顶点
        int vexnum;        //顶点个数
        int arcnum;        //边(弧)的条数
    }Graph;

    定位顶点在图中的位置,其位置也就是在一维数组中的下标

    int Locate(Graph& graph, char ch)
    {
        for (int i = 0; i < graph.vexnum; ++ i)
        {
            if (ch == graph.vertices[i].data) return i;
        }
        return -1;
    }

    构造图

    void CreateGraph(Graph& graph)
    {
        int num = 0;
        cout << "请输入图的顶点个数:";
        cin >> num;
        graph.vexnum = num;
        
        cout << "请输入图的边(弧)的条数:";
        cin >> num;
        graph.arcnum = num;
    
        cout<<endl<<endl;
        cout<<"开始输入每个顶点"<<endl;
        for (int i = 0; i < graph.vexnum; ++ i)
        {
            cout << "请输入顶点:";
            char ch = 0;
            cin >> ch;
            graph.vertices[i].data = ch;
            graph.vertices[i].firstArc = NULL;
        }
        cout<<endl<<"结束输入顶点"<<endl<<endl;
    
    
        cout<<"开始构造邻接表"<<endl;
        for (int i = 0; i < graph.vexnum; ++ i)
        { 
            int nCount = 1;
    
            while(1)
            {
                cout << "请输入顶点 "<<graph.vertices[i].data<<" 的第 " << nCount++<<" 个邻接点, 输入#结束:";
                char ch = 0;
                cin >> ch;
                if (ch == '#') break;
    
                ArcNode* pArcNode = new ArcNode();
                pArcNode->adjvex = Locate(graph, ch);
                pArcNode->nextarc = NULL;
    
                //如果该顶点还没有设置第一条边(弧),则将该输入顶点确定的边(弧)
                //作为该顶点的第一条边(弧)
                if (NULL == graph.vertices[i].firstArc)
                {
                    graph.vertices[i].firstArc = pArcNode;
                }
                //否则,遍历该顶点所在链表,找到最后一个节点,将其nextarc指针域
                //设置为由当前输入的顶点确定的边(弧)
                else
                { 
                    ArcNode* pTemp = graph.vertices[i].firstArc;
    
                    //直到找到顶点所在链表的最后一个边(弧)结点为止
                    while(pTemp->nextarc != NULL) pTemp = pTemp->nextarc;
    
                    //找到最后一个边(弧)结点后,将其nextarc指针域设置为当前输入的顶点所确定的边(弧)
                    pTemp->nextarc = pArcNode;
                }    
    
            } //while(1)
        } //for
    
    
        cout << endl<<"结束构造邻接表"<<endl<<endl;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
        Graph graph;
        CreateGraph(graph);
        return 0;
    }

  • 相关阅读:
    《C Primer Plus(第6版)中文版》一1.12 复习题
    《C Primer Plus(第6版)中文版》一1.12 复习题
    线程池多线程视频转码(完整版)
    mencoder的x264encopts选项参数略解
    ffmpeg多线程转码
    案例分析:程序媛记一次特殊的“故障”处理
    WINDOWS下CMake+MinGW64搭建C/C++编译环境
    lvs keepalived nginx-rtmp 视频流服务负载均衡系统搭建
    python 利用字典统计次数
    python 16进制 gbk转中文
  • 原文地址:https://www.cnblogs.com/cuish/p/3760047.html
Copyright © 2011-2022 走看看