[笔记] Graph.h头文件

#pragma once
#include "SeqList.h"					//包含顺序表头文件

#define MaxVertices 10
#define MaxWeight 100
typedef struct {

	SeqList Vertices;					//存放顶点的顺序表
	int edge[MaxVertices][MaxVertices];	//存放边的邻接矩阵
	int numOfEdges;						//边的条数

}AdjMGraph;//图的结点结构体定义

//初始化
//初始化有n个顶点的顶点顺序表和邻接矩阵
void Initiate(AdjMGraph* G, int n) {
	int i, j;
	for (i=0; i < n; i++)
	{
		for ( j = 0; j < n; j++)
		{
			if (i == j)G->edge[i][j] = 0;
			else G->edge[i][j] = MaxWeight;		//MaxWeight表示无穷大
		}
	}
	G->numOfEdges = 0;							//边的条数置为0
	ListInitiate(&G->Vertices);					//顺序表初始化
}

//插入顶点
void InsertVertex(AdjMGraph* G, DataType vertex) {
	//在图中插入顶点vertex
	ListInsert(&G->Vertices, G->Vertices.size, vertex);//在顺序表尾插入
}

//插入边
void InsertEdge(AdjMGraph* G,int v1,int v2,int weight) {
	//在图G中插入边<v1,v2>,边<v1,v2>的权值为weight
	if (v1<0||v1>=G->Vertices.size||v2<0||v2>=G->Vertices.size)
	{
		printf("参数v1或v2越界出错!\n");
		return;
	}
	G->edge[v1][v2] = weight;
	G->numOfEdges++;
}

//删除边
void DeleteEdge(AdjMGraph* G, int v1, int v2) {
	//在图中删除边<v1,v2>
	if (v1 < 0 || v1 >= G->Vertices.size || v2 < 0) {
		v2 >= G->Vertices.size || v1 == v2;
		printf("参数v1或v2出错!\n");
		return;
	}
	if (G->edge[v1][v2]==MaxWeight||v1==v2)
	{
		printf("该边不存在!\n");
		return;
	}
	G->edge[v1][v2] = MaxWeight;
	G->numOfEdges--;
}

//取第一个邻接顶点
int GetFirstVex(AdjMGraph G, int v) {
	//在图G中寻找序号为v的顶点的第一个邻接顶点
	//如果这样的邻接顶点存在,则返回该邻接顶点的序号,否则返回-1
	int col;
	if (v < 0 || v >= G.Vertices.size) {
		printf("参数v1越界出错!\n");
		return -1;
	}
	for (col=0;  col< G.Vertices.size; col++)
	{
		if (G.edge[v][col] > 0 && G.edge[v][col] < MaxWeight)return col;
	}
	return -1;
}

//取下一个邻接顶点
int GetNextVex(AdjMGraph G, int v1, int v2) {
	//在图G中寻找v1顶点的灵界顶点v2的下一个邻接顶点
	//如果这样的顶点存在,则返回该邻接顶点的序号,否则返回-1
	
	//v1和v2都是相应顶点的序号
	int col;
	if (v1<0||v1>=G.Vertices.size||v2<0||v2>=G.Vertices.size)
	{
		printf("参数v1或v2越界出错!\n");
		return -1;
	}
	for (col=v2+1; col < G.Vertices.size; col++)
	{
		if (G.edge[v1][col] > 0 && G.edge[v1][col] < MaxWeight)return col;
	}
	return -1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值