10、图的邻接表存储

 采用邻接表表示发创建无向图:

1.输入总顶点数和总边数

2.建立顶点表:

   依次输入点的信息存于顶点表中,每个头结点的指针域为NULL

3.建立邻接表

     依次输入每条边依附的两个顶点;确定两个顶点的序号i和j;将此边结点分别插入到vi和vj对应的两个边链表的头部

#include <iostream>
#include <string>
typedef char VexType;
typedef int OtherInfo;
#define MVNum 100 // 最大定点数

// 两种结点方式:头节点 + 边表结点
// 头节点
// data | firstedge
// 数据 | 指向第一个边结点
struct ArcNode;
struct HNode
{
    VexType data;
    ArcNode *firstarc;
};
typedef HNode AdjList[MVNum]; // 头结点数组 AdjList v; ---- HNode v[MVNum];
// 边表结点
// adjvex | nextarc | info
// 临界点域:存放与vi邻接的顶点,在表头数组中的位置 | 链域:指向下一条边或弧 | 边的权值(没有权值可以没有)
struct ArcNode
{
    int adjvex;
    ArcNode *nextarc;
    OtherInfo info;
};
// 图的结构定义
struct ALGraph
{
    AdjList vertices;   // vertices -- vertex的复数,找到头结点相当于找到了邻接表
    int vexnum, arcnum; // 图当前顶点数和弧数
};

// 采用邻接表表示法创建无向图
void CreateUDG(ALGraph &G);

// 确定两个顶点的序号
int LocateVex(const ALGraph &G, const VexType &v);

int main()
{
    ALGraph G;
    CreateUDG(G);

    // 打印邻接表
    for (int i = 0; i < G.vexnum; ++i)
    {
        std::cout << G.vertices[i].data << ": ";
        ArcNode *p = G.vertices[i].firstarc;
        while (p)
        {
            std::cout << p->adjvex << " ";
            p = p->nextarc;
        }
        std::cout << std::endl;
    }

    return 0;
}

// 采用邻接表表示法创建无向图
// 1.输入总顶点数和总边数
// 2.建立顶点表:
//     依次输入点的信息存于顶点表中,每个头结点的指针域为NULL
// 3.建立邻接表
//      依次输入每条边依附的两个顶点;确定两个顶点的序号i和j;将此边结点分别插入到vi和vj对应的两个边链表的头部
void CreateUDG(ALGraph &G)
{
    // 1.输入总顶点数和总边数
    std::cout << "输入总顶点数和总边数" << std::endl;
    std::cin >> G.vexnum >> G.arcnum;
    // 2.建立顶点表:
    //     依次输入点的信息存于顶点表中,每个头结点的指针域为NULL
    std::cout << "输入点的信息" << std::endl;
    for (int i = 0; i < G.vexnum; ++i)
    {
        std::cin.clear();
        std::cin >> G.vertices[i].data;
        G.vertices[i].firstarc = NULL;
    }
    // 3.建立邻接表
    std::cout << "依次输入每条边依附的两个顶点" << std::endl;
    std::cin.clear();
    for (int k = 0; k < G.arcnum; ++k)
    {
        VexType v1, v2;
        // 依次输入每条边依附的两个顶点
        std::cin >> v1 >> v2;
        // 确定两个顶点的序号i和j
        int i = LocateVex(G, v1);
        int j = LocateVex(G, v2);
        // std::cout << v1 << ": " << i << "  " << v2 << ": " << j << std::endl;
        // 将此边结点分别插入到vi和vj对应的两个边链表的头部
        ArcNode *p1 = new ArcNode();
        p1->adjvex = j;
        p1->nextarc = G.vertices[i].firstarc;
        G.vertices[i].firstarc = p1;
        // std::cout << G.vertices[p1->adjvex].data << std::endl;
        ArcNode *p2 = new ArcNode();
        p2->adjvex = i;
        p2->nextarc = G.vertices[j].firstarc;
        G.vertices[j].firstarc = p2;
        // std::cout << G.vertices[p2->adjvex].data << std::endl;
    }
}

// 确定两个顶点的序号
int LocateVex(const ALGraph &G, const VexType &v)
{
    for (int i = 0; i < G.vexnum; ++i)
    {
        if (G.vertices[i].data == v)
            return i;
    }
    return -1;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值