邻接图的深度广度优先遍历
时间:2022-04-22
本文章向大家介绍邻接图的深度广度优先遍历,主要内容包括数据结构、深度优先遍历、广度优先遍历、示例图、示例代码、运行结果、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
邻接图的优点就是,现用现申请,空间存储很灵活,并且需要的空间也很小。我们在做复杂网络时,通常也是用这种方法。缺点是不适合并行化,因为cuda只支持连续地址空间的拷贝。
数据结构
主要包括,边节点和顶点节点
typedef struct edgeNode{
int num;
int weight;
struct edgeNode * next;
}edgeNode;
typedef struct vertexNode{
char data;
edgeNode * firstNode;
}vertexNode,List[NUM];
typedef struct Graph{
List list;
int numver,numedges;
}Graph;
深度优先遍历
与矩阵图类似
void DFS(Graph *g,int i){
edgeNode *p = (edgeNode *)malloc(sizeof(edgeNode));
visited[i] = 1;
printf("%c ",g->list[i].data);
p = g->list[i].firstNode;
while(p){
if(!visited[p->num])
DFS(g,p->num);
p = p->next;
}
}
void DFSTraverse(Graph *g){
int i;
for(i=0;i<g->numver;i++)
visited[i] = 0;
for(i=0;i<g->numver;i++)
if(!visited[i])
DFS(g,i);
}
广度优先遍历
void BFSTraverse(Graph *g){
int i;
edgeNode *p;
Queue *q = (Queue *)malloc(sizeof(Queue));
for(i=0;i<g->numver;i++)
visited[i] = 0;
initQueue(q,0);
for(i=0;i<g->numver;i++){
if(!visited[i]){
visited[i] = 1;
printf("%c ",g->list[i].data);
inQueue(q,i);
while(getLength(q)){
int *tar = (int *)malloc(sizeof(int));
outQueue(q,tar);
p = g->list[*tar].firstNode;
while(p){
if(!visited[p->num]){
visited[p->num] = 1;
printf("%c ",g->list[p->num].data);
inQueue(q,p->num);
}
p = p->next;
}
}
}
}
}
示例图
示例代码
1 #include <stdio.h>
2 #include <stdlib.h>
3 #define NUM 5
4 #define MAXSIZE NUM
5
6 typedef struct edgeNode{
7 int num;
8 int weight;
9 struct edgeNode * next;
10 }edgeNode;
11
12 typedef struct vertexNode{
13 char data;
14 edgeNode * firstNode;
15 }vertexNode,List[NUM];
16
17 typedef struct Graph{
18 List list;
19 int numver,numedges;
20 }Graph;
21
22 typedef struct Queue{
23 int data[NUM];
24 int front;
25 int rear;
26 }Queue;
27
28 void initQueue(Queue *q,int n);
29 void showQueue(Queue *q);
30 int getLength(Queue *q);
31 int inQueue(Queue *q,int num);
32 int outQueue(Queue *q,int *tar);
33
34 void createGraph(Graph *g);
35 void showGraph(Graph *g);
36 void add(Graph *g,int a,int b,int c);
37 void DFS(Graph *g,int i);
38 void DFSTraverse(Graph *g);
39 void BFSTraverse(Graph *g);
40
41 int visited[NUM];
42
43 int main()
44 {
45 Graph * g = (Graph *)malloc(sizeof(Graph));
46 createGraph(g);
47 showGraph(g);
48 printf("n");
49 DFSTraverse(g);
50 printf("n");
51 BFSTraverse(g);
52 return 0;
53 }
54 void add(Graph *g,int a,int b,int c){
55 edgeNode *e;
56
57 e = (edgeNode *)malloc(sizeof(edgeNode));
58 e->next = g->list[a].firstNode;
59 g->list[a].firstNode = e;
60 e->num = b;
61 e->weight = c;
62
63 e = (edgeNode *)malloc(sizeof(edgeNode));
64 e->next = g->list[b].firstNode;
65 g->list[b].firstNode = e;
66 e->num = a;
67 e->weight = c;
68
69 g->numedges++;
70
71
72 }
73
74 void createGraph(Graph *g){
75 int i;
76 for(i=0;i<NUM;i++){
77 g->list[i].data = 65+i;
78 g->list[i].firstNode = NULL;
79 }
80 g->numver = NUM;
81 g->numedges = 0;
82 //添加顶点0的边
83 add(g,0,1,0);
84 add(g,0,2,0);
85 add(g,0,3,0);
86 add(g,0,4,0);
87
88 add(g,1,3,0);
89 add(g,1,4,0);
90
91 add(g,2,4,0);
92
93 add(g,3,4,0);
94 }
95 void showGraph(Graph *g){
96 int i;
97 for(i=0;i<g->numver;i++){
98 printf("g[%d] ",i);
99 edgeNode *p = (edgeNode *)malloc(sizeof(edgeNode));
100 p = g->list[i].firstNode;
101 while(p){
102 printf("->%d(%d)",p->num,p->weight);
103 p = p->next;
104 }
105 printf("->nulln");
106 }
107 }
108
109 void DFS(Graph *g,int i){
110 edgeNode *p = (edgeNode *)malloc(sizeof(edgeNode));
111 visited[i] = 1;
112 printf("%c ",g->list[i].data);
113 p = g->list[i].firstNode;
114 while(p){
115 if(!visited[p->num])
116 DFS(g,p->num);
117 p = p->next;
118 }
119 }
120 void DFSTraverse(Graph *g){
121 int i;
122 for(i=0;i<g->numver;i++)
123 visited[i] = 0;
124 for(i=0;i<g->numver;i++)
125 if(!visited[i])
126 DFS(g,i);
127 }
128 void BFSTraverse(Graph *g){
129 int i;
130 edgeNode *p;
131 Queue *q = (Queue *)malloc(sizeof(Queue));
132
133 for(i=0;i<g->numver;i++)
134 visited[i] = 0;
135 initQueue(q,0);
136 for(i=0;i<g->numver;i++){
137 if(!visited[i]){
138 visited[i] = 1;
139 printf("%c ",g->list[i].data);
140 inQueue(q,i);
141 while(getLength(q)){
142 int *tar = (int *)malloc(sizeof(int));
143 outQueue(q,tar);
144 p = g->list[*tar].firstNode;
145 while(p){
146 if(!visited[p->num]){
147 visited[p->num] = 1;
148 printf("%c ",g->list[p->num].data);
149 inQueue(q,p->num);
150 }
151 p = p->next;
152 }
153
154 }
155 }
156 }
157
158 }
159
160 void initQueue(Queue *q,int n){
161 int i;
162 q->front=0;
163 q->rear =0;
164 for(i=0;i<n;i++){
165 q->data[q->rear]=2*i+1;
166 q->rear++;
167 }
168 }
169 void showQueue(Queue *q){
170 int i;
171 int len=getLength(q);
172 printf("front-");
173 for(i=0;i<len;i++){
174 if(q->front+i<MAXSIZE)
175 printf("%d-",q->data[q->front+i]);
176 else
177 printf("%d-",q->data[q->front+i-MAXSIZE]);
178 }
179 printf("rearn");
180 }
181 int getLength(Queue *q){
182 return (q->rear-q->front+MAXSIZE)%MAXSIZE;
183 }
184 int inQueue(Queue *q,int num){
185 if((q->rear+1)%MAXSIZE == q->front)
186 return 0;
187 q->data[q->rear] = num;
188 q->rear = (q->rear+1)%MAXSIZE;
189 return 1;
190 }
191 int outQueue(Queue *q,int *tar){
192 if(q->front == q->rear)
193 return 0;
194 *tar = q->data[q->front];
195 q->front = (q->front+1)%MAXSIZE;
196 return 1;
197 }
运行结果
- 相似文档查找算法之 simHash 简介及其 java 实现
- Hadoop 中利用 mapreduce 读写 mysql 数据
- Android O中对TEE加解密算法的新要求
- storm 原理简介及单机版安装指南
- Python Tips, Tricks, and Hacks
- 英特尔放出Linux微代码以修复Meltdown和Spectre漏洞
- python基础(5):深入理解 python 中的赋值、引用、拷贝、作用域
- Linux SSH密码暴力破解技术及攻防实战
- 西部数据NAS设备被曝存在硬编码后门和未授权文件上传高危漏洞
- Hive & Performance 学习笔记
- 任意用户密码重置(一):重置凭证泄漏
- linux 系统监控、诊断工具之 top 详解
- 一个二进制POC的诞生之旅CVE-2018-0802
- 远程RPC溢出EXP编写实战之MS06-040
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 小书MybatisPlus第5篇-Active Record模式精讲
- Python 语法问题-module ‘pip._internal‘ has no attribute ‘pep425tags‘. 原因及解决办法,32位、64位查看pip支持万能方法
- 总在说 Spring Boot 内置了 Tomcat 启动,那它的原理你说的清楚吗?
- JavaScript 技巧篇-js增加延迟时间解决单击双击事件冲突,双击事件触发单击事件
- Python 技术篇-sha256()加密的使用方法,sha1、md5加密方法
- Python 技术篇-如何打印一段文字,用友云霸气控制台颜文字打印
- Python 技术篇-获取秒级时间戳、毫秒级时间戳
- Python 技术篇-基于随机数的uuid码的生成
- BAT 脚本技术-利用bat批处理脚本静态指定ip地址、自动获取ip地址设置
- Oracle 技巧篇-快速批量删除当前数据库连接的用户,一键清空所有session会话方法
- Spring Security 中如何细化权限粒度?
- 小书MybatisPlus第4篇-表格分页与下拉分页查询
- 小书MybatisPlus第3篇-自定义SQL
- Nginx + Spring Boot 实现负载均衡
- 小书MybatisPlus第2篇-条件构造器的应用及总结