大话数据结构16:图

基础介绍

图的数据结构

图主要由顶点和边组成
在这里插入图片描述
在这里插入图片描述
无向边用()
在这里插入图片描述
有向边用<>
在这里插入图片描述
入度:
一顶点V为头的弧的数目为入度,
出度:
以其为尾的数目为出度。

连通图
在这里插入图片描述
连通图生成树
在这里插入图片描述

图的定义与术语总结

在这里插入图片描述

图的基本操作

在这里插入图片描述

图的存储结构 邻接矩阵

在这里插入图片描述

邻接矩阵图的代码
#include "stdio.h"    
#include "stdlib.h"   
#include "io.h"  
#include "math.h"  
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXVEX 100 /* 最大顶点数,应由用户定义 */
#define INFINITY 65535

typedef int Status;	/* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef char VertexType; /* 顶点类型应由用户定义  */
typedef int EdgeType; /* 边上的权值类型应由用户定义 */


typedef struct
{
	VertexType vexs[MAXVEX];
	EdgeType arc[MAXVEX][MAXVEX];
	int numNodes;
	int numEdges;
}MGraph;

//建立无向网图的邻接矩阵表示
void CreateMGraph(MGraph* G)
{
	int i;
	int j;
	int k;
	int w;

	printf("输入顶点数和边数: \n");
	scanf_s("%d,%d", &G->numNodes, &G->numEdges);
	for (int i = 0; i < G->numNodes; i++)
		scanf_s(&G->vexs[i]);
	for (int i = 0; i < G->numNodes; i++)
	{
		for (int j = 0; j < G->numNodes; j++)
		{
			G->arc[i][j] = INFINITY;/* 邻接矩阵初始化 */

		}
	}
	/* 读入numEdges条边,建立邻接矩阵 */
	for (int k = 0; k < G->numEdges; k++)
	{
		printf("输入边(vi,vj)上的下标i,下标j和权w:\n");
		scanf_s("%d,%d,%d", &i, &j, &w); /* 输入边(vi,vj)上的权w */
		G->arc[i][j] = w;
		G->arc[j][i] = G->arc[i][j]; /* 因为是无向图,矩阵对称 */
	}
}
int main(void)
{
	MGraph G;
	CreateMGraph(&G);

	return 0;
}

邻接表存储结构

在这里插入图片描述

#include "stdio.h"    
#include "stdlib.h"   
#include "io.h"  
#include "math.h"  
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXVEX 100 /* 最大顶点数,应由用户定义 */

typedef int Status;	/* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef char VertexType; /* 顶点类型应由用户定义 */
typedef int EdgeType; /* 边上的权值类型应由用户定义 */

typedef struct EdgeNode // 边表节点
{
	int adjvex;  /* 邻接点域,存储该顶点对应的下标 */
	EdgeType info;
	struct EdgeNode *next;/* 链域,指向下一个邻接点 */
}EdgeNode;

typedef struct VertexNode
{
	VertexType data; //顶点域
	EdgeNode* firstedge;//边表头指针
}VertexNode,AdjList[MAXVEX];

typedef struct
{
	AdjList adjList;
	int numNodes;//顶点数目
	int numEdges;//边表数目
}GraphAdjList;

// 建立图的邻接表结构
void CreateALGraph(GraphAdjList* G)
{
	EdgeNode* e;
	printf("输入顶点数和边数:\n");
	scanf_s("%d,%d", &G->numNodes, &G->numEdges); /* 输入顶点数和边数 */
	for (int i = 0; i < G->numNodes; i++) /* 读入顶点信息,建立顶点表 */
	{
		scanf_s(&G->adjList[i].data); 	/* 输入顶点信息 */
		G->adjList[i].firstedge = NULL; 	/* 将边表置为空表 */
	}
	for (int k = 0; k < G->numEdges; k++)/* 建立边表 */
	{
		int i;
		int j;
		printf("输入边(vi,vj)上的顶点序号:\n");
		scanf_s("%d,%d", &i, &j); /* 输入边(vi,vj)上的顶点序号 */
		e = new EdgeNode();
		e->adjvex = j;
		e->next = G->adjList[i].firstedge;
		G->adjList[i].firstedge = e; //完成链表连接

	}
}

int main()
{
	GraphAdjList G;
	CreateALGraph(&G);

	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值