首页 > 其他分享 >有向图的创建以及遍历

有向图的创建以及遍历

时间:2024-05-29 10:58:50浏览次数:20  
标签:ArcNode 遍历 int 创建 ALGraph 有向图 nextare fin 节点

有向图的创建有很多种方法,这里简要介绍邻接表的创建,以及通过邻接表创建的有向图进行深度优先算法以及广度优先算法

可以先看看,具体文件的格式,大家想要实现的话,需要在桌面上创建一个txt格式的文件,然后将其命名为linjiebiao

5 7
v1 v2 v3 v4 v5
0 1 0 3
1 4
2 3 2 4
3 2
4 0

文件里面的内容是这样的,第一行,写入节点个数和边数,第二行是各个节点的名称,第三行到最后一行,写下从第几个节点到底几个节点的边

例如0 3 表示的是从第“0”到第“3”。对应的就是节点v1到节点v2,那么0 1 0 3综合起来表示的就是v1这个节点有向的连接到了v2和v3。

先给出代码 ,需要注意的是这个代码,只适用于有向图,而且在txt文件当中,必须每个节点可以指向这个节点的边,才可以 遍历所有的节点。那么对应于这个文件当中,就是第二个元素必须得包含所有节点,也就是0、1、2、3、4必须得都有

#include<iostream>
#include<fstream>
#include<string>

using namespace std;

const int MAXSIZE = 10;//定义图节点的最多个数


struct ArcNode
{
	int adjvex;
	ArcNode* nextare;
};

struct VertexNode
{
	string vertex;
	ArcNode* firststare;
};



template<class T>class ALGraph
{
public:
	ALGraph(ifstream& fin);
	~ALGraph();
	void DFS(int v);
	void BFS(int v);
private:
	VertexNode adjlist[MAXSIZE];
	int vNUM, arcNUM;
	bool visited[MAXSIZE];
};

int main()
{
	ifstream fin;
	fin.open("C:/Users/WuFRi/Desktop/linjiebiao.txt");
	if (!fin)
	{
		cerr << "error opening file." << endl;
		return 1;
	}
	ALGraph<string> a(fin);
	//a.DFS(0);
	a.BFS(0);
	system("pause");
	return 0;
}

template<class T>
ALGraph<T>::ALGraph(ifstream& fin)
{
	for (int i = 0; i < MAXSIZE; i++)
	{
		visited[i] = 0;
	}
	fin >> vNUM >> arcNUM;
	if (vNUM > MAXSIZE)
	{
		cerr << "there is no enough place for the node." << endl;
	}
	for (int i = 0; i < vNUM; i++)
	{
		fin >> adjlist[i].vertex;//输入每一个adjlist的名称
		adjlist[i].firststare = NULL;
	}
	for (int k = 0; k < arcNUM; k++)
	{
		int i, j;
		fin >> i >> j;
		ArcNode* newNode = new ArcNode;
		newNode->adjvex = j;//输入每一个节点相连的节点数字标记
		newNode->nextare = NULL;
		if (adjlist[i].firststare == NULL)
		{
			adjlist[i].firststare = newNode;
		}
		else
		{
			ArcNode* last = adjlist[i].firststare;
			while (last->nextare != NULL)
			{
				last = last->nextare;
			}
			last->nextare = newNode;
		}
	}
}

template<class T>
ALGraph<T>::~ALGraph()
{
	for (int i = 0; i < vNUM; i++) {
		ArcNode* p = adjlist[i].firststare;
		while (p) {
			ArcNode* temp = p;
			p = p->nextare;
			delete temp;
		}
	}
}

template<class T>
void ALGraph<T>::DFS(int v)
{
	cout << adjlist[v].vertex;
	visited[v] = 1;
	ArcNode* p = adjlist[v].firststare;
	while (p)
	{
		int j = p -> adjvex;
		if (visited[j] == 0)
		DFS(j);
		p = p->nextare;
	}
}

template<class T>
void ALGraph<T>::BFS(int v)//广度优先算法
{
	int queue[MAXSIZE];//创建一个储存节点的队列
	int f = 0, r = 0;
	cout << adjlist[v].vertex;
	visited[v] = 1;
	queue[++r] = v;
	while (f != r)
	{
		v = queue[++f];
		ArcNode* p = adjlist[v].firststare;
		while (p)
		{
			int j = p->adjvex;
			if (visited[j] == 0)
			{
				cout << adjlist[j].vertex;
				visited[j] = 1;
				queue[++r] = j;
			}
			p = p->nextare;
		}
	}
}

标签:ArcNode,遍历,int,创建,ALGraph,有向图,nextare,fin,节点
From: https://blog.csdn.net/2302_80306048/article/details/139289137

相关文章

  • cesium实现动态创建广告牌
    import{globalColorList,globalTextColorList}from"../js/positionTools.js";/***广告牌设备图标函数类*/exportdefaultclassDeviceMarker{constructor(arg){}/***初始化广告牌*@param{*}text文字*@param{*}iconType图表类型*......
  • IDEA 创建 JavaFX 工程
    JavaFX下载安装1.检查本机JDK版本CMD命令行窗口输入java--version查询JDK版本,如下:C:\Users\Administrator>java--versionjava17.0.92023-10-17LTSJava(TM)SERuntimeEnvironment(build17.0.9+11-LTS-201)JavaHotSpot(TM)64-BitServerVM(build17.0.9+......
  • 《第二节》一、FreeRTOS学习笔记-任务创建和删除
    FreeRTOS的任务创建和删除1,任务创建和删除的API函数(熟悉)任务的创建和删除本质就是调用FreeRTOS的API函数一、任务创建动态创建任务:任务的任务控制块以及任务的栈空间所需的内存,均由FreeRTOS从FreeRTOS管理的堆中分配静态创建任务:任务的任务控制块以及任务的栈空间所需......
  • Django学习-虚拟环境创建、URL组成部分详解
    一、创建一个Django的虚拟环境 生成虚拟环境在D:\Virtualenvs下 在pycharm中引入django虚拟环境 二、URL详解 URL,统一资源定位符,一个URL由以下几部分组成:scheme://host:port/path/?query-string=xxx#anchorscheme:代表的是访问的协议,一般为http或者https以及ftp等h......
  • 4 SAP前台操作手册-MM模块-采购管理-采购申请创建、修改、显示-ME51N ME52N ME53N
    0总体说明SAP实施项目中,到了第3个阶段-系统实现,在这个阶段,因为蓝图汇报已经结束,配置也差不多完成了,自开发还在进行中,SAP标准功能下,可以进行基础业务的前台操作了,在实现阶段的尾端,客户指定的关键用户(俗称KU-KeyUser)会进行前台业务操作和练习,提高熟练程度,同时需要在外部SAP顾......
  • 2 SAP前台操作手册-MM模块-采购管理-(标准/委外/寄售)采购信息记录创建、修改、显示、
    0总体说明SAP实施项目中,到了第3个阶段-系统实现,在这个阶段,因为蓝图汇报已经结束,配置也差不多完成了,自开发还在进行中,SAP标准功能下,可以进行基础业务的前台操作了,在实现阶段的尾端,客户指定的关键用户(俗称KU-KeyUser)会进行前台业务操作和练习,提高熟练程度,同时需要在外部SAP顾......
  • 在 Cognex VisionPro CogRecordDisplay 中创建交互式矩形区域
    在CognexVisionProCogRecordDisplay中创建交互式矩形区域在图像处理和视觉检测应用中,定义和操作特定区域是至关重要的。本文将演示如何在CognexVisionPro中使用C#创建一个可交互的矩形区域,并启用拖拽和调整大小功能,从而提升图像处理的灵活性和效率。前提条件安......
  • 我见我思之hvv偷师学艺——目录遍历/路径遍历/文件遍历 漏洞
    注:本文仅作为技术交流使用,如有违反行为本文作者概不负责。常见告警信息价值提取:源IP大概率为代理IP,可通过威胁情报平台进行识别此IP的历史攻击行为。源端口参考意义不大。目的IP我方资产IP(可定位疑似存在漏洞的资产的具体范围)。目的端口我方资产IP对应端口(可通过端口辅助......
  • 使用脚手架创建Vue程序
    首先,选好vue项目的存放地址,例如我存在了我电脑中d:\code\vue,打开cmd切到这个目录 输入vuecreatevuedemo,我选择的vue3,然后等待项目创建,如下:  创建成功后,切入到demo目录中,然后执行npmrunserve,项目就运行起来了 ......
  • VS2022创建错误镜像
    VS2022下载安卓镜像创建时报错为 无法创建1这类错误,要用微软的jdk,不要用其他的 错误日志和地址C:\Users\Administrator\AppData\Local\Xamarin\Logs\17.0 StandardError:错误:加载主类com.android.sdklib.tool.AvdManagerCli时出现LinkageError java.lang.Uns......