博客介绍了图的表示方法,重点阐述邻接矩阵表示图,包含图(邻接矩阵)初始化、插入边、创建图、快速创建邻接矩阵表示的图等内容,还提及了邻接表表示图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

邻接矩阵表示图:

1.图(邻接矩阵)初始化

typedef struct GNode *PtrToGNode;
struct GNode{
    int Nv;
    int Ne;
    WeightType G[MaxVertexNum][MaxVertexNum];
};

typedef PtrToGNode MGraph;
typedef int Vertex;

MGraph CreateGraph(int vertexNum)
{
    Vertex v,w;
    MGraph Graph;
    Graph=(MGraph*)malloc(sizeof(struct GNode));
    Graph->Nv=vertexNum;
    Graph->Ne=0;
    for(v=0;v<Graph->Nv;v++)
    {
        for(w=0;w<Graph->Nv;w++)
        {
            Graph->G[V][W]=0;
        }
    }
    return Graph;
}

2.插入边

typedef struct ENode *PtrToENode;

struct ENode
{
    Vertex V1,V2;
    WeightType weight;
}

typedef PtrToENode Edge;

void InsertEdge(MGragh Graph,Edge E)
{
    Graph->G[E->V1][E->V2]=E->weight;
    if(!有向)
    {
        Graph->G[E->V2][E->V1]=E->weight;
    }
}

3.创建图

MGraph BuildGraph(int Nv,int Ne)
{
    MGraph Graph;
    Edge E;
    Vertex V;
    int i;
    Graph=CreteaGraph(Nv);
    Graph->Ne=Ne;
    if(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);
            Insert(Graph,E);
        }
    }
    return Graph;
}

4.快速创建邻接矩阵表示的图

int G[MaxN][MaxN],Nv,Ne;

void BuildGraph()
{
    int i,j,V1,V2,weight;
    scanf("%d",&Nv);
    for(i=0;i<Nv;i++)
        for(j=0;j<Nv;j++)
            G[i][j]=0;
    scanf("%d",&Ne);
    for(i=0;i<Ne;i++){
        scanf("%d %d %d",&V1,&V2,&weight);
        G[V1][V2]=w;
        if(无向图)
            G[V2][V1]=v;
    }
}

5.邻接表表示图

type struct VNode{
    PtrToAdjVNode FirstEdge;
    DtaType data;//存顶点数据
}AdjList[MaxVertexNum]//这个结构体就是用来存储头节点的

typedef struct GNode *PtrToGNode;

strut GNode{
    int Nv;
    int Ne;
    AdjList G;//邻接表数组
} ;
typedef PtrToGNode LGraph;


typedef struct AdjVNode *PtrToAdjVNode ;

struct AdjVNode{
    Vertex AdjV;//邻接点的下标
    WeightType weight;//权重
    PtrToAdjVNode next;//链表指针
}//这个结构体就是用来存储邻接节点信息的


LGraph CreateGraph(int vertexNum)
{
    Vertex v,w;
    LGraph Graph;
    Graph=(LGraph*)malloc(sizeof(struct VNode));
    Graph->Nv=vertexNum;
    Graph->Ne=0;
    for(int v=0;v<Graph->Nv;v++)
        Graph->G[v].FirstEdge=NULL;
    return Graph;
}

void InsertEdge(Lgraph Graph,Edge E)
{
//插入边《V1,V2》
//给V2建立新的邻接点
    PtrToAdjVNode NewNode;
    NewNode->(PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
    NewNode->AdjV=E->V2;
    NewNode->weight=E->weight;
    
    NewNode->next=Graph->G[E->V1].FirstEdge;
    Graph->G[E->V1].FirstEdge=NewNode ;

//如果是无向图

    PtrToAdjVNode NewNode;
    NewNode->(PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
    NewNode->AdjV=E->V1;
    NewNode->weight=E->weight;
    
    NewNode->next=Graph->G[E->V2].FirstEdge;
    Graph->G[E->V2].FirstEdge=NewNode ;
    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值