DFS-基于邻接表
10 深度优先遍历-邻接表-有向连通图
#include <iostream>
using namespace std;
#define MaxVnum 100 //顶点最大数
bool visited[MaxVnum];//访问标志数组,其初值默认为"false"
typedef char VexType; //顶点的数据类型
typedef struct AdjNode
{
int v; //存顶点下标
struct AdjNode * next; //指向下一个邻接点
}AdjNode; //邻接点 结点 结构体
typedef struct
{
VexType data; //顶点的数据
AdjNode * First;//指向第一个邻接点
}VexNode; //顶点结构体
typedef struct
{
VexNode Vex[MaxVnum]; //顶点集
int VexNum, EdgeNum; //顶点数,边数
}ALGraph; //Adjacent List Graph:图的邻接表结构
int LocateVex(ALGraph G, VexType V)
{
for (int i = 0; i < G.VexNum; i++) //查找顶点信息的下标
{
if (V == G.Vex[i].data)
{
return i;
}
}
//没找到
return -1;
}
void InsertEdge(ALGraph & G, VexType LocV1, VexType LocV2)//因为是有向图,需要插入一条边
{
//构造一个邻接点
AdjNode * Node = new AdjNode; //C语言中:AdjNode * Node = (AdjNode *)malloc(sizeof(AdjNode));
//放入顶点下标
Node->v = LocV2;
//头插法
Node->next = G.Vex[LocV1].First;
G.Vex[LocV1].First = Node;
}
void CreateGraph(ALGraph & G)
{
int i;
VexType v1, v2;
cout << "请输入顶点数和边数:" << endl;
cin >> G.VexNum >> G.EdgeNum;
//1.顶点结构体初始化
cout << "请输入顶点的元素:" << endl;
for (i = 0; i < G.VexNum; i++)
{
cin >> G.Vex[i].data;
G.Vex[i].First = NULL;
}
cout << "请依次输入每条边的两个顶点v1,v2" << endl;
while (G.EdgeNum--)
{
cin >> v1 >> v2;
//2.找这两个顶点的下标
int Locv1 = LocateVex(G, v1);
int Locv2 = LocateVex(G, v2);
if (Locv1 != -1 && Locv2 != -1)
{
//3.找到, 进行头插
InsertEdge(G, Locv1, Locv2);
}
else
{
cout << "输入顶点信息错!请重新输入!" << endl;
G.EdgeNum++; //本次输入不算
}
}
}
void PrintGraph(ALGraph G)
{
int i;
cout << "----------邻接表如下:----------" << endl;
for (i = 0; i<G.VexNum; i++)
{
AdjNode * t = G.Vex[i].First; //保存首指针,防止首指针丢失
cout << G.Vex[i].data << "的邻接点:" ;
while (NULL != t)
{
cout << "[" << t->v << "] ";
t = t->next;
}
cout << endl;
}
}
//深度优先遍历 - 基于邻接表
void DFS_AL(ALGraph G, int Locv)
{
AdjNode * p;
int w;
cout << G.Vex[Locv].data << "\t";
visited[Locv] = true;
p = G.Vex[Locv].First;
while (NULL != p)
{
w = p->v;
if (visited[w] == false)
{
DFS_AL(G, w);
}
p = p->next;
}
}
void test01()
{
ALGraph G;
VexType v;
//创建有向图
CreateGraph(G);
//输出有向图
PrintGraph(G);
//深度优先遍历 - 基于邻接表
cout << "请输入遍历连通图的起始点:" << endl;
cin >> v;
int Locv = LocateVex(G, v);
if (Locv != -1)
{
cout << "深度优先搜索遍历连通图结果:" << endl;
DFS_AL(G, Locv);
}
else
{
cout << "输入顶点信息错!请重新输入!" << endl;
}
cout << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
11 深度优先遍历-邻接表-无向连通图
#include <iostream>
using namespace std;
#define MaxVnum 100 //顶点最大数
bool visited[MaxVnum];//访问标志数组,其初值默认为"false"
typedef char VexType; //顶点的数据类型
typedef struct AdjNode
{
int v; //存顶点下标
struct AdjNode * next; //指向下一个邻接点
}AdjNode; //邻接点 结点 结构体
typedef struct
{
VexType data; //顶点的数据
AdjNode * First;//指向第一个邻接点
}VexNode; //顶点结构体
typedef struct
{
VexNode Vex[MaxVnum]; //顶点集
int VexNum, EdgeNum; //顶点数,边数
}ALGraph; //Adjacent List:邻接表
int LocateVex(ALGraph G, VexType V)
{
for (int i = 0; i < G.VexNum; i++) //查找顶点信息的下标
{
if (V == G.Vex[i].data)
{
return i;
}
}
//没找到
return -1;
}
void InsertEdge(ALGraph & G, VexType LocV1, VexType LocV2)
{
//构造一个邻接点
AdjNode * Node1 = new AdjNode; //C语言中:AdjNode * Node = (AdjNode *)malloc(sizeof(AdjNode));
//放入顶点下标
Node1->v = LocV2;
//头插法
Node1->next = G.Vex[LocV1].First;
G.Vex[LocV1].First = Node1;
}
void CreateGraph(ALGraph & G)
{
int i;
VexType v1, v2;
cout << "请输入顶点数和边数:" << endl;
cin >> G.VexNum >> G.EdgeNum;
//1.顶点结构体初始化
cout << "请输入顶点的元素:" << endl;
for (i = 0; i < G.VexNum; i++)
{
cin >> G.Vex[i].data;
G.Vex[i].First = NULL;
}
cout << "请输入每条边的两个顶点v1,v2" << endl;
while (G.EdgeNum--)
{
cin >> v1 >> v2;
//2.找这两个顶点的下标
int Locv1 = LocateVex(G, v1);
int Locv2 = LocateVex(G, v2);
if (Locv1 != -1 && Locv2 != -1)
{
//3.找到, 进行头插, 因为是无向图,需要插入两条边
InsertEdge(G, Locv1, Locv2);
InsertEdge(G, Locv2, Locv1);
}
else
{
cout << "输入顶点信息错!请重新输入!" << endl;
G.EdgeNum++; //本次输入不算
}
}
}
void PrintGraph(ALGraph G)
{
int i;
cout << "----------邻接表如下:----------" << endl;
for (i = 0; i < G.VexNum; i++)
{
AdjNode * t = G.Vex[i].First; //保存首指针,防止首指针丢失
cout << G.Vex[i].data << "的邻接点: ";
while (NULL != t)
{
cout << "[" << t->v << "] ";
t = t->next;
}
cout << endl;
}
}
void DFS_AM(ALGraph G, int Locv)
{
AdjNode * p;
int w;
cout << G.Vex[Locv].data << "\t";
visited[Locv] = true;
p = G.Vex[Locv].First;
while (NULL != p)
{
w = p->v;
if (visited[w] == false)
{
DFS_AM(G, w);
}
p = p->next;
}
}
void test01()
{
ALGraph G;
VexType v;
//创建无向图
CreateGraph(G);
//输出无向图
PrintGraph(G);
//深度优先遍历 - 基于邻接表
cout << "请输入遍历连通图的起始点:" << endl;
cin >> v;
int Locv = LocateVex(G, v);
if (Locv != -1)
{
cout << "深度优先搜索遍历连通图结果:" << endl;
DFS_AM(G, Locv);
}
else
{
cout << "输入顶点信息错!请重新输入!" << endl;
}
cout << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
12 深度优先遍历-邻接表-有向非连通图
#include <iostream>
using namespace std;
#define MaxVnum 100 //顶点最大数
bool visited[MaxVnum];//访问标志数组,其初值默认为"false"
typedef char VexType; //顶点的数据类型
typedef struct AdjNode
{
int v; //存顶点下标
struct AdjNode * next; //指向下一个邻接点
}AdjNode; //邻接点 结点 结构体
typedef struct
{
VexType data; //顶点的数据
AdjNode * First;//指向第一个邻接点
}VexNode; //顶点结构体
typedef struct
{
VexNode Vex[MaxVnum]; //顶点集
int VexNum, EdgeNum; //顶点数,边数
}ALGraph; //Adjacent List Graph:图的邻接表结构
int LocateVex(ALGraph G, VexType V)
{
for (int i = 0; i < G.VexNum; i++) //查找顶点信息的下标
{
if (V == G.Vex[i].data)
{
return i;
}
}
//没找到
return -1;
}
void InsertEdge(ALGraph & G, VexType LocV1, VexType LocV2)
{
//构造一个邻接点
AdjNode * Node = new AdjNode; //C语言中:AdjNode * Node = (AdjNode *)malloc(sizeof(AdjNode));
//放入顶点下标
Node->v = LocV2;
//头插法
Node->next = G.Vex[LocV1].First;
G.Vex[LocV1].First = Node;
}
void CreateGraph(ALGraph & G)
{
int i;
VexType v1, v2;
cout << "请输入顶点数和边数:" << endl;
cin >> G.VexNum >> G.EdgeNum;
//1.顶点结构体初始化
cout << "请输入顶点的元素:" << endl;
for (i = 0; i < G.VexNum; i++)
{
cin >> G.Vex[i].data;
G.Vex[i].First = NULL;
}
cout << "请依次输入每条边的两个顶点v1,v2" << endl;
while (G.EdgeNum--)
{
cin >> v1 >> v2;
//2.找这两个顶点的下标
int Locv1 = LocateVex(G, v1);
int Locv2 = LocateVex(G, v2);
if (Locv1 != -1 && Locv2 != -1)
{
//3.找到, 进行头插
InsertEdge(G, Locv1, Locv2);
}
else
{
cout << "输入顶点信息错!请重新输入!" << endl;
G.EdgeNum++; //本次输入不算
}
}
}
void PrintGraph(ALGraph G)
{
int i;
cout << "----------邻接表如下:----------" << endl;
for (i = 0; i<G.VexNum; i++)
{
AdjNode * t = G.Vex[i].First; //保存首指针,防止首指针丢失
cout << G.Vex[i].data << "的邻接点:" ;
while (NULL != t)
{
cout << "[" << t->v << "] ";
t = t->next;
}
cout << endl;
}
}
//深度优先遍历 - 基于邻接表
void DFS_AL(ALGraph G, int Locv)
{
AdjNode * p;
int w;
cout << G.Vex[Locv].data << "\t";
visited[Locv] = true;
p = G.Vex[Locv].First;
while (NULL != p)
{
w = p->v; //w为v的邻接点
if (visited[w] == false) //w未被访问
{
DFS_AL(G, w);
}
p = p->next;
}
}
//函数重载
void DFS_AL(ALGraph G)//非连通图,基于邻接表的深度优先遍历
{
for (int i = 0; i < G.VexNum; i++)
{
if (visited[i] == false)
{
DFS_AL(G, i);//i未被访问,以i为起点再次深度优先遍历
}
}
}
void test01()
{
ALGraph G;
VexType v;
//创建有向图
CreateGraph(G);
//输出有向图
PrintGraph(G);
//深度优先遍历 - 基于邻接表
cout << "请输入遍历连通图的起始点:" << endl;
cin >> v;
int Locv = LocateVex(G, v);
if (Locv != -1)
{
cout << "深度优先搜索遍历连通图结果:" << endl;
DFS_AL(G, Locv);
}
else
{
cout << "输入顶点信息错!请重新输入!" << endl;
}
//非连通图需要查漏点,检查未被访问的顶点
DFS_AL(G);
cout << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
无论你从事什么行业,只要做好两件事就够了:一个是你的专业、一个是你的人品。专业决定了你的存在,人品决定了你的人脉;剩下的就是坚持 !
分类:
Algorithm code
标签:
Algorithm code
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端