首页 > 其他 > 详细

【算法与数据结构】图 -- 邻接表

时间:2014-05-30 21:30:55      阅读:565      评论:0      收藏:0      [点我收藏+]
bubuko.com,布布扣
/************************************************************************

边(弧)结点
--------------------------
|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:画上面这个图 容易么我

************************************************************************/
bubuko.com,布布扣

 

 

 

bubuko.com,布布扣
//最大顶点个数
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;
bubuko.com,布布扣

 

 

 

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

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

 

 

构造图

bubuko.com,布布扣
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;
}
bubuko.com,布布扣

 

 

 

int _tmain(int argc, _TCHAR* argv[])
{
    Graph graph;
    CreateGraph(graph);
    return 0;
}

 

 

 

bubuko.com,布布扣

 

 

【算法与数据结构】图 -- 邻接表,布布扣,bubuko.com

【算法与数据结构】图 -- 邻接表

原文:http://www.cnblogs.com/cuish/p/3760047.html

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