函数题:无向图的邻接表表示转换为邻接矩阵表示
编写算法MGraph listTomatri (LGraph gl)实现:把无向图的邻接表表示转换为邻接矩阵表示。
### 函数接口定义:
c++
MGraph listTomatri (LGraph gl);
其中,LGraph为邻接表存储结构类型,MGraph为邻接矩阵存储结构类型。
### 裁判测试程序样例:
c++
#include <stdio.h>
#include <stdlib.h>
#define MAXVERTEXNUM 100
//邻接点的定义
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode{
int AdjV; //邻接点的下标
PtrToAdjVNode Next; //指向下一个邻接点的指针
int weight; //权值
};
//顶点表头结点的定义
typedef struct VNode{
char Data; //顶点数据
PtrToAdjVNode FirstEdge; //边表头指针
}AdjList[MAXVERTEXNUM]; //AdjList是邻接表类型
typedef struct GNode *PtrToGNode;
struct GNode{
int Nv; //顶点数
int Ne; //边数
AdjList G; //邻接表
};
//邻接矩阵表示图
struct MatriNode{
int Nv; //顶点数
int Ne; //边数
int G[MAXVERTEXNUM][MAXVERTEXNUM]; //邻接矩阵
char Data[MAXVERTEXNUM];
};
typedef struct MatriNode* MGraph; //以邻接矩阵方式存储的图类型
typedef PtrToGNode LGraph; //以邻接表方式存储的图类型
MGraph listTomatri(LGraph gl);
LGraph BuildGraph()
{
int v,i,k,j;
LGraph Graph;
PtrToAdjVNode NewNode;
Graph = (LGraph)malloc(sizeof(struct GNode));
scanf("%d %d",&Graph->Nv,&Graph->Ne);
//输入顶点信息
for(v = 0;v < Graph->Nv; v++){
getchar();
scanf("%c",&Graph->G[v].Data);
Graph->G[v].FirstEdge = NULL; //将指向边表的指针初始化
}
//建立边表
char vi,vj;
int w;
for(k = 0;k < Graph->Ne; k++){ //k记录插入边的个数
getchar();
scanf("%c %c %d",&vi,&vj,&w);
for(i = 0; Graph->G[i].Data != vi; i++)
;//找vi在顶点数组中的下标
for(j = 0; Graph->G[j].Data != vj; j++)
;//找vj在顶点数组中的下标
//为vj建立新的邻接点
NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode->AdjV = j;
NewNode->weight = w;
NewNode->Next = Graph->G[i].FirstEdge; //头插法插入边结点
Graph->G[i].FirstEdge = NewNode;
//为vi建立新的邻接点
NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode->AdjV = i;
NewNode->weight = w;
NewNode->Next = Graph->G[j].FirstEdge; //头插法插入边结点
Graph->G[j].FirstEdge = NewNode;
}
return Graph;
}
void outputGraphW(MGraph MatriGraph){
printf("该图的邻接矩阵为:");
int i,j;
for (i=0; i < MatriGraph->Nv; i++){
printf("\n");
for (j=0; j < MatriGraph->Nv; j++)
printf(" %d",MatriGraph->G[i][j]);
}
}
int main(){
LGraph Graph2;
MGraph MatriGraph;
Graph2 = BuildGraph();//创建图(邻接表表示)
MatriGraph = listTomatri(Graph2); //邻接表转换成邻接矩阵表示
outputGraphW(MatriGraph); //输出权值
return 0;
}
/* 请在这里填写答案 */

### 输入样例:
in
5 8
A B C D E
A B 8
A E 4
B C 7
B D 12
B E 5
C D 6
C E 11
D E 3
### 输出样例:
out
该图的邻接矩阵为:
0 8 0 0 4
8 0 7 12 5
0 7 0 6 11
0 12 6 0 3
4 5 11 3 0
答案:若无答案欢迎评论
### 函数接口定义:
c++
MGraph listTomatri (LGraph gl);
其中,LGraph为邻接表存储结构类型,MGraph为邻接矩阵存储结构类型。
### 裁判测试程序样例:
c++
#include <stdio.h>
#include <stdlib.h>
#define MAXVERTEXNUM 100
//邻接点的定义
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode{
int AdjV; //邻接点的下标
PtrToAdjVNode Next; //指向下一个邻接点的指针
int weight; //权值
};
//顶点表头结点的定义
typedef struct VNode{
char Data; //顶点数据
PtrToAdjVNode FirstEdge; //边表头指针
}AdjList[MAXVERTEXNUM]; //AdjList是邻接表类型
typedef struct GNode *PtrToGNode;
struct GNode{
int Nv; //顶点数
int Ne; //边数
AdjList G; //邻接表
};
//邻接矩阵表示图
struct MatriNode{
int Nv; //顶点数
int Ne; //边数
int G[MAXVERTEXNUM][MAXVERTEXNUM]; //邻接矩阵
char Data[MAXVERTEXNUM];
};
typedef struct MatriNode* MGraph; //以邻接矩阵方式存储的图类型
typedef PtrToGNode LGraph; //以邻接表方式存储的图类型
MGraph listTomatri(LGraph gl);
LGraph BuildGraph()
{
int v,i,k,j;
LGraph Graph;
PtrToAdjVNode NewNode;
Graph = (LGraph)malloc(sizeof(struct GNode));
scanf("%d %d",&Graph->Nv,&Graph->Ne);
//输入顶点信息
for(v = 0;v < Graph->Nv; v++){
getchar();
scanf("%c",&Graph->G[v].Data);
Graph->G[v].FirstEdge = NULL; //将指向边表的指针初始化
}
//建立边表
char vi,vj;
int w;
for(k = 0;k < Graph->Ne; k++){ //k记录插入边的个数
getchar();
scanf("%c %c %d",&vi,&vj,&w);
for(i = 0; Graph->G[i].Data != vi; i++)
;//找vi在顶点数组中的下标
for(j = 0; Graph->G[j].Data != vj; j++)
;//找vj在顶点数组中的下标
//为vj建立新的邻接点
NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode->AdjV = j;
NewNode->weight = w;
NewNode->Next = Graph->G[i].FirstEdge; //头插法插入边结点
Graph->G[i].FirstEdge = NewNode;
//为vi建立新的邻接点
NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode->AdjV = i;
NewNode->weight = w;
NewNode->Next = Graph->G[j].FirstEdge; //头插法插入边结点
Graph->G[j].FirstEdge = NewNode;
}
return Graph;
}
void outputGraphW(MGraph MatriGraph){
printf("该图的邻接矩阵为:");
int i,j;
for (i=0; i < MatriGraph->Nv; i++){
printf("\n");
for (j=0; j < MatriGraph->Nv; j++)
printf(" %d",MatriGraph->G[i][j]);
}
}
int main(){
LGraph Graph2;
MGraph MatriGraph;
Graph2 = BuildGraph();//创建图(邻接表表示)
MatriGraph = listTomatri(Graph2); //邻接表转换成邻接矩阵表示
outputGraphW(MatriGraph); //输出权值
return 0;
}
/* 请在这里填写答案 */

### 输入样例:
in
5 8
A B C D E
A B 8
A E 4
B C 7
B D 12
B E 5
C D 6
C E 11
D E 3
### 输出样例:
out
该图的邻接矩阵为:
0 8 0 0 4
8 0 7 12 5
0 7 0 6 11
0 12 6 0 3
4 5 11 3 0
答案:若无答案欢迎评论