-->
当前位置:首页 > 题库 > 正文内容

函数题:无向图的邻接矩阵表示转换为邻接表表示

Luz3年前 (2022-09-27)题库770
编写算法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;
}
/* 请在这里填写答案 */

![a3bb691e-54b7-4a58-b8a4-c441eb3df882.png](~/235e24a6-206a-4d1e-8ea0-e52af4843be2.png)

### 输入样例:
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







答案:若无答案欢迎评论

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。