版权声明:欢迎转载,但转载时请注明原文地址 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;
}
这种方法可能没有简易版本的。。。