函数题:无向图的邻接矩阵表示转换为邻接表表示
编写算法LGraph matriToadj (MGraph gn)实现:把无向图的邻接矩阵表示转换为邻接表表示。
### 函数接口定义:
c++
LGraph matriToadj (MGraph gn);
其中,LGraph为邻接表存储结构类型,MGraph为邻接矩阵存储结构类型。(提示:链表插入结点采用头插法)
### 裁判测试程序样例:
c++
#include <stdio.h>
#include <stdlib.h>
#define MAXVERTEXNUM 100
#define INFINITY 65535 //∞设为65535
//邻接点的定义
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; //邻接表
};
typedef struct MatriNode *PtrToMNode;
//邻接矩阵表示图
typedef struct MatriNode{
int Nv; //顶点数
int Ne; //边数
int G[MAXVERTEXNUM][MAXVERTEXNUM]; //邻接矩阵
char Data[MAXVERTEXNUM];
}MatriNode;
typedef PtrToGNode LGraph; //以邻接表方式存储的图类型
typedef PtrToMNode MGraph;//以邻接矩阵方式存储的图类型
LGraph matriToadj (MGraph gn);//无向图的邻接表表示转换为邻接矩阵表示
MGraph BuildGraph()
{
MGraph Graph;
int i,j,k,weight;
char a,b;
Graph = (PtrToMNode)malloc(sizeof(struct MatriNode));
/*请输入顶点数和边数*/;
scanf("%d %d",&Graph->Nv,&Graph->Ne);
/*请输入顶点信息*/
for(i = 0;i < Graph->Nv; i++)
{
getchar(); //getchar()函数是输入一个字符,用此函数将scanf()未处理的量进行释放;
scanf("%c",&Graph->Data[i]); //输入顶点数据
}
for(i = 0;i < Graph->Nv; i++)
for(j = 0;j < Graph->Nv; j++)
Graph->G[i][j] = INFINITY; //初始化邻接矩阵
/*请输入边的信息(格式为:起点数据 终点数据 权重)*/
for(k = 0;k < Graph->Ne ; k++)
{
getchar();
scanf("%c %c %d",&a,&b,&weight);
for( i = 0; Graph->Data[i] != a;i++)
; //找到顶点a在邻接矩阵中的下标
for( j = 0; Graph->Data[j] != b;j++)
; //找到顶点b在邻接矩阵中的下标
Graph->G[i][j] = weight;
Graph->G[j][i] = weight;
}
return Graph;
}
void outputGraphW(LGraph gl){
PtrToAdjVNode p;
printf("该图的邻接表为:");
int i;
for (i=0; i<gl->Nv; i++)
{
printf("\n%d---->",i);
p=gl->G[i].FirstEdge;
while(p){
printf(" %d",p->AdjV);
p=p->Next;
}
}
}
int main(){
LGraph Graph2;
MGraph MatriGraph;
MatriGraph = BuildGraph();
Graph2 = matriToadj(MatriGraph);
outputGraphW(Graph2);
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----> 4 1
1----> 4 3 2 0
2----> 4 3 1
3----> 4 2 1
4----> 3 2 1 0
答案:若无答案欢迎评论
### 函数接口定义:
c++
LGraph matriToadj (MGraph gn);
其中,LGraph为邻接表存储结构类型,MGraph为邻接矩阵存储结构类型。(提示:链表插入结点采用头插法)
### 裁判测试程序样例:
c++
#include <stdio.h>
#include <stdlib.h>
#define MAXVERTEXNUM 100
#define INFINITY 65535 //∞设为65535
//邻接点的定义
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; //邻接表
};
typedef struct MatriNode *PtrToMNode;
//邻接矩阵表示图
typedef struct MatriNode{
int Nv; //顶点数
int Ne; //边数
int G[MAXVERTEXNUM][MAXVERTEXNUM]; //邻接矩阵
char Data[MAXVERTEXNUM];
}MatriNode;
typedef PtrToGNode LGraph; //以邻接表方式存储的图类型
typedef PtrToMNode MGraph;//以邻接矩阵方式存储的图类型
LGraph matriToadj (MGraph gn);//无向图的邻接表表示转换为邻接矩阵表示
MGraph BuildGraph()
{
MGraph Graph;
int i,j,k,weight;
char a,b;
Graph = (PtrToMNode)malloc(sizeof(struct MatriNode));
/*请输入顶点数和边数*/;
scanf("%d %d",&Graph->Nv,&Graph->Ne);
/*请输入顶点信息*/
for(i = 0;i < Graph->Nv; i++)
{
getchar(); //getchar()函数是输入一个字符,用此函数将scanf()未处理的量进行释放;
scanf("%c",&Graph->Data[i]); //输入顶点数据
}
for(i = 0;i < Graph->Nv; i++)
for(j = 0;j < Graph->Nv; j++)
Graph->G[i][j] = INFINITY; //初始化邻接矩阵
/*请输入边的信息(格式为:起点数据 终点数据 权重)*/
for(k = 0;k < Graph->Ne ; k++)
{
getchar();
scanf("%c %c %d",&a,&b,&weight);
for( i = 0; Graph->Data[i] != a;i++)
; //找到顶点a在邻接矩阵中的下标
for( j = 0; Graph->Data[j] != b;j++)
; //找到顶点b在邻接矩阵中的下标
Graph->G[i][j] = weight;
Graph->G[j][i] = weight;
}
return Graph;
}
void outputGraphW(LGraph gl){
PtrToAdjVNode p;
printf("该图的邻接表为:");
int i;
for (i=0; i<gl->Nv; i++)
{
printf("\n%d---->",i);
p=gl->G[i].FirstEdge;
while(p){
printf(" %d",p->AdjV);
p=p->Next;
}
}
}
int main(){
LGraph Graph2;
MGraph MatriGraph;
MatriGraph = BuildGraph();
Graph2 = matriToadj(MatriGraph);
outputGraphW(Graph2);
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----> 4 1
1----> 4 3 2 0
2----> 4 3 1
3----> 4 2 1
4----> 3 2 1 0
答案:若无答案欢迎评论