欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【图的建立】邻接矩阵/邻接表C语言实现

程序员文章站 2023-12-25 18:13:27
...

邻接矩阵表示图

无权图实例:
【图的建立】邻接矩阵/邻接表C语言实现
1.图基本结构

#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 100
/*******     邻接矩阵     *******/
typedef struct Gnode{
    int nv ;//顶点
    int ne ;//边
    int G[MAXSIZE][MAXSIZE];
    int data[20];//存顶点的数据
}*graph;

2.初始化一个有所有顶点但没有边的图

/*****        初始化一个有所有顶点但没有边的图      *****/
typedef int Vertex;
graph gen(int vertexnum)
{
    //int a[90][89]={0};//定义的时候可以这样初始化
    graph M;
    M = (graph)malloc(sizeof(struct Gnode));
    M -> nv = vertexnum;
    M->ne = 0;
    //M->G[vertexnum][vertexnum]={0};
    for(Vertex i=0; i<vertexnum ;i++)
    {
        for(Vertex j=0;j<vertexnum;j++)
        M->G[i][j]=0;
    }
    return M;
}

3.向图中插入边

/******  向图中插入边  ******/
typedef struct Enode{
    Vertex v1,v2;
    int weight;//有权图
}*Edge;

void insertedge (Edge E,graph M)
{
    M->G[E->v1][E->v2] = E->weight;//有向图
    M->G[E->v2][E->v1] = E->weight;//若是无向图,则还要插入边<V2,V1>
}

4.完整的建立图

/****   完整的建立图    *****/
graph create_graph()
{
    graph M;//指针类型,要malloc分配内存
    Edge E;//指针类型,要malloc分配内存
    int nv,ne;

    scanf("%d%d",&nv,&ne);
    M->ne = ne;
    M=gen(nv);
    if(ne)
    {
        E = (Edge)malloc(sizeof(struct Enode));
        for(int i = 0;i<ne;i++)
    {
        scanf("%d%d%d",&(E->v1),&(E->v2),&(E->weight));
        insertedge(E,M);
    }
    }
    /*如果顶点有数据,还要读入数据*/
    for(int i=0;i<nv;i++)
    {
        scanf("%d",&(M->data[i]));
    }
    return M;  
}

以上全部过程的简化代码

int G[MAXSIZE][MAXSIZE] ,ne,nv;//全局变量
void BuildGraph()
{
    int i,j,ne,nv;
    int v1,v2,weight;
    scanf("%d%d",&nv,&ne);
    for(i = 0;i<nv;i++)
    {
        for(j = 0;j<nv;j++)
        G[i][j] = 0;
    }
    for(i=0;i<ne;i++)
    {
        scanf("%d%d%d",&v1,&v2,&weight);
        G[v1][v2] = weight;
        G[v2][v1] = weight;//无向图还要加这一句;
    }
}

邻接表

【图的建立】邻接矩阵/邻接表C语言实现
1.邻接表的每个结点的基本定义

#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 100
typedef struct adjvode{
    int adjV;//邻接点的下标
    int weight ;//边的权重
    struct adjvode *next;
}*ptrtoadjnode;

2.邻接表表头的定义

typedef struct Vnode{
    ptrtoGnode firstedge;
    int data;//存顶点的数据
}adjlist[MAXSIZE];

3.图

typedef struct GNode{
    int nv;
    int ne;
    adjlist G;//邻接表
}*ptrtoGnode;
typedef ptrtoGnode graph;

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

typedef ptrtoGnode graph;
/*    初始化一个有顶点但没有边的图   */
typedef int vertex;

graph gen(int vertexnum)
{
    vertex v,w;
    graph L;
    L = (graph)malloc(sizeof(struct GNode));
    L->nv = vertexnum;
    L->ne = 0;
    for(v = 0;v<L->nv;v++)
    {
        L->G[v].firstedge = NULL;
    }
    return L;
}

5.插入边
(1)边的基本定义

typedef struct edge{
    int v1;
    int v2;
    int weight;
}*Edge;

(2)插入边

/*    插入边   */

void insertedge(graph L,Edge E)
{
    ptrtoadjnode newnode;
    /****插入边<v1,v2>****/
   
    /* 为v2建立新的邻接点 */
    newnode = (ptrtoadjnode)malloc(sizeof(struct adjvode));
    newnode ->adjV = E->v2;
    newnode ->weight = E->weight;
    /*   将v2插入v1的表头   */
    newnode->next = L ->G[E->v1].firstedge;//新结点的指向表头的下一个结点
    L->G[E->v1].firstedge = newnode;//表头的下一个结点指向新结点

    /*   若是无向图,还要插入<v2,v1>  */

    /* 为v1建立新的邻接点 */
    newnode = (ptrtoadjnode)malloc(sizeof(struct adjvode));
    newnode ->adjV = E->v1;
    newnode ->weight = E->weight;
    /*   将v1插入v2的表头   */
    newnode->next = L ->G[E->v2].firstedge;//新结点的指向表头的下一个结点
    L->G[E->v2].firstedge = newnode;//表头的下一个结点指向新结点
}

6.完整的建立图
注:这一函数和用邻接矩阵表示图完全类似,故未简化代码可以体现函数的模块化作用

graph create_graph()
{
    graph L;//指针类型,要malloc分配内存
    Edge E;//指针类型,要malloc分配内存
    int nv,ne;

    scanf("%d%d",&nv,&ne);
    L->ne = ne;
    L=gen(nv);
    if(ne)
    {
        E = (Edge)malloc(sizeof(struct edge));
        for(int i = 0;i<ne;i++)
      {
        scanf("%d%d%d",&(E->v1),&(E->v2),&(E->weight));
        insertedge(E,L);
      }
    }
    return L;  
}

上一篇:

下一篇: