数据结构与算法之------图的创建超详解

版权声明:欢迎转载,但转载时请注明原文地址 https://blog.csdn.net/weixin_42110638/article/details/84195985

一.用邻接矩阵创建图

思路:先创建一个只有顶点没有边的图,然后把边插入

//用邻接矩阵表示图
#define MaxVertexNum 100
typedef int WeightType;
typedef char DataType;
typedef struct GNode *PtrToGNode;

struct GNode
{
    int Nv;//顶点数
    int Ne;//边数
    WeightType G[MaxVertexNum][MaxVertexNum];//邻接矩阵,可看作边表
    DataType vexs[MaxVertexNum];//存顶点的数据
};
typedef PtrToGNode MGraph;//把PtrToGNode这个指针改名为MGraph

MGraph初始化

 初始化一个有VertexNum个顶点但没有边的图


//MGraph初始化
//初始化一个有VertexNum个顶点但没有边的图
typedef int Vertex;//用顶点下标表示顶点

MGraph CreateGraph(int VertexNum)
{
    Vertex V,W;
    MGraph Graph;
    Graph = (MGraph)malloc(sizeof(struct GNode));
    Graph->Nv = VertexNum;
    Graph->Ne = 0;
    /* 注意:这里默认顶点编号从0开始,到(Graph->Nv - 1) */
    for(V = 0; V < Graph->Nv; V++)
        for(W = 0; W < Graph->Nv; W++)
            Graph->G[V][W] = 0; /* 或INFINITY */
    return Graph;
}

 向MGraph中插入边


//向MGraph中插入边
typedef struct ENode *PtrToENode;
struct ENode
{
    Vertex V1,V2; /* 有向边<V1, V2> */
    WeightType Weight; /* 权重 */
};
typedef PtrToENode Edge;


void InsertEdge( MGraph Graph,Edge E)
{
    /* 插入边 <V1, V2> */
    Graph->G[E->V1][E->V2] = E->Weight;
    /* 若是无向图,还要插入边<V2, V1> */
    Graph->G[E->V2][E->V1] = E->Weight;
}

 完整地建立一个MGraph


//完整地建立一个MGraph

MGraph BuildGraph()
{
    MGraph Graph;
    Edge E;
    Vertex V;
    int Nv, i;
    scanf("%d", &Nv);
    Graph = CreateGraph(Nv);
    scanf("%d", &(Graph->Ne));//不一起读入Nv和Ne的原因就是初始化图之后不用再声明Ne这个变量了
    if ( Graph->Ne != 0 )//如果有边就读进来并插入
    {
        E = (Edge)malloc(sizeof(struct ENode));
        for (i=0; i<Graph->Ne; i++)
        {
            scanf("%d %d %d",&E->V1, &E->V2, &E->Weight);
            InsertEdge( Graph, E );
        }
    }
    /* 如果顶点有数据的话,读入数据 */
    for (V=0; V<Graph->Nv; V++)
        scanf(" %c", &(Graph->vexs[V]));
    return Graph;
}


如果不要这么麻烦……

//如果不要这么麻烦……

int G[MaxVertexNum][MaxVertexNum], Nv, Ne;//直接声明为全局变量
void BuildGraph2()
{
    int i, j, v1, v2, w;
    scanf("%d", &Nv);
    /* CreateGraph */
    for (i=0; i<Nv; i++)
        for (j=0; j<Nv; j++)
            G[i][j] = 0; /*或INFINITY */
    scanf("%d", &Ne);
    for (i=0; i<Ne; i++)
    {
        scanf("%d %d %d", &v1, &v2, &w);
        /* InsertEdge */
        G[v1][v2] = w;
        G[v2][v1] = w;
    }
}

 二.用邻接表创建图

用邻接表表示图 

邻接表:G[N]为指针数组,对应矩阵每行一个链表, 只存非 0元素

#define MaxVertexNum 100
typedef int WeightType;
typedef char DataType;
typedef int Vertex;

typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode//边表结点
{
    Vertex AdjV; // 邻接点下标 ,邻接点编号
    WeightType Weight; /* 边权重 */
    PtrToAdjVNode Next;//链域
};

/* 以邻接表方式存储的图类型 */
typedef struct Vnode//头结点
{
    PtrToAdjVNode FirstEdge;
    DataType Data; /* 存顶点的数据 */
} AdjList[MaxVertexNum];
/* AdjList是邻接表类型 */

typedef struct GNode *PtrToGNode;
struct GNode
{
    int Nv; /* 顶点数 */
    int Ne; /* 边数 */
    AdjList G; /* 邻接表 */
};
typedef PtrToGNode LGraph;



LGraph初始化

初始化一个有VertexNum个顶点但没有边的图


//LGraph初始化
//初始化一个有VertexNum个顶点但没有边的图
typedef int Vertex; /* 用顶点下标表示顶点,为整型 */
LGraph CreateGraph( int VertexNum )
{
    Vertex V;
    LGraph Graph;
    Graph = (LGraph)malloc(sizeof(struct GNode));
    Graph->Nv = VertexNum;
    Graph->Ne = 0;
    /* 注意:这里默认顶点编号从0开始,到(Graph->Nv - 1) */
    for ( V=0; V<Graph->Nv; V++ )
        Graph->G[V].FirstEdge = NULL;//边空
    return Graph;
}

向LGraph中插入边


//向LGraph中插入边

typedef struct ENode *PtrToENode;
struct ENode
{
    Vertex V1,V2; /* 有向边<V1, V2> */
    WeightType Weight; /* 权重 */
};
typedef PtrToENode Edge;

void InsertEdge( LGraph Graph, Edge E )
{
    PtrToAdjVNode NewNode;
    /***************** 插入边 <V1, V2> ****************/
    /* 为V2建立新的邻接点 */
    NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
    NewNode->AdjV = E->V2;
    NewNode->Weight = E->Weight;
    /* 将V2插入V1的表头 */
    //头插法(讲链表的时候学过)
    NewNode->Next = Graph->G[E->V1].FirstEdge;
    Graph->G[E->V1].FirstEdge = NewNode;
    /********** 若是无向图,还要插入边 <V2, V1> **********/
    /* 为V1建立新的邻接点 */
    NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
    NewNode->AdjV = E->V1;
    NewNode->Weight = E->Weight;
    /* 将V1插入V2的表头 */
    NewNode->Next = Graph->G[E->V2].FirstEdge;
    Graph->G[E->V2].FirstEdge = NewNode;
}

完整地建立一个LGraph


//完整地建立一个LGraph

LGraph BuildGraph()
{
    LGraph Graph;
    Edge E;
    Vertex V;
    int Nv, i;
    scanf("%d", &Nv);
    Graph = CreateGraph(Nv);
    scanf("%d", &(Graph->Ne));//不一起读入Nv和Ne的原因就是初始化图之后不用再声明Ne这个变量了
    if ( Graph->Ne != 0 )//如果有边就读进来并插入
    {
        E = (Edge)malloc(sizeof(struct ENode));
        for (i=0; i<Graph->Ne; i++)
        {
            scanf("%d %d %d",&E->V1, &E->V2, &E->Weight);
            InsertEdge( Graph, E );
        }
    }
    /* 如果顶点有数据的话,读入数据 */
    for (V=0; V<Graph->Nv; V++)
        scanf(" %c", &(Graph->G[V].Data));
    return Graph;
}

这种方法可能没有简易版本的。。。

猜你喜欢

转载自blog.csdn.net/weixin_42110638/article/details/84195985