邻接矩阵和邻接表笔记

image

邻接矩阵
image

#include <iostream>
using namespace std;
//定义边
typedef struct Enode *PtrlEnode;

struct Enode {
	int V1, V2; //有向边<V1,V2>
	int weight;//权重
};
typedef PtrlEnode Edge;
//图节点定义
typedef struct Gnode  *PtrlGnode;

struct Gnode {
	int nv;//顶点数
	int ne;//边数
	int G[100][100];//最大顶点数设为100;邻接矩阵
};
typedef PtrlGnode  MGraph;//以邻接矩阵存储的图类型

MGraph CreateGraph(int VertexNum) {
	//初始化有VertexNum个顶点且无边的图
	int V, M;
	MGraph Graph = new Gnode;
	Graph->nv = VertexNum;
	Graph->ne = 0;
	for(int i=0;i<100;i++)
	{
		for(int j=0;j<100;j++)
		Graph->G[i][j]=9999;
	}
	return Graph;
}

void InsertEdge(MGraph Graph, Edge E) {
	Graph->G[E->V1][E->V2] = E->weight; //插入<V1,V2>
	Graph->G[E->V2][E->V1] = E->weight; //无向图还要反向插
}

MGraph BuildGraph() {
	MGraph Graph;
	Edge E;
	int V;
	int nv, i;
	cin >> nv;//顶点个数
	Graph = CreateGraph(nv); //初始化nv个顶点且无边的图
	cin >> Graph->ne;//读入边数
	if (Graph->ne != 0) {
		E = new Enode;
		for (i = 0; i < Graph->ne; i++) {
			cin >> E->V1 >> E->V2 >> E->weight;
			InsertEdge(Graph, E);
		}
	}
	return Graph;
}

int main() {

	MGraph Graph = BuildGraph();
	for (int i = 0; i < Graph->nv; i++) {
		for (int j = 0; j < Graph->nv; j++)
			cout << Graph->G[i][j] << " ";
		cout << endl;
	}
	return 0;
}

邻接表
image

#include <iostream>
using namespace std;
//定义边
typedef struct Enode *PtrlEnode;

struct Enode {
	int V1, V2; //有向边<V1,V2>
	int weight;//权重
};
typedef PtrlEnode Edge;

//邻接点定义
typedef struct Adjvnode  *PtrlAdjvnode;
struct Adjvnode {
	int Adjv;//邻接点下标
	int weight;//边权重
	PtrlAdjvnode next;
};

//顶点表头结点的定义
typedef struct Vnode {
	PtrlAdjvnode FirstEdge;//边表头的指针
} AdjvList[100]; //邻接表类型

//图节点定义
typedef struct Gnode *PtrlGnode;
struct Gnode {
	int nv;//顶点数
	int ne;//边数
	AdjvList G;//邻接表
};
typedef PtrlGnode LGraph;

LGraph CreatGraph(int Vertexnum) {
	//初始化一个有Vertexnum个顶点且没有边的图
	int V;
	LGraph Graph;

	Graph = new 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) {
	PtrlAdjvnode newnode;
	//插入边<V1,V2>
	//为V2建立新的邻接点
	newnode = new Adjvnode;
	newnode->Adjv = E->V2;
	newnode->weight = E->weight;
	//将V2插入V1的表头
	newnode->next = Graph->G[E->V1].FirstEdge;
	Graph->G[E->V1].FirstEdge = newnode;

	//如果是无向图,就还要反向再插一次
	//为V1建立新的邻接点
	newnode = new 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;
	int V;
	int nv, i;
	cin >> nv;//顶点个数
	Graph = CreatGraph(nv); //初始化nv个顶点且无边的图
	cin >> Graph->ne;//读入边数
	if (Graph->ne != 0) {
		E = new Enode;
		for (i = 0; i < Graph->ne; i++) {
			cin >> E->V1 >> E->V2 >> E->weight;
			InsertEdge(Graph, E);
		}
	}
	return Graph;
}

posted @   帝宝单推人!  阅读(48)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示