【图的建立】邻接矩阵/邻接表C语言实现
程序员文章站
2023-12-25 18:13:27
...
邻接矩阵表示图
无权图实例:
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;
}