本题要求建立一个无向图,采用邻接表做为存储结构。
例如
函数接口定义:
在这里描述函数接口。例如:
int locate(ALGraph G,char v);//求顶点v的下标
void CreatMGraph(ALGraph &G);//创建图G
G
是图,采用邻接表存储结构, v
为顶点的值。
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:
#include <stdio.h>
#include <stdlib.h>
#define MVNum 100 //最大顶点数
typedef struct ArcNode{ //表结点
int adjvex; //邻接点的位置
struct ArcNode *nextarc; //指向下一个表结点的指针
}ArcNode;
typedef struct VNode{
char data; //顶点信息
ArcNode *firstarc; //指向第一个表结点的指针
}VNode, AdjList[MVNum]; //AdjList表示邻接表类型
typedef struct{
AdjList vertices; //头结点数组
int vexnum, arcnum; //图的当前顶点数和边数
}ALGraph;
void CreatMGraph(ALGraph &G);/* 创建图 */
void printGraph(ALGraph G);/*输出图 */
int main()
{
ALGraph G;
CreatMGraph(G);
printGraph(G);
return 0;
}
void printGraph(ALGraph G)
{
int i;
ArcNode *p;
for(i=0;i<G.vexnum;i++)
{
printf("%c:",G.vertices[i].data);
for(p=G.vertices[i].firstarc;p;p=p->nextarc)
printf(" %c",G.vertices[p->adjvex].data);
printf("\n");
}
}
/* 请在这里填写答案 */
输入信息为:第一行给出图的顶点数n和边数e。第二行给出n个字符,表示n个顶点的数据元素的值。后面是e行,给出每一条边的两个顶点的值(顶点之间无空格)。
输出每个顶点的值以及各顶点的邻接点的值。
输入样例:
7 9
0123456
02
03
04
13
15
23
25
45
56
输出样例:
0: 4 3 2
1: 5 3
2: 5 3 0
3: 2 1 0
4: 5 0
5: 6 4 2 1
6: 5
我的代码+注释如下:
//邻接表需要传地址
//ALGraph为该邻接表,其中的vertices数组存放头节点
//vertices数组是由VNode组成的结构体,其中的data为数据域,firstarc为指针域
int locate(ALGraph G, char v)
{
for(int i=0;i<G.vexnum;i++)
if(G.vertices[i].data==v)return i;
return -1;
}
void CreatMGraph(ALGraph &G)//创建图G
{
scanf("%d %d\n",&G.vexnum,&G.arcnum);
int i,j,k;
for(i=0;i<G.vexnum;i++)
{
scanf("%c",&G.vertices[i].data);
G.vertices[i].firstarc=NULL;
}
getchar();
char v1,v2;
for(k=0;k<G.arcnum;k++)
{
scanf("%c%c\n",&v1,&v2);
i=locate(G,v1);
j=locate(G,v2);
ArcNode *p1=(ArcNode*)malloc(sizeof(ArcNode));
p1->adjvex=j;
p1->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p1;
ArcNode *p2=(ArcNode*)malloc(sizeof(ArcNode));
p2->adjvex=i;
p2->nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=p2;
}
}