C语言数据结构之图的遍历实例详解
发布时间 - 2026-01-11 02:11:32 点击率:次C语言数据结构之图的遍历实例详解

输入一组顶点,建立无向图的邻接矩阵。输入一组顶点,建立有向图的邻接表。分别对无向图和有向图进行DFS(深度优先遍历)和BFS(广度优先遍历)。写出深度优先遍历的递归和非递归算法。根据建立的有向图,判断该图是否是有向无环图,若是,则输出其一种拓扑有序序列。
实现代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX 20
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct{
char data;
ArcNode *firstarc;
}AdjList[MAX];
typedef struct{
AdjList vertices;
int vexnum;
int arcnum;
}ALGraph;
typedef struct{
int *base;
int front,rear;
}CqQueue;
void InitQueue(CqQueue &Q)
{//初始化一个队列
Q.base=(int*)malloc(MAX*sizeof(int));
Q.front=Q.rear=0;
}
int QueueEmpty(CqQueue Q)
{//判断队列是否为空
if(Q.rear==Q.front)
return 1;
return 0;
}
void EnQueue(CqQueue &Q,int e)
{//入队操作
if((Q.rear+1)%MAX==Q.front)
return;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAX;
}
void DeQueue(CqQueue &Q,int &e)
{//出队操作
if(Q.rear==Q.front)
return;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAX;
}
int LocateVex(ALGraph G,char v)
{//查找顶点v在图G中的位置
for(int i=0;i<G.vexnum;i++)
if(G.vertices[i].data==v)
return i;
return -1;
for(int i=0;i<G.vexnum;i++)
if(G.vexs[i]==v)
return i;
return -1;
}
void CreateAdjList(ALGraph &G)
{//建立无向图的邻接表
int v,i,j,k;
char v1,v2;
ArcNode *p,*s;
printf("输入无向图的顶点数和边数:\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
getchar();
printf("输入图的顶点信息:\n");
for(v=0;v<G.vexnum;v++){
scanf("%c",&G.vertices[v].data);getchar();
G.vertices[v].firstarc=NULL;
}
printf("输入无向图的边:\n");
for(k=0;k<G.vexnum;k++){
scanf("%c%c",&v1,&v2);
getchar();
i=LocateVex(G,v1);
j=LocateVex(G,v2);
s=(ArcNode*)malloc(sizeof(ArcNode));
s->adjvex=j;
s->nextarc=NULL;
if(!G.vertices[i].firstarc)
G.vertices[i].firstarc=s;
else{
p=G.vertices[i].firstarc;
while(p->nextarc)
p=p->nextarc;
p->nextarc=s;
}
s=(ArcNode*)malloc(sizeof(ArcNode));
s->adjvex=i;
s->nextarc=NULL;
if(!G.vertices[j].firstarc)
G.vertices[j].firstarc=s;
else{
p=G.vertices[j].firstarc;
while(p->nextarc)
p=p->nextarc;
p->nextarc=s;
}
}
}
int visited[MAX];
void DFS(ALGraph G,int v)
{//从顶点v开始对图G进行深度优先搜索
ArcNode *p;
printf("%3c",G.vertices[v].data);
visited[v]=1;
for(p=G.vertices[v].firstarc;p;p=p->nextarc)
if(!visited[p->adjvex])
DFS(G,p->adjvex);
}
void DFSTraverse(ALGraph G)
{//对用邻接表存储的无向图G进行深度优先遍历
int v;
for(v=0;v<G.vexnum;v++)
visited[v]=0;
for(v=0;v<G.vexnum;v++)
if(!visited[v])
DFS(G,v);
}
void BFSTraverse(ALGraph G)
{//对用邻接表存储的无向图G进行深度优先遍历
int u,v;
CqQueue Q;
ArcNode *p;
for(v=0;v<G.vexnum;v++)
visited[v]=0;
InitQueue(Q);
for(v=0;v<G.vexnum;v++)
if(!visited[v]){
printf("%3c",G.vertices[v].data);
visited[v]=1;
EnQueue(Q,v);
while(!QueueEmpty(Q)){
DeQueue(Q,u);
for(p=G.vertices[u].firstarc;p;p=p->nextarc)
if(!visited[p->adjvex]){
printf("%3c",G.vertices[p->adjvex].data);
visited[p->adjvex]=1;
EnQueue(Q,p->adjvex);
}
}
}
}
int main(){
ALGraph G;
printf("建立无向图的邻接表:\n");
CreateAdjList(G);
printf("无向图的深度优先遍历序列如下:\n");
DFSTraverse(G);
printf("\n\n无向图的广度优先遍历序列如下:\n");
BFSTraverse(G);
printf("\n");
return 0;
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# C语言数据结构之图的遍历
# C语言树的遍历
# C语言数据结构与算法之图的遍历(二)
# C语言数据结构与算法之图的遍历(一)
# C语言实现图的遍历之深度优先搜索实例
# C语言算法积累图的遍历邻接表简单路径
# 遍历
# 递归
# 是有
# 数据结构
# 希望能
# 谢谢大家
# 为空
# struct
# typedef
# stdlib
# define
# MAX
# char
# data
# firstarc
# nextarc
# ArcNode
# int
# adjvex
# 无环图
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速完成中国万网建站详细流程?
中山网站制作网页,中山新生登记系统登记流程?
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
北京网站制作的公司有哪些,北京白云观官方网站?
Laravel如何配置Horizon来管理队列?(安装和使用)
如何用5美元大硬盘VPS安全高效搭建个人网站?
Laravel如何自定义分页视图?(Pagination示例)
详解Android图表 MPAndroidChart折线图
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
想要更高端的建设网站,这些原则一定要坚持!
手机网站制作与建设方案,手机网站如何建设?
利用JavaScript实现拖拽改变元素大小
Python正则表达式进阶教程_复杂匹配与分组替换解析
如何用西部建站助手快速创建专业网站?
千库网官网入口推荐 千库网设计创意平台入口
Laravel如何创建自定义中间件?(Middleware代码示例)
如何在VPS电脑上快速搭建网站?
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
Laravel如何实现多对多模型关联?(Eloquent教程)
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
如何在腾讯云服务器快速搭建个人网站?
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
Laravel如何实现文件上传和存储?(本地与S3配置)
Python高阶函数应用_函数作为参数说明【指导】
三星、SK海力士获美批准:可向中国出口芯片制造设备
在线制作视频网站免费,都有哪些好的动漫网站?
lovemo网页版地址 lovemo官网手机登录
如何在云虚拟主机上快速搭建个人网站?
潮流网站制作头像软件下载,适合母子的网名有哪些?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
如何在阿里云域名上完成建站全流程?
如何注册花生壳免费域名并搭建个人网站?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
jquery插件bootstrapValidator表单验证详解
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
如何快速搭建高效简练网站?
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程

