图的存储结构

一、邻接矩阵


1.图及其邻接矩阵

图及其邻接矩阵


存储形式

#define MaxInt 32767//表示无穷
#define MaxNum 100//最大顶点数
typedef char VerTexType;//顶点的数据类型
typedef int ArcType;//边的权值数据类型
typedef struct{
    VerTexType vexs[MaxNum];//顶点表
    ArcType arcs[MaxNum][MaxNum];//邻接矩阵
}Graph; 

2.以邻接矩方式创建无向图

#include <iostream> 
#include <cstdio>
#include <cstring>
using namespace std;

#define OK 1
#define MaxInt 32767 
#define MaxVNum 100

typedef char VerTexType;
typedef int ArcType;

typedef struct{
    VerTexType Ver[MaxVNum];//顶点表 
    ArcType arcs[MaxVNum][MaxVNum];//邻接矩阵 
    int vernum,arcnum;  //当前顶点数和边数 
}Graph;

int LocateVer(Graph G,VerTexType ch)
{
    for(int i = 0;i< G.vernum;i++)
    {
        if(G.Ver[i] == ch) return i;
    }
}


int Creat_Graph(Graph &G){
    cin>>G.vernum>>G.arcnum;//输入总的顶点数和边数; 
    for(int i = 0;i< G.vernum;i++)
    {
        for(int j = 1;j< G.arcnum;j++)
        {
            G.arcs[i][j] = MaxInt;
        }
    }
    for(int i = 0;i< G.arcnum;i++)//构造邻接矩阵,按照边的多少来输入;
    {
        VerTexType v1,v2;
        int w;
        cin>>v1>>v2>>w;//输入边的两个点的名字和这条边的权值 
        int num1 =  LocateVer(G,v1);//找到这两个点所在的位置,即顶点表的下标 
        int num2 = LocateVer(G,v2);
        G.arcs[num1][num2] = w;//边<num1,num2>的权值w
        G.arcs[num2][num1] = G.arcs[num1][num2] ;//因为是无向图,权值一样,如果为有向的则没有这一句 
    }
    return OK; 
} 

int main()
{
    Graph G;
    Creat_Graph(G);
    return 0;
}

二、邻接表


1.使用邻接表存储图需要
1)表头结点表:用来存储所有的顶点,通常用顺序结构存储
data:来存放顶点数据
firstarc:链域用于指向下一个结点

这里写图片描述

2)边表:

adjvex:与顶点v相邻的点在表头结点表中的位置
info:存储例如边的权值等其他信息
nextarc:顶点v下一个相邻的结点

这里写图片描述

存储结构:

#define MVNum 100//最大顶点数 
//边结点 
typedef struct ArcNode{
    int adjvex;
    struct ArcNode *nextarc;
    OtherInfo info; 
}ArcNode;
//顶点信息 
typedef struct VNode{
    VerTexType data;
    ArcNode *firxtarc;//指向第一条依附该顶点的边的指针 

}VNode,AdjList[MVNum];//AdjList 表示邻接表类型 
//图 
typedef struct{
    AdjList vertices;
    int  vexnum,arcnum;
}Graph; 

2.以邻接表创建无向图

#include <iostream>
#include <cstdio>
#include <cstring>
#define OK 1
#define ERROR 0
#define MaxNum 100
using namespace std;
typedef  int OtherInfo;
typedef char VexName;

//vertics 顶点,最高点;adjective 相邻的 

//邻接点 
typedef struct ArcNode{
    int FirstVex;//前一个节点的序号 
    struct ArcNode *nextVex;//指向下一个边节点 
    OtherInfo info;//每一个节点存储的其他信息,比如边的权值    
}ArcNode; 

//顶点 
typedef struct VexNode{
    VexName data;//节点的名字
    ArcNode *FirstArcNode;//顶点的第一个相邻节点 
}VexNode,MapSqList[MaxNum];//直接用typedef一个结构体数组, 

typedef struct{
    MapSqList vertics;//存储顶点的顺序表 
    int vexnum,arcnum;//当前的点数和边数 
}ArcGraph; 

int LocateVex(ArcGraph G,VexName v)
{
    for(int i = 0;i<G.vexnum;i++)
    {
        if(G.vertics[i].data == v) return i;
    }
}

void Creat_Graph(ArcGraph G)
{
    cin>>G.vexnum>>G.arcnum;
    for(int i= 1;i<=G.vexnum;i++)
    {
        cin>>G.vertics[i].data;
        G.vertics[i].FirstArcNode = NULL;   
    }
    for(int i =0;i<G.arcnum;i++)
    {
        VexName v1,v2;
        cin>>v1>>v2;
        int OredrNumber1,OredrNumber2;
        //确定v1,v2在图G中的位置,实际就是 vertics数组的序号; 
        OredrNumber1 = LocateVex(G,v1);
        OredrNumber2 = LocateVex(G,v2);
        ArcNode *p1 = new ArcNode;
        ArcNode *p2 = new ArcNode;

        //将邻接点插入到边表 
        p1->FirstVex = OredrNumber1;
        p1->nextVex = G.vertics[OredrNumber1].FirstArcNode;
        G.vertics[OredrNumber1].FirstArcNode = p1;
        //因为是无向图需要插入两次
        p2->FirstVex = OredrNumber2;
        p2->nextVex = G.vertics[OredrNumber2].FirstArcNode;
        G.vertics[OredrNumber2].FirstArcNode = p2;
    }   
} 

int main()
{
    ArcGraph G;
    Creat_Graph(G)  ;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值