《软件技术基础》实验指导 实验六

本文介绍了一个关于图的遍历算法的实验,包括深度优先搜索和两种广度优先搜索的实现方式。实验通过邻接矩阵存储无向图,并从不同顶点出发进行遍历,演示了图的基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验六 图

一、实验目的

  1. 熟悉图的邻接矩阵和邻接表的存储结构
  2. 熟悉图的邻接矩阵和邻接表的建立算法
  3. 掌握图的遍历算法

二、实验内容

  1. 无向图采用邻接矩阵存储,编写深度优先搜索遍历算法,从不同的顶点出发对无向图进行遍历。

Tips

  1. 可采用深度优先搜索 6.1 和广度优先搜索 6.2 进行遍历
  2. 广度优先搜索可使用 6.2.1 递归或 6.2.2 运用队列循环的方式实现

Answer

6.1

#include<stdio.h>
//图的邻接矩阵类型定义
const int n=8;
const int e=10;
typedef char vextype;
typedef int adjtype;
typedef struct
{
    vextype vexs[n];
    adjtype arcs[n][n];
}graph;
graph*g=new graph;
void creatgraph();
void dfsa(int);
int visited[n];

//void main()
int main()
{
    creatgraph();
    int i;
    while(1)
    {
        for(i=0;i<n;i++)
        {
            visited[i]=0;
        }
        printf("输入出发点序号(0-7),输入-1结束:");
        scanf("%d",&i);
        if(i==-1)
        {
            break;
        }
        dfsa(i);
    }
    return 0;
}

//建立无向图邻接矩阵
void creatgraph()
{
    int i,j,k;
    char ch;
    printf("输入8个顶点的字符数据信息:\n");
    for(i=0;i<n;i++)
    {
        if((ch=getchar())!='\n') g->vexs[i]=ch;
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            g->arcs[i][j]=0;
        }
    }
    printf("输入10条边的起、终点i,j:\n"); 
    for(k=0;k<e;k++)
    {
        scanf("%d,%d",&i,&j); //顶点序号从0开始
        g->arcs[i][j]=g->arcs[j][i]=1;
    }
}

//深度优先搜索遍历

void dfsa(int i)
{
    int j;
    printf("Node %c\n",g->vexs[i]);
    visited[i]=1;
    for(j=0;j<n;j++)
    {
        if(g->arcs[i][j]==1&&visited[j]==0)
        {
            dfsa(j);
        }
    }
}

6.2.1

#include<stdio.h>
//图的邻接矩阵类型定义
const int n=8;
const int e=10;
typedef char vextype;
typedef int adjtype;
typedef struct
{
    vextype vexs[n];
    adjtype arcs[n][n];
}graph;
graph*g=new graph;
void creatgraph();
void bfsa(int);
int visited[n];

//void main()
int main()
{
    creatgraph();
    int i;
    while(1)
    {
        for(i=0;i<n;i++)
        {
            visited[i]=0;
        }
        printf("输入出发点序号(0-7),输入-1结束:");
        scanf("%d",&i);
        if(i==-1)
        {
            break;
        }
        bfsa(i);
    }
    return 0;
}

//建立无向图邻接矩阵
void creatgraph()
{
    int i,j,k;
    char ch;
    printf("输入8个顶点的字符数据信息:\n");
    for(i=0;i<n;i++)
    {
        if((ch=getchar())!='\n') g->vexs[i]=ch;
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            g->arcs[i][j]=0;
        }
    }
    printf("输入10条边的起、终点i,j:\n"); 
    for(k=0;k<e;k++)
    {
        scanf("%d,%d",&i,&j); //顶点序号从0开始
        g->arcs[i][j]=g->arcs[j][i]=1;
    }
}

//广度优先搜索遍历 递归
void bfsa(int i)
{
    int j;
    //判断根节点是否已经遍历
    if(visited[i]==0)
    {
        printf("Node %c\n",g->vexs[i]);
        visited[i]=1;
    }
    //遍历根节点的邻接点
    for(j=0;j<n;j++)
    {
        if(g->arcs[i][j]==1&&visited[j]==0)
        {
            printf("Node %c\n",g->vexs[j]);
            visited[j]=1;
            //递归遍历邻接点
            bfsa(j);
        }
    }
}

6.2.2

#include<stdio.h>
//图的邻接矩阵类型定义
const int n=8;
const int e=10;
typedef char vextype;
typedef int adjtype;
typedef struct
{
    vextype vexs[n];
    adjtype arcs[n][n];
}graph;
graph*g=new graph;
void creatgraph();
void bfsb(int);
int visited[n];

//void main()
int main()
{
    creatgraph();
    int i;
    while(1)
    {
        for(i=0;i<n;i++)
        {
            visited[i]=0;
        }
        printf("输入出发点序号(0-7),输入-1结束:");
        scanf("%d",&i);
        if(i==-1)
        {
            break;
        }
        bfsb(i);
    }
    return 0;
}

//建立无向图邻接矩阵
void creatgraph()
{
    int i,j,k;
    char ch;
    printf("输入8个顶点的字符数据信息:\n");
    for(i=0;i<n;i++)
    {
        if((ch=getchar())!='\n') g->vexs[i]=ch;
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            g->arcs[i][j]=0;
        }
    }
    printf("输入10条边的起、终点i,j:\n"); 
    for(k=0;k<e;k++)
    {
        scanf("%d,%d",&i,&j); //顶点序号从0开始
        g->arcs[i][j]=g->arcs[j][i]=1;
    }
}

//广度优先遍历 循环
void bfsb(int i)
{
    int q[2*n],Fq=0,Rq=0;
    int node,j;
    q[Rq++] = i;
    while(Fq < Rq)
    {
        node = q[Fq++];
        if(visited[node]==0)
        {
            printf("Node %c\n",g->vexs[node]);
            visited[node] = 1;
            //将顶点node的邻接点入队列
            for(int j = 0; j < n; j++)
            {
                if(g->arcs[node][j]==1&&visited[j]==0)
                {
                    q[Rq++] = j;
                }
            }
        }
    }
}

转载于:https://www.cnblogs.com/vanlion/p/datastructure-exp-6.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值