数据结构实验报告-实验四 图的构造与遍历

本次实验旨在掌握图的邻接矩阵和邻接表表示,包括图的基本操作函数实现,如深度优先遍历(DFS)和广度优先遍历(BFS)。实验内容包括创建无向图的邻接表,进行图的查找,以及解决实际问题,如求从站0到站n-1的最少换车次数。实验结果展示了程序的流程图、运行截图及源代码。

实验四   图的构造与遍历

 

实验目的

1、图的的定义和遍历

(1)掌握图的邻接矩阵、邻接表的表示方法。

(2)掌握建立图的邻接矩阵的算法。

(3)掌握建立图的邻接表的算法。

(4)加深对图的理解,逐步培养解决实际问题的能力。

实验内容

1、图的定义和遍历

(一)基础题

1、编写图基本操作函数:

(1)CreateALGraph(ALGraph &G) 建立无向图的邻接表表示;

(2)LocateVex(ALGraph &G,char v)图查找信息;

(3)DFSTraverse(ALGraph &G)图的深度遍历操作

(4)BFSTraverse(ALGraph &G)图的广度优先遍历

(5)Create(MGraph &G)邻接矩阵的创建

2、调用上述函数实现下列操作:

(1)建立一个图的邻接矩阵和图的邻接表;

(2)采用递归深度优先遍历输出图的邻接矩阵;

(3)采用递归深度优先输出图的邻接表;

(4)采用图的广度优先遍历输出图的邻接表;

(5)采用图的广度优先遍历输出图的邻接表。

(二)提高题-

【问题描述】设某城市有n个车站,并有m条公交线路连接这些车站。假设这些公交车站都是单向的,这n个车站被顺序编号为0~n-1。在本程序中输入该城市的公交线路数,车站个数以及各公交线路上各站的编号。

【实现要求】求得从站0出发乘公交车至站n-1的最少换车次数。

 

实验结果

1、图的定义和遍历

(一)基础题

(1)画出数据结构基本运算的流程图

 
   

 

 

 

 

 

 

 

 

 

(2)程序运行主要结果截图

 

(3)程序源代码

#include<stdio.h>

#include<stdlib.h>

typedef struct ArcNode

{

    int adjvex;  //邻接点域

    struct ArcNode *nextarc; //指向下一个邻接点的指针域

    int weight;

}ArcNode;//边结点

typedef struct VNode

{

    char vertex;   //顶点域

    ArcNode *firstarc;//第一条边的指针

}VNode,AdjList[10];//顶点结点向量

typedef struct

{

    AdjList adjlist;

    int vexnum,arcnum;

}ALGraph;

//图的邻接矩阵

typedef struct

{

    int adj;

}AdjMatrix[10][10];

typedef struct

{

    int vexs[10];

    AdjMatrix arcs;

    int vexnum,arcnum;

}MGraph;

int LocateVex(ALGraph &G,char v)//查找顶点信息

{

    int k,j=0;

    for(k=0;k<G.vexnum;k++)

      if(G.adjlist[k].vertex==v)

      {

          j=k;

          break;

      }

      return j;

}

void CreateALGraph(ALGraph &G)

{
    
    //建立无向图的邻接表表示

    int i,j,k,w;

    char v1,v2;

    ArcNode *s;

    printf("请输入顶点数和边数(vexnum,arcnum):");

    scanf("%d,%d",&G.vexnum,&G.arcnum);

    for(i=0;i<G.vexnum;i++)

    {
    
    //建立顶点表

        getchar();

        printf("请输入第%d顶点信息:",i+1);

        scanf("%c",&G.adjlist[i].vertex);//读入顶点信息

        G.adjlist[i].firstarc=NULL;//边表置为空表

    }

    for(k=0;k<G.arcnum;k++)

    {
    
    //建立边表

        getchar();

        printf("请输入第%d边的顶点对序号和边的权值(v1,v2,w):",k+1);

        scanf("%c,%c,%d",&v1,&v2,&w);

        j=LocateVex(G,v2);

        i=LocateVex(G,v1);

        s=(ArcNode*)malloc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值