图的邻接表+深度优先遍历+广度优先遍历

  1 /**
  2     无向图的邻接表存储
  3     深度优先遍历递归
  4     广度优先遍历递归+非递归
  5 */
  6 #include <stdio.h>
  7 #include <string.h>
  8 #include <malloc.h>
  9 #define N 5
 10 #define MAX 50
 11 typedef struct A{
 12     int adjvex;
 13     struct A* nextArc;
 14 }Arc;
 15 typedef struct node{
 16     char data[N];
 17     Arc* firstArc;
 18 }Node;
 19 typedef struct graph{
 20     Node vex[MAX];
 21     int numv;
 22     int nume;
 23 }Graph;
 24
 25 int getIndex(Graph G,char s[]){
 26     for(int i = 0; i < G.numv; i++){
 27         if(strcmp(G.vex[i].data,s) == 0)
 28             return i;
 29     }
 30     return -1;
 31 }
 32
 33 void create(Graph& G){
 34     printf("输入顶点和弧的个数:\n");
 35     scanf("%d%d",&G.numv,&G.nume);
 36     printf("输入顶点信息:\n");
 37     for(int i = 0; i < G.numv; i++)
 38         scanf("%s",G.vex[i].data);
 39     ///初始化顶点数组
 40     for(int i = 0; i < G.numv; i++)
 41         G.vex[i].firstArc = NULL;
 42     printf("输入边的信息:\n");
 43     char s[N],e[N];
 44     int u,v;
 45     for(int i = 0; i < G.nume; i++){
 46         scanf("%s%s",s,e);
 47         u = getIndex(G,s);
 48         v = getIndex(G,e);
 49         Arc* p = (Arc*)malloc(sizeof(Arc));
 50         p->adjvex = v;
 51         p->nextArc = NULL;
 52         p->nextArc = G.vex[u].firstArc;
 53         G.vex[u].firstArc = p;
 54         Arc* t = (Arc*)malloc(sizeof(Arc));
 55         t->nextArc = NULL;
 56         t->adjvex = u;
 57         t->nextArc = G.vex[v].firstArc;
 58         G.vex[v].firstArc = t;
 59     }
 60 }
 61
 62 void output(Graph G){
 63     Arc* p;
 64     for(int i = 0; i < G.numv; i++){
 65         p = G.vex[i].firstArc;
 66         printf("%4s",G.vex[i].data);
 67         while(p != NULL){
 68             printf("%4s",G.vex[p->adjvex].data);
 69             p = p->nextArc;
 70         }
 71         printf("\n");
 72     }
 73 }
 74
 75 ///深度优先遍历 (递归)
 76 int visit[2*MAX];
 77 void dfs(Graph G,int s){
 78     Arc* p = G.vex[s].firstArc;
 79     if(!visit[s]){
 80         printf("%4s",G.vex[s].data);
 81         visit[s] = 1;
 82     }
 83     while(p != NULL){
 84         if(!visit[p->adjvex])
 85             dfs(G,p->adjvex);
 86         p = p->nextArc;
 87     }
 88 }
 89
 90 ///广度优先遍历 (递归)
 91 ///缺点递归最大为G.numv次
 92 int q[2*MAX],f=0,r=0;
 93 int visit_q[MAX];
 94 void bfs(Graph G,int s){
 95     if(!visit_q[s]){
 96         printf("%4s",G.vex[s].data);
 97         visit_q[s] = 1;
 98         Arc* p = G.vex[s].firstArc;
 99         while(p != NULL){
100             if(!visit_q[p->adjvex])
101                 q[r++] = p->adjvex;
102             p = p->nextArc;
103         }
104     }
105     while(f < r){
106         bfs(G,q[f++]);
107     }
108 }
109
110 ///广度优先遍历 (非递归)
111 int Q[2*MAX],F=0,R=0;
112 int visit_Q[MAX];
113 void bfs_1(Graph G,int s){
114     printf("%4s",G.vex[s].data);
115     visit_Q[s] = 1;
116     Arc* p = G.vex[s].firstArc;
117     while(p != NULL){
118         Q[R++] = p->adjvex;
119         p = p->nextArc;
120     }
121     while(F < R){
122         int node = Q[F++];
123         if(!visit_Q[node]){
124             printf("%4s",G.vex[node].data);
125             visit_Q[node] = 1;
126             p = G.vex[node].firstArc;
127             while(p != NULL){
128                 if(!visit_Q[p->adjvex])
129                     Q[R++] = p->adjvex;
130                 p = p->nextArc;
131             }
132         }
133     }
134 }
135
136 int main(void){
137     Graph G;
138     create(G); printf("输出邻接矩阵:\n");
139     output(G);
140     printf("深度优先遍历(递归):\n");
141     dfs(G,0);
142     printf("\n广度优先遍历(递归):\n");
143     bfs(G,0);
144     printf("\n广度优先遍历(非递归):\n");
145     bfs_1(G,0);
146     return 0;
147 }

测试用例:

8 9
v1 v2 v3 v4 v5 v6 v7 v8
v1 v2
v1 v3
v2 v4
v2 v5
v3 v6
v3 v7
v4 v8
v5 v8
v7 v6
v1
图(b)

8 7
v1 v2 v3 v4 v5 v6 v7 v8
v1 v2
v1 v3
v2 v4
v3 v6
v4 v8
v6 v7
v8 v5
v1
图(a)

8 10
1 2 3 4 5 6 7 8
1 2
1 3
2 4
2 5
3 6
3 7
4 8
5 8
6 8
7 8
1
图(d)

6 7
A B C D E F
A B
A E
B F
B E
F C
F D
D C
图(c)

时间: 2024-11-05 13:39:50

图的邻接表+深度优先遍历+广度优先遍历的相关文章

浅谈数据结构之图的邻接表深度和广度优先遍历(九)

邻接矩阵是一种不错的图存储结构,但是我们发现,对于边数相对较少的图,这种结构是存在对存储空间的极大浪费的.我们知道,顺序存储结构存在预先分配内存可能造成空间浪费的问题,于是引出了链式存储的结构.同样的,我们也可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题.因此,对于图的存储结构,我们同样引入了一种数组与链表相组合的存储方法,我们一般称之为邻接表. 邻接表的处理方法是这样的:(1).图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易的读取顶点的信息,更加方便:另

图的邻接表表示、广度优先、深度优先搜索

图,就是我们在数据结构中学到的图,它是一种存储信息的结构.图是一类在实际应用中非常常见的数据结构,当数据规模大到一定程度时,如何对其进行高效计算即成为迫切需要解决的问题.最常见的大规模图数据的例子就是互联网网页数据,网页之间通过链接指向形成规模超过500 亿节点的巨型网页图.再如,Facebook 社交网络也是规模巨大的图,仅好友关系已经形成超过10 亿节点.千亿边的巨型图,考虑到Facebook 正在将所有的实体数据节点都构建成网状结构,其最终形成的巨型网络数据规模可以想见其规模.要处理如此规

数据结构学习笔记05图 (邻接矩阵 邻接表--&gt;BFS DFS)

数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边<v, w> 表示从v指向w的边(单行线) 不考虑重边和自回路 无向图:边是无向边(v, w) 有向图:边是有向边<v, w> 连通:如果从V到W存在一条(无向)路径,则称V和W是连通的 连通图(Connected Graph):如果对于图的任一两个顶点v.w∈V,v和w都是连通的,则称

存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现

如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有结点,又有边,对于有权图来说,每条边上还带有权值.常用的图的存储结构主要有以下二种: 邻接矩阵 邻接表 邻接矩阵 我们知道,要表示结点,我们可以用一个一维数组来表示,然而对于结点和结点之间的关系,则无法简单地用一维数组来表示了,我们可以用二维数组来表示,也就是一个矩阵形式的表示方法. 我们假设A是这个二维数组

数据结构之深度优先,广度优先遍历

深度优先和广度优先遍历在树和图中应用最为普遍,思想也类似,因此放到一起来总结. 二叉树的深度优先广度优先遍历: 一棵二叉树(2,(2(3,4),3(4,5))),这是一棵满二叉树,一共有7个节点,根节点2,深度为3 数据结构定义如下: class Node: def __init__(self, value=None, left = None, right = None): self.value = value self.left = left self.right = right 先根遍历 d

树的深度优先与广度优先遍历

简述树的深度优先及广度优先遍历算法,并说明非递归实现. 原题出自百度的笔试: 当时我看到这个题目的时候,已经完全记不得非递归算法该怎么实现了,后来查阅了一下,要用到两个辅助的数据结构: 深度优先遍历--->栈: 广度优先遍历--->队列: 这里以二叉树为例来实现. import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode left; TreeNode rig

数据结构之---C语言实现图的邻接表存储表示

// 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME 3 // 顶点字符串的最大长度+1 #define MAX_VERTEX_NUM 20 typedef int InfoType; // 存放网的权值 typedef char VertexType[MAX_NAME]; // 字符串类型 typedef enum{DG, DN, AG

图(邻接表)

我们先来看一个图 我们想将这个图的信息存储到邻接表中,我们需要一个数组保存节点信息,还要有一个节点用来保存与该节点相邻的节点信息. 1 typedef struct arc_node 2 { 3 int pos; 4 int distance; 5 struct arc_node * next; 6 } Arc_node;//保存Node节点的相邻节点信息 7 8 typedef struct node 9 { 10 node_type info; 11 Arc_node * next; 12

邻接表实现BFS广度优先搜索

#include <stdio.h> #include <stdlib.h> #include <string.h> #define VERTEX_NUM 8 typedef enum {FALSE = 0, TRUE = 1}BOOL; typedef struct ArcNode { int adjvex; struct ArcNode *nextarc; // struct不能少 }ArcNode; BOOL visited[VERTEX_NUM + 1]; //