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

复制代码
/************************************************************************

边(弧)结点
--------------------------
|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;
}

 

 

 

 

 

posted on   崔好好  阅读(407)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示