PTA 图的创建-邻接表 c++

本题要求建立一个无向图,采用邻接表做为存储结构。
例如

image.png

函数接口定义:

在这里描述函数接口。例如:
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;
    }
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值