数据结构c实验十 图

实验十 图

1、实验目的:
(1)理解图的概念
(2)掌握图的常见存储结构。
(3)理解图的常见操作。
2、实验环境与设备:
已安装Visual Studio 2010(或其以上版本)集成开发环境的计算机。
3、实验原理:
(1)图的邻接矩阵存储。
(2)带权无向图(无向网)的最小生成树实现。
4、实验内容:
(1)实现图的邻接矩阵存储
(2)输出显示图的顶点、边和邻接矩阵
(3)求解图的最小生成树。

#include <stdio.h>
#include <stdlib.h>

// 预定义常量
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

// 预定义类型
typedef int Status;

// 本程序定义常量
#define INFINITY INT_MAX	// 表示最大值无穷大
#define MAX_VERTEX_NUM 20	// 最大顶点个数

// 本程序定义类型
typedef enum{
    DG, DN, UDG, UDN } GraphKind;  // 图的种类标记{有向图,有向网,无向图,无向网}
typedef int VRType ;		// 边的类型,对无权图,用1或0表示相邻否;对带权图,则为权值类型
typedef char VertexType ;	// 顶点元素类型
typedef char InfoType ;		// 边信息

typedef struct ArcCell		// 表示一条边
{
   
	VRType adj;			// 边
	InfoType *info;		// 该边相关信息的指针
}ArcCell, AdjMatrix[ MAX_VERTEX_NUM ][ MAX_VERTEX_NUM ];

typedef struct
{
   
	VertexType vexs[ MAX_VERTEX_NUM ];// 顶点向量,存储顶点信息
	AdjMatrix arcs;		// 邻接矩阵,存储边
	int vexnum;			// 图的当前顶点数
	int arcnum;			// 图的当前边数
	GraphKind kind;		// 图的种类标记
}MGraph;				// 采用邻接矩阵存储的图

typedef struct	  // 记录从顶点集U到V-U的代价最小的边的辅助数组定义:
{
   
	VertexType adjvex;	
	VRType lowcost;		

}closedge[ MAX_VERTEX_NUM ];

// 算法7.1 采用数组(邻接矩阵)表示法,构造图G。
Status CreateGraph( MGraph *pG ) {
      
	printf( "请输入图的种类(0:有向图;1:有向网;2:无向图;3:无向网):" );
    scanf("%d", &pG->kind);		// 自定义输入函数,读入一个随机值
	
    switch (pG->kind) {
   
        case  DG: 
			return CreateDG(pG);   // 构造有向图G
        case  DN: 
			return CreateDN(pG);   // 构造有向网G
        case UDG: 
			return CreateUDG(pG);  // 构造无向图G
        case UDN: 
			return CreateUDN(pG);  // 构造无向网G,算法7.2
        default : 
			return ERROR;
    }
} // CreateGraph

// 确定顶点u在G中位置
int LocateVex( MGraph G, VertexType u )
//  算法 7.2,采用数组(邻接矩阵)表示法,构造无向网G。
Status CreateUDN(MGraph *pG)
// 显示网络(包括有向网和无向网)
void DisplayNet( MGraph G )
//在数组minEdge中求非零的最小边
int minimum( closedge minEdge, MGraph G )
// 算法7.9,用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边。
void MiniSpanTree_PRIM(MGraph G, VertexType u)
// 主函数
int main( void )
{
   
	MGraph G ;
	
	printf( "请输入一个无向网:\n" );
	CreateGraph( &G );
    if( G.kind == DG || G.kind == UDG )
		DisplayGraph( G );
	else
		DisplayNet( G );

	printf( "该无向网的最小生成树为:\n" );
	MiniSpanTree_PRIM( G, '1' );	//从1号顶点(即v1)开始使用普里姆算法求最小生成树
	printf( "\n" );	

	return 0;
}

5、实验考核:
1)完成纸质版实验报告
2)提交电子版作业

6、执行结果示例如下:
在这里插入图片描述

构造上述图,程序的参考输入数据如下:
3
6
10

1
2
3
4
5
6

1 2 6
1 3 1
2 3 5
1 4 5
3 4 5
3 6 4
4 6 2
2 5 3
3 5 6
5 6 6

记不清了,代码里好像有bug,只适合这个实验能跑通

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 预定义常量
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值