Chapter 9 Graph (1)

图的邻接表表示

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

#define MaxVertexNum 100    //最大顶点数设为100
typedef int Vertex;         //用顶点下标表示顶点
typedef int WeightType;     //边的权值设为整数
typedef char DataType;      //顶点的数据存储

//边的定义
typedef struct ENode
{
	Vertex V1, V2;        //有向边<V1,V2>
	WeightType Weight;    //权重
}*Edge;

//邻接点的定义
typedef struct AdjVNode
{
	Vertex AdjV;           //邻接点下标
	WeightType Weight;     //边权重
	struct AdjVNode *Next; //指向下一邻接点的指针
}*PtrToAdjVNode;

//顶点表头结点的定义
typedef struct VNode
{
	PtrToAdjVNode FirstEdge;   //边表头指针
	DataType Data;             //存顶点的数据
}AdjList[MaxVertexNum];        //AdjList是邻接表类型

//图结点的定义
typedef struct GNode
{
	int Nv;     //顶点数
	int Ne;     //边数
	AdjList G;  //邻接表
}*LGraph;       //以邻接表方式存储图类型

//初始化邻接表图
LGraph CreateGraph(int VertexNum)
{
	Vertex V;
	LGraph Graph;

	Graph = (LGraph)malloc(sizeof(GNode));
	Graph->Nv = VertexNum;
	Graph->Ne = 0;

	//初始化邻接表表头
	for (V = 0; V < Graph->Nv; V++)
		Graph->G[V].FirstEdge = NULL;

	return Graph;
}

//插入边
void InsertEdge(LGraph Graph, Edge E)
{
	PtrToAdjVNode NewNode;

	//插入边<V1,V2>
	//为V2建立新的邻接点
	NewNode = (PtrToAdjVNode)malloc(sizeof(AdjVNode));
	NewNode->AdjV = E->V2;
	NewNode->Weight = E->Weight;
	//将V2插入V1的表头
	NewNode->Next = Graph->G[E->V1].FirstEdge;
	Graph->G[E->V1].FirstEdge = NewNode;

	//若是无向图,还要插入边<V2,V1>
	//为V1建立新的邻接点
	NewNode = (PtrToAdjVNode)malloc(sizeof(AdjVNode));
	NewNode->AdjV = E->V1;
	NewNode->Weight = E->Weight;
	//将V1插入V2的表头
	NewNode->Next = Graph->G[E->V2].FirstEdge;
	Graph->G[E->V2].FirstEdge = NewNode;
}

//创建一个邻接表图
LGraph BuildGraph()
{
	LGraph Graph;
	Edge E;
	Vertex V;
	int Nv,i;

	scanf("%d", &Nv);          //读入顶点个数
	Graph = CreateGraph(Nv);   //初始化有Nv个顶点但没有边的图

	scanf("%d", &Graph->Ne);   //读入边数
	if (Graph->Ne != 0)        //如果有边
	{
		E = (Edge)malloc(sizeof(ENode)); //建立边结点
		for (i = 0; i < Graph->Ne; i++)
		{
			//读入边,格式为“起点”,“终点”,“权重”
			scanf("%d %d %d", &E->V1, &E->V2, &E->Weight);
			InsertEdge(Graph, E);
		}
	}

	//如果顶点有数据的话,读入数据
	for (V = 0; V < Graph->Nv; V++)
		scanf("%c", &Graph->G[V].Data);

	return Graph;
}

//测试函数
int main()
{
	LGraph Graph = BuildGraph();
	Vertex V;
	PtrToAdjVNode P;
	for (V = 0; V < Graph->Nv; V++)
	{
		for (P = Graph->G[V].FirstEdge; P; P = P->Next)
			printf("%d ", P->AdjV);
		printf("\n");
	}
}

图的邻接矩阵表示

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

#define MaxVertexNum 100   //最大顶点数设为100
#define INFINITY 65535     //∞设为双字节无符号整数的最大值65535
typedef int Vertex;        //顶点下标表示顶点
typedef int WeightType;    //边的权值
typedef char DataType;     //顶点存储

//边的定义
typedef struct ENode
{
	Vertex V1, V2;       //边的两个顶点
	WeightType Weight;   //边的权重
}*Edge;

//图的结点定义
typedef struct GNode
{
	int Nv;         //顶点数
	int Ne;         //边数
	WeightType Weight[MaxVertexNum][MaxVertexNum];   //邻接矩阵
	DataType Data[MaxVertexNum];     //存顶点的数据
}*MGraph;

//初始化一个图
MGraph CreateGraph(int VertexNum)
{
	//初始化一个有VertexNum个结点但没有边的图
	Vertex V, W;
	MGraph Graph;

	Graph = (MGraph)malloc(sizeof(GNode));  //建立图
	Graph->Nv = VertexNum;
	Graph->Ne = 0;

	//初始化邻接矩阵,将权重置为∞
	for (V = 0; V < Graph->Nv; V++)
		for (W = 0; W < Graph->Nv; W++)
			Graph->Weight[V][W] = INFINITY;

	return Graph;
}

//边的插入
void InsertEdge(MGraph Graph,Edge E)
{
	Graph->Weight[E->V1][E->V2] = E->Weight; 
	//如果是无向图
	Graph->Weight[E->V2][E->V1] = E->Weight;
}

//构建一个图
MGraph BuildGraph()
{
	MGraph Graph;
	Edge E;
	Vertex V;
	int Nv, i;

	scanf("%d", &Nv);      //读入顶点个数
	Graph = CreateGraph(Nv);  //初始化一个有VertexNum个结点但没有边的图

	scanf("%d", &(Graph->Ne));  //读入边数
	if (Graph->Ne != 0)         //如果有边
	{
		E = (Edge)malloc(sizeof(ENode));  //建立边结点
		//读入边,格式为“起点”,“终点”,“权重”
		for (i = 0; i < Graph->Ne; i++)
		{
			scanf("%d %d %d", &E->V1, &E->V2, &E->Weight);
			InsertEdge(Graph, E);   //插入边
		}
	}
        
	 //如果结点本身需要存储数据
	for (V = 0; V < Graph->Nv; V++)
		scanf("%c", &Graph->Data[V]);

	return Graph;
}

//测试函数
int main()
{
	MGraph Graph = BuildGraph();
	Vertex V, W;
	for (V = 0; V < Graph->Nv; V++)
	{
		for (W = 0; W < Graph->Nv; W++)
		{
			printf("%d\t", Graph->Weight[V][W]);
		}
		printf("\n");
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值