图的应用实验(C语言)

1.实验目的

(1)掌握图的结构特性,各种存储结构及其适用范围;

(2)掌握图的创建及遍历算法。

(3)能够使用图解决实际问题,计算最小代价生成树

2.基本内容:

算法1:输入图的类型、顶点数、狐(边)数、顶点信息、狐(边)信息,建立相应的图(具体类型可以是无向图、有向图、无向网、有向网,采用邻接矩阵存储结构);分别按深度优先搜索和广度优先搜索遍历图;按某种形式输出图及遍历结果。

3.代码实现

cs 复制代码
#include <stdio.h>
 
#define N 20       /*图中顶点数目的最大值为N*/
#define TRUE 1
#define FALSE 0
 

int visited[N];    /*访问标识数组*/
typedef struct     /*队列的定义*/
{
    int data[N];
    int front,rear;
}queue;
 

typedef struct     /*定义图的邻接矩阵*/
{
    int vexnum,arcnum;        //图中顶点数目、边/弧的数目
    char vexs[N];             //一维数组:存储顶点信息
    int arcs[N][N];           //二维数组:存储顶点与顶点之间的关系
}graph;
 
void createGraph(graph *g);   /*建立一个无向图的邻接矩阵*/
void dfs(int i,graph *g);     /*从第i个顶点出发进行深度优先搜索*/
void tdfs(graph *g);          /*深度优先搜索整个图*/
void bfs(int k,graph *g);     /*从第k个顶点出发进行广度优先搜索*/
void tbfs(graph *g);          /*广度优先搜索整个图*/
void init_visit();            /*初始化访问标识数组*/
 

//1.建立一个无向图的邻接矩阵
void createGraph(graph *g)    /*建立一个无向图的邻接矩阵*/
{
    int i,j;
    char v;
    g->vexnum = 0;
    g->arcnum = 0;
    i=0;
    printf("输入顶点序列(以#结束):\n");
    while((v=getchar()) != '#')
    {
        g->vexs[i] = v;        /*读入顶点信息*/
        i++;
    }
    g->vexnum = i;             /*顶点数目*/
 
    for(i=0;i<g->vexnum;i++)
	{   /*邻接矩阵初始化*/
        for(j=0;j<g->vexnum;j++)
        {
        	    g->arcs[i][j] = 0;
		}
	}
 
    printf("输入边的信息(以-1,...结束):\n");
    scanf("%d,%d",&i,&j);      /*读入边i,j*/
    while(i != -1)             /*读入i,j为-1时结束*/
    {
        g->arcs[i][j] = 1;
        g->arcs[j][i] = 1;
        scanf("%d,%d",&i,&j);
    }
}
 

//2.从第i个顶点出发进行深度优先搜索
void dfs(int i,graph *g)    /*从第i个顶点出发进行深度优先搜索*/
{
    int j;
    printf("%c",g->vexs[i]);
    visited[i] = TRUE;
    for(j=0;j<g->vexnum;j++)
    {
    	    if((g->arcs[i][j]==1) && (!visited[j]))
			{
			    dfs(j,g);	
			}  //若第j个顶点与第i个顶点邻接且未被访问,则访问该顶点

	}
}
 

//3.深度优先搜索整个图
void tdfs(graph *g)      /*从图中各个顶点开始深度优先搜索整个图*/
{
    int i;
    for(i=0;i<g->vexnum;i++)
    {
        if(visited[i] != TRUE)
        {
            printf("\n从顶点%c开始深度优先搜索序列:",g->vexs[i]);
            dfs(i,g);
            printf("\n");
        }
        init_visit();  //每一轮遍历完成后需要初始化访问标识数组
    }
}
 

//4.从第k个顶点出发进行广度优先搜索
void bfs(int k,graph *g)  /*从第k个顶点出发进行广度优先搜索*/
{
    int i,j;
    queue qlist;
    queue *q;
    q = &qlist;
    q->rear = 0;
    q->front = 0;
    printf("%c",g->vexs[k]);   //访问第k个顶点
    visited[k] = TRUE;
    q->data[q->rear] = k;      //第k个顶点入队(这里是将顶点下标k入队)
    q->rear = (q->rear+1)%N;
    while(q->rear != q->front) //队列非空时
    {
        i = q->data[q->front]; //队头元素出队
        q->front = (q->front+1)%N;
 
        //访问出队顶点所有相邻接、未被访问过的顶点。并在访问后将其入队
        for(j=0;j<g->vexnum;j++)
        {
            if((g->arcs[i][j]==1) && (!visited[j]))
            {
                printf("%c",g->vexs[j]);
                visited[j] = TRUE;
                q->data[q->rear] = j;
                q->rear =( q->rear+1)%N;
            }        	
		}

    }
}
 

//5.广度优先搜索整个图
void tbfs(graph *g) /*广度优先搜索整个图*/
{
    int i;
    printf("\n从顶点%c开始广度优先搜索序列:",g->vexs[0]);
    for(i=0;i<g->vexnum;i++)
    {
        if(visited[i] != TRUE)
        {
        	bfs(i,g);          	
		}
  	
	}

}
 

//6.初始化访问标识数组
void init_visit()   /*初始化访问标识数组*/
{
    int i;
    for(i=0;i<N;i++)
    {
        visited[i] = FALSE;    	
	}

}
 

int main()
{
    graph ga;
    int i,j;
    createGraph(&ga);
    printf("无向图的邻接矩阵:\n");
    for(i=0;i<ga.vexnum;i++)
    {
        for(j=0;j<ga.vexnum;j++)
        {
            printf("%3d",ga.arcs[i][j]);        	
		}
        printf("\n");
    }
    init_visit();
    tdfs(&ga);
    init_visit();
    tbfs(&ga);
    printf("实验结束!\n");
    return 0;
}

4.运行结果

相关推荐
WPG大大通3 小时前
基于DIODES AP43781+PI3USB31531+PI3DPX1207C的USB-C PD& Video 之全功能显示器连接端口方案
c语言·开发语言·计算机外设·开发板·电源·大大通
析木不会编程4 小时前
【C语言】动态内存管理:详解malloc和free函数
c语言·开发语言
达帮主4 小时前
7.C语言 宏(Macro) 宏定义,宏函数
linux·c语言·算法
茶猫_5 小时前
力扣面试题 39 - 三步问题 C语言解法
c语言·数据结构·算法·leetcode·职场和发展
初学者丶一起加油5 小时前
C语言基础:指针(数组指针与指针数组)
linux·c语言·开发语言·数据结构·c++·算法·visual studio
半盏茶香6 小时前
C语言勘破之路-最终篇 —— 预处理(上)
c语言·开发语言·数据结构·c++·算法
2401_858286116 小时前
118.【C语言】数据结构之排序(堆排序和冒泡排序)
c语言·数据结构·算法
Zer0_on14 小时前
数据结构栈和队列
c语言·开发语言·数据结构
一只小bit14 小时前
数据结构之栈,队列,树
c语言·开发语言·数据结构·c++
马浩同学15 小时前
【GD32】从零开始学GD32单片机 | DAC数模转换器 + 三角波输出例程
c语言·单片机·嵌入式硬件·mcu