`

【算法导论】图的创建,深度优先访问,广度优先访问(递归/非递归)

 
阅读更多

这里仅仅贴出来我调试好的代码……更详细的解释在代码注释中。

#include "stdio.h"
#include "malloc.h"
#define MaxSize 10
#define MaxValue 99999
/*邻接表 :Adjacency list*/
typedef struct ArcNode //边 表节点
{
int adjvex;//邻接点 数值
ArcNode *next;//下一个节点
}ArcNode ;
typedef struct VertexNode //顶点 表节点
{
char vertex; //顶点表示(A,B,C)
ArcNode *firstedge;//第一个邻接点
}VertexNode,AdjList[MaxSize]; //为什么要写在这个地方 ????

//vertexNode AdjList[MaxSize]; //这样为什么不对??

typedef struct
{

AdjList adjlist ;//顶点表 就是竖着的一排 不能是指针么???????????? !!!!!!!!!!!
int VertexNumber,arcNum;//图的顶点个数,边个数
}AlGraph;

void CreatALGraph(AlGraph *G,char a[],int n,int e) //顶点 由数组提供, 边需要用户输入
{
int i,k,j;
G->VertexNumber=n;// 顶点个数
G->arcNum=e;//边个数
for(i=0;i<G->VertexNumber;i++)//初始化 顶点列表
{
G->adjlist[i].vertex=a[i];
G->adjlist[i].firstedge=NULL;
}

for(k=0;k<G->arcNum;++k)//每次输入 一条边 <i,j> 将该顶点插入 i 顶点后的列链表中
{
printf("please input the number of edge's two vertex\n");
scanf("%d%d",&i,&j);//有向图 f
ArcNode *s=(ArcNode *)malloc(sizeof(ArcNode));

s->adjvex=j; //所邻接的 顶点在顶点列表中的下标

//接下来 将创建好的边 表节点插入 节点i 的边表的表头
s->next=G->adjlist[i].firstedge;
G->adjlist[i].firstedge=s;
}
}
void print_Graph(AlGraph *G) //简单的打印出来
{
int i;
for(i=0;i<G->VertexNumber;++i) //输出每一行
{
ArcNode *node= G->adjlist[i].firstedge;
printf("%c",G->adjlist[i].vertex);//输出链表节点

while(node)//输出后续节点
{
//printf("--->%d", node->adjvex);
printf("--->%c", G->adjlist[1].vertex);
node=node->next;
}
printf("\n");
}
}
void DFSTraverse(AlGraph *G,int v)//深度优先遍历
{
int visited[v];//用来区别 顶点有没有被访问过
int j;
printf("%c",G->adjlist[v].vertex);//输出顶点 (递归调用 条件下文给出)
visited[v]=1;
ArcNode *p=G->adjlist[v].firstedge;

while(p!=NULL)
{
j=p->adjvex;//后继 的节点的下标
if(visited[j]!=1)//后继顶点没有被访问,则递归访问
DFSTraverse(G,j);

p=p->next;
}
}
void BFSTraverse(AlGraph *G,int v)//深度优先遍历 (递归)
{
int visited[v];//用来区别 顶点有没有被访问过
int front,rear,j;
int Q[MaxSize];
front =rear=-1;//初始化队列
printf("%c",G->adjlist[v].vertex);

visited[v]=1;
Q[++rear]=v;

while(front!=rear)
{
v=Q[++front];
ArcNode *p=G->adjlist[v].firstedge;

while(p!=NULL)
{
j=p->adjvex;//后继 的节点的下标
if(visited[j]!=1)//后继顶点没有被访问,则递归访问
{
printf("%c",G->adjlist[j].vertex);
visited[j]=1;
Q[++rear]=j;
}
p=p->next;
}
}
}

void BFS(AlGraph *G,int s) //非递归 广度优先
{
int i,u;
char color[G->VertexNumber];//表示颜色
int d[G->VertexNumber];//表示路径值
int pi[G->VertexNumber];//表示祖先
for(i=1;i<G->VertexNumber;++i)//初始化
{
color[i]='W';//初始化为白色
d[i]=MaxValue;
//pi[i]=NULL;
}

color[s]='G';//设置成灰色
d[s]=0;
//pi[s]=NULL;

int Q[MaxSize];//初始化队列
int front =-1;
int rear=-1;//初始化队列
Q[++rear]=s;//插入队列

while(front!=rear)
{

u=Q[++front];//弹出队列头
ArcNode *p=G->adjlist[u].firstedge;//这里是u
while(p!=NULL)//访问所有跟 u 相邻的节点
{
if(color[p->adjvex]=='W')//是白色 ,没有被访问过
{
color[p->adjvex]='G';
d[p->adjvex]=d[u]+1;
pi[p->adjvex]=u;

Q[++rear]=p->adjvex;//插入队列

}
p=p->next;
}

printf("%3c",G->adjlist[u].vertex);
color[u]='B';
}


}

void DFS_VISIT(AlGraph *G, int u,char color[],int d[],int f[],int time,int pi[])//被深度优先访问调用
{
color[u]='G';
++time;
d[u]=time;//第一个时间戳

ArcNode *p=G->adjlist[u].firstedge;//这里是u
while(p!=NULL)//访问所有跟 u 相邻的节点
{
if(color[p->adjvex]='W')
{
pi[p->adjvex]=u;
DFS_VISIT(G,p->adjvex,color,d,f,time,pi);
}
p=p->next;

}
color[u]='B';
printf("%3c",G->adjlist[u].vertex);
f[u]=time+1;

}
int time=0;//时间戳应该是全局变量

void DFS(AlGraph *G)//深度优先遍历
{
char color[G->VertexNumber];
int pi[G->VertexNumber];
int d[G->VertexNumber];//时间戳一
int f[G->VertexNumber];//时间戳二

int i;
for(i=0;i<G->VertexNumber;++i)//初始化
{
color[i]='W';//初始化为白色
time=0;
//pi[i]=NULL;
}
for(i=0;i<G->VertexNumber;++i)//从上到下访问
{
if(color[i]='W')
{
DFS_VISIT(G,i,color,d,f,time,pi);//深度优先访问
}
}
}


int main()
{
AlGraph *G=(AlGraph *)malloc(sizeof(AlGraph));
char a[3]={'A','B','C'};
int n=3;
int e=2;
printf("********************\n");
printf("1,创建邻接表类型的图\n");
printf("2,邻接表真实输出\n");
printf("3,邻接表深度优先访问\n");
printf("4,邻接表广度优先访问\n");
printf("5,邻接表非递归广度优先访问(算法导论)\n");
printf("6,邻接表深度优先访问(算法导论)\n");/////这个调用,有错误。需要设全局变量。没改
printf("********************\n");

int i;

while(1)
{
scanf("%d",&i);
switch(i)
{
case 1:CreatALGraph(G,a,n,e);
printf("创建完毕请继续……\n");break;
case 2:print_Graph(G);
printf("操作完毕请继续……\n");break;
case 3:DFSTraverse(G,0);
printf("操作完毕请继续……\n");break;
case 4:BFSTraverse(G,0);
printf("操作完毕请继续……\n");break;
case 5:printf("广度优先遍历:\n");
BFS(G,0);
printf("操作完毕请继续……\n");break;
case 6:DFS(G);
printf("操作完毕请继续……\n");break;
case 7:break;
case 8:break;
case 9:break;

}

}

return 0;
}

分享到:
评论

相关推荐

    数据库管理工具:dbeaver-ce-23.1.5-macos-aarch64.dmg

    1.DBeaver是一款通用数据库工具,专为开发人员和数据库管理员设计。 2.DBeaver支持多种数据库系统,包括但不限于MySQL、PostgreSQL、Oracle、DB2、MSSQL、Sybase、Mimer、HSQLDB、Derby、SQLite等,几乎涵盖了市场上所有的主流数据库。 3.支持的操作系统:包括Windows(2000/XP/2003/Vista/7/10/11)、Linux、Mac OS、Solaris、AIX、HPUX等。 4.主要特性: 数据库管理:支持数据库元数据浏览、元数据编辑(包括表、列、键、索引等)、SQL语句和脚本的执行、数据导入导出等。 用户界面:提供图形界面来查看数据库结构、执行SQL查询和脚本、浏览和导出数据,以及处理BLOB/CLOB数据等。用户界面设计简洁明了,易于使用。 高级功能:除了基本的数据库管理功能外,DBeaver还提供了一些高级功能,如数据库版本控制(可与Git、SVN等版本控制系统集成)、数据分析和可视化工具(如图表、统计信息和数据报告)、SQL代码自动补全等。

    一份关于信号与系统的大纲教程!!!!!!!!!!!!!

    一份关于信号与系统的大纲教程!!!!!!!!!!!!!

    【课件】7.5.1散列表的基本概念.pdf

    【课件】7.5.1散列表的基本概念

    【课件】8.7.4置换-选择排序.pdf

    【课件】8.7.4置换-选择排序

    Delphi 12 控件之unidac-10.2.1-d29pro.exe

    unidac_10.2.1_d29pro.exe

    基于STM32的微控制器的C++语言研究项目

    此代码是基于 C、C++ 语言的 stm32 为微控制器编写的。 代码包含单独的部分:main、ini、USART code_for_display。 ADC_ini(模数转换器)是关于初始化ADC的。每当您触发模拟输入以开始转换时,它都会对模拟输入进行采样。它执行一个称为量化的过程,以决定电压电平及其在输出寄存器中推送的二进制代码。 USART(通用异步接收器-发射器)是一种外围通信硬件设备,它允许计算机通过 wifi 或蓝牙与串行连接的设备进行同步和异步通信。 code_for_display部分是包含 7 段显示的代码。 main 初始化ADC_ini,USART,code_for_display并开始接收信息的循环,显示它,将其发送到另一个设备,重复

    数据库表结构同步工具.zip

    大学生数据结构学习笔记和资料大全!

    数据库管理工具:dbeaver-ce-23.2.1-x86-64-setup.exe

    1.DBeaver是一款通用数据库工具,专为开发人员和数据库管理员设计。 2.DBeaver支持多种数据库系统,包括但不限于MySQL、PostgreSQL、Oracle、DB2、MSSQL、Sybase、Mimer、HSQLDB、Derby、SQLite等,几乎涵盖了市场上所有的主流数据库。 3.支持的操作系统:包括Windows(2000/XP/2003/Vista/7/10/11)、Linux、Mac OS、Solaris、AIX、HPUX等。 4.主要特性: 数据库管理:支持数据库元数据浏览、元数据编辑(包括表、列、键、索引等)、SQL语句和脚本的执行、数据导入导出等。 用户界面:提供图形界面来查看数据库结构、执行SQL查询和脚本、浏览和导出数据,以及处理BLOB/CLOB数据等。用户界面设计简洁明了,易于使用。 高级功能:除了基本的数据库管理功能外,DBeaver还提供了一些高级功能,如数据库版本控制(可与Git、SVN等版本控制系统集成)、数据分析和可视化工具(如图表、统计信息和数据报告)、SQL代码自动补全等。

    Android-Retrofit-Images在这个示例 Android 项目中

    Android-Retrofit-Images在这个示例 Android 项目中

    数据库管理工具:dbeaver-ce-23.0.2-macos-aarch64.dmg

    1.DBeaver是一款通用数据库工具,专为开发人员和数据库管理员设计。 2.DBeaver支持多种数据库系统,包括但不限于MySQL、PostgreSQL、Oracle、DB2、MSSQL、Sybase、Mimer、HSQLDB、Derby、SQLite等,几乎涵盖了市场上所有的主流数据库。 3.支持的操作系统:包括Windows(2000/XP/2003/Vista/7/10/11)、Linux、Mac OS、Solaris、AIX、HPUX等。 4.主要特性: 数据库管理:支持数据库元数据浏览、元数据编辑(包括表、列、键、索引等)、SQL语句和脚本的执行、数据导入导出等。 用户界面:提供图形界面来查看数据库结构、执行SQL查询和脚本、浏览和导出数据,以及处理BLOB/CLOB数据等。用户界面设计简洁明了,易于使用。 高级功能:除了基本的数据库管理功能外,DBeaver还提供了一些高级功能,如数据库版本控制(可与Git、SVN等版本控制系统集成)、数据分析和可视化工具(如图表、统计信息和数据报告)、SQL代码自动补全等。

    基于MSP430F5529的两路寻迹小车.zip

    基于MSP430F5529的两路寻迹小车.zip

    cpp实现数据库和数据结构大作业:图书管理系统.zip

    大学生 C/C++/JAVA/Python数据结构学习笔记和资料大全

    Windows下开箱后即时编译体验freeRTOS 的MDK demo工程,使用事件Event实现freeRTOS多线程通信

    Windows下的MDK Keil uVision4的demo工程,STM32F103的IC,开箱即可编译烧写体验: 已包含完整的freeRTOS依赖,可直观体验freeRTOS事件Event实现的多线程通信,代码方面主要通过未使用事件Event来实现多个线程间通信。 工程方面已经集成了freeRTOS的源码及相关事件Event的使用示例,配合博文《FreeRTOS 体验教程:7.如何用事件Event实现FreeRTOS多线程通信?》食用效果更佳。

    一个简单的实验设计示例以及其预期结果

    头歌c语言实验答案 实验结果: 当输入示例字符串后,程序将输出预期结果: Character count: 49 Word count: 9 Line count: 3 这样的实验设计可以帮助学生加深对C语言字符串处理的理解,包括指针操作、字符分类函数的使用以及基本的逻辑控制。

    C#学生管理系统.zip 学生选课及成绩查询系统是一个学校不可缺少的部分.zip

    C#学生管理系统.zip 学生选课及成绩查询系统是一个学校不可缺少的部分

    Eclipse archetype-catalog.xml.zip

    Eclipse archetype-catalog.xml

    数据库管理工具:dbeaver-ce-23.0.1-linux.gtk.x86-64.tar.gz

    1.DBeaver是一款通用数据库工具,专为开发人员和数据库管理员设计。 2.DBeaver支持多种数据库系统,包括但不限于MySQL、PostgreSQL、Oracle、DB2、MSSQL、Sybase、Mimer、HSQLDB、Derby、SQLite等,几乎涵盖了市场上所有的主流数据库。 3.支持的操作系统:包括Windows(2000/XP/2003/Vista/7/10/11)、Linux、Mac OS、Solaris、AIX、HPUX等。 4.主要特性: 数据库管理:支持数据库元数据浏览、元数据编辑(包括表、列、键、索引等)、SQL语句和脚本的执行、数据导入导出等。 用户界面:提供图形界面来查看数据库结构、执行SQL查询和脚本、浏览和导出数据,以及处理BLOB/CLOB数据等。用户界面设计简洁明了,易于使用。 高级功能:除了基本的数据库管理功能外,DBeaver还提供了一些高级功能,如数据库版本控制(可与Git、SVN等版本控制系统集成)、数据分析和可视化工具(如图表、统计信息和数据报告)、SQL代码自动补全等。

    基于MapReduce的招聘数据清洗项目(免费提供源码)

    基于MapReduce的招聘数据清洗项目是一种高效处理和整理大量招聘数据的方法。MapReduce是一种分布式计算模型,由谷歌提出,广泛应用于大规模数据处理。该项目旨在通过MapReduce框架,将原始招聘数据进行清洗、规范化和去重,以生成干净、结构化的数据,便于后续分析和使用。 项目首先通过Mapper函数对原始数据进行初步处理,提取出关键字段如职位名称、公司名称、薪资范围等,并进行初步清洗,如去除空格、特殊字符等。接着,Reducer函数对Mapper输出的数据进行进一步处理,合并重复项,并按照预定规则规范化数据格式。 该项目免费提供源码,便于用户下载、使用和修改。用户可以根据自己的需求,调整MapReduce任务的参数和逻辑,以适应不同的数据清洗要求。通过分布式处理,项目能够高效处理海量招聘数据,提高数据清洗的速度和准确性。 使用基于MapReduce的招聘数据清洗项目,不仅可以大幅度提高数据处理效率,还能保证数据的一致性和准确性,为企业的招聘分析和决策提供可靠的数据支持。项目的源码开放,使得更多用户能够受益于这一高效的数据处理工具。

    unity角色几何优秀的路径动画源码

    unity角色几何优秀的路径动画源码,源码演示视频:https://www.bilibili.com/video/BV1Br421c7Nw/;unity角色几何优秀的路径动画源码,源码演示视频:https://www.bilibili.com/video/BV1Br421c7Nw/;unity角色几何优秀的路径动画源码,源码演示视频:https://www.bilibili.com/video/BV1Br421c7Nw/;unity角色几何优秀的路径动画源码,源码演示视频:https://www.bilibili.com/video/BV1Br421c7Nw/;unity角色几何优秀的路径动画源码,源码演示视频:https://www.bilibili.com/video/BV1Br421c7Nw/;unity角色几何优秀的路径动画源码,源码演示视频:https://www.bilibili.com/video/BV1Br421c7Nw/;unity角色几何优秀的路径动画源码,源码演示视频:https://www.bilibili.com/video/BV1Br421c7Nw/;

    高分项目,基于Unity3D开发实现的HeliHell Pack 直升机控制,内含完整源码+资源+unitypackage

    高分项目,基于Unity3D开发实现的HeliHell Pack 直升机控制,内含完整源码+资源+unitypackage 很多小伙伴都想找能够开直升机的游戏,今天安利几款直升机模拟游戏。在这些游戏里大家会模拟一名直升机驾驶员,驾驶直升机做各种任务。大家可以通过调节方向盘来控制直升机的起降和转...

Global site tag (gtag.js) - Google Analytics