采用邻接表存储的图的深度优先遍历c语言,以邻接表作为存储结构的图的深度优先遍历和广度优先遍历(c++版)...

一、图的存储

用邻接表法存储图,存储结构分为两部分,一部分为存储图的所有顶点的数组,另一部分为挂载在数组的每个元素后面的用来表示顶点的邻接点的链表。

1、存储顶点的结构单元为:

classvnode

{public:stringnodename;boolvisted;//进行图的遍历时用于标记图是否被访问过

node*next;

vnode()

{

visted= false;

next=NULL;

}

};

链表的结构单元为:

classnode

{public:stringnodename;intnodeindex;//节点的索引,用于快速定位节点在顶点数组中的位置intweight;//权值,用于存储顶点之间的信息

node*next;

node() { next=NULL; }

};

2、现在声明Graph这个类,类的声明为(有关图的遍历的成员函数也以包含进来):

classGraph

{public:

Graph();~Graph();bool DeepFirstSearch(intnodeindex);voidClearVisited();bool WideFirstSearch(int nodeindex);protected:

vnode*pvnode;intvnumber;

};

3、下面是Graph类的成员函数的定义为(先实现关于图的存储的成员函数):

Graph::Graph()

{

cout<< "请输入节点的个数:";

cin>>vnumber;

pvnode= newvnode[vnumber]; //通过new创建顶点数组for (int i = 0; i < vnumber; i++) //通过for循环将图的信息输入

{

cout<

cout<< "请输入节点:";

cin>>pvnode[i].nodename;stringcheck; //输入某个顶点的邻接点时,以"#"作为输入的结束标志while (1)

{

cout<< "请输入节点的相邻节点:";

cin>>check;if (check == "#") { break; }//如果输入的"#"就跳出输入循环

node*temp = newnode; //如果不是,就分配节点内存,完善相关信息

temp->nodename =check;

cout<< "请输入相邻节点的序号和权值:";

cin>> temp->nodeindex >> temp->weight;

temp->next =pvnode[i].next; //并将新输入的节点放到相应的链表中

pvnode[i].next=temp;

}

}

}

Graph::~Graph() //释放内存时,先释放链表占用的内存,然后释放数组占用的内存

{

node*currentnode =NULL; //释放链表占用的内存

node*temp =NULL;for (int i = 0; i < vnumber; i++)

{

currentnode=pvnode[i].next;while (currentnode !=NULL)

{

temp= currentnode->next; //保存当前节点的下一个节点的内存deletecurrentnode; //释放当前节点的内存

currentnode=temp; //下一个节点作为当前的节点

}

}delete[]pvnode; //释放数组占用的内存

}

二、图的遍历

1、深度优先遍历

深度优先遍历通过递归的算法实现

下面是实现图的深度优先遍历的成员函数的实现:

bool Graph::DeepFirstSearch(intnodeindex)

{if (nodeindex < 0 || nodeindex >=vnumber) //判断指定的起始节点是否合法

{

cout<< "The nodeindex does not exist..";return false;

}if (pvnode[nodeindex].visted == false) //判断当前节点是否被访问过,如果没有,则继续

{

cout<< pvnode[nodeindex].nodename << " "; //输出节点的名字

pvnode[nodeindex].visted= true; //修改访问记录

node*currentnode=pvnode[nodeindex].next; //找到当前节点相邻的一个节点while (currentnode !=NULL)

{

DeepFirstSearch(currentnode->nodeindex); //通过递归继续上述操作

currentnode= currentnode->next; //换当前节点的另一个相邻节点试试

}

}return true;

}

2、广度优先遍历

广度优先遍历需要借助队列这种数据结构。

代码实现:

bool Graph::WideFirstSearch(intnodeindex)

{if (nodeindex < 0 || nodeindex >=vnumber) //判断输入的节点索引是否合法

{

cout<< "The nodeindex does not exist..";return false;

}

Queuequeue(vnumber);

cout<< "广度优先搜索的遍历结果为:";

cout<< pvnode[nodeindex].nodename << " "; //将起始节点的名字打印出来

pvnode[nodeindex].visted= true; //更改起始节点的访问记录

queue.EnQueue(nodeindex); //起始节点入队列int temp=0;

node*currentnode =NULL;while (queue.QueueEmpty() == false) //对于每一个入队的节点,

{

queue.DeQueue(temp);

currentnode=pvnode[temp].next; //按入队顺序访问其相邻的全部节点while (currentnode!=NULL)

{if (pvnode[currentnode->nodeindex].visted == false)

{

cout<< currentnode->nodename << " ";

pvnode[currentnode->nodeindex].visted = true; //已经访问过的节点更改访问记录并入队

queue.EnQueue(currentnode->nodeindex);

}

currentnode= currentnode->next;

}

}

cout<

}

3、由于这两种算法都需要对节点的访问记录进行修改,所以每次用这两种的某一种算法实现遍历后需要初始化访问记录才能继续使用。

初始化访问记录的函数代码实现为:

voidGraph::ClearVisited()

{for (int i = 0; i < vnumber; i++)

{

pvnode[i].visted= false;

}

}

注:完整的代码在下面赋上,另附上实现队列的完整代码

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值