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

10 篇文章 0 订阅
5 篇文章 0 订阅

邻接矩阵表示图

无权图实例:
在这里插入图片描述
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;//无向图还要加这一句;
    }
}

邻接表

在这里插入图片描述
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;  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值