typedef struct GNode *PtrToGNode;//定义指向结点的指针
//定义结点结构
struct GNode{
int Nv;//顶点数
int Ne;//边数
WeightType G[MaxVertexNum][MaxVertexNum];//存储邻接矩阵的数组
DataType Data[MaxVertexNum];//存储顶点的数据
};
typedef PtrToGNode 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;
}
typedef struct ENode *PtrToENode;//定义指向边的指针
//定义边的结构
struct ENode{
Vertex V1,V2;
WeightType Weight;
};
typedef PtrToENode Edge;
//向MGraph中插入边
void InsertEdge(MGraph Graph,Edge E){
Graph->G[E->V1][E->V2] = E->Weight;
Graph->G[E->V1][E->V2] = E->Weight;
}
//综合上述,完整建立一个图(MGraph)
/*输入格式:
Nv Ne
V1 V2 Weight*/
MGraph BuildGraph(void){
MGraph Graph;
Edge E;
Vertex V;
int Nv,i;
scanf("%d",&Nv);
Graph = CreateGraph(Nv);
scanf("%d",&(Graph->Ne));
if(Graph->Ne != 0){
E = (Edge)malloc(sizeof(struct Edge));
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->Data[V]));
}
return Graph;
}
//以上所有,简单方法快速建立图
int G[MAXN][MAXN],Nv,Ne;
void BuildGraph(void){
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);
G[v1][v2] = w;
G[v2][v1] = w;
}
}
//用邻接表表示图
//邻接表中的单链表
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;
//初始化一个有VertexNum个顶点但是没有边的图
typedef int Vertex;//用顶点下标表示顶点,为整型
LGraph CreateGraph(int VertexNum){
Vertex V,W;
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;
}
//插入边(链表头插法)
void InsertEdge(LGraph Graph,Edge E){
PtrToAdjVNode NewNode;
//插入<V1,V2>
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;
//无向图再插入<V2,V1>
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;
}
//综合上述,完整建立一个图(LGraph)
LGraph BuildGraph(void){
LGraph Graph;
Edge E;
Vertex V;
int Nv,i;
scanf("%d",&Nv);
Graph = CreateGraph(Nv);
scanf("%d",&(Graph->Ne));
if(Graph->Ne != 0){
E = (Edge)malloc(sizeof(struct Edge));
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->Data[V]));
}
return Graph;
}
数据结构——建立图总结(中国大学mooc)
最新推荐文章于 2023-05-26 11:00:27 发布