图的邻接表法深度优先搜索

# include <stdio.h>

# include <stdlib.h>

# define True 1

# define False 0

# define Error -1

# define OK 1

# define MAX_VERTEX_NUM 20

int visited[MAX_VERTEX_NUM];                       //定义标志数组

typedef char VertexData;

typedef enum{DG,DN,UDG,UDN} GraphKind;

typedef struct ArcNode{         //弧节点结构

int adjvex;

struct ArcNode *nextarc;

// OtherInfo info;

}ArcNode;

typedef struct VertexNode{       //表头节点结构

VertexData data;

ArcNode *firstarc;

}VertexNode;

typedef struct {

VertexNode vertex[MAX_VERTEX_NUM];

int vexnum,arcnum;

GraphKind kind;

}AdjList;

int LocateVertex(AdjList *g, VertexData v)         //求顶点位置函数

{

int j = Error,k;

for (k = 0; k < g->vexnum ; k++)

if (g->vertex[k].data  == v)

{

j = k;break;

}

return j;

}

void Crtadjlist(AdjList *g)            //创建邻接链表

{

int n,e,i,j,k;

char vt,vh;

ArcNode *p;

printf("请输入图的顶点个数和弧的个数\n");

scanf("%d%d", &n, &e);

g->vexnum  = n;

g->arcnum  = e;

printf("请输入顶点信息\n");

getchar();

for (i = 0; i < n; i++)

{

scanf("%c", &(g->vertex[i].data));

g->vertex[i].firstarc = NULL;

}

printf("请输入弧的两个顶点\n");

for (k = 0; k < e; k++)

{

getchar();

scanf("%c%c",&vt,&vh);

i = LocateVertex(g,vt);

j = LocateVertex(g,vh);

p = (ArcNode *)malloc(sizeof(ArcNode));

p->adjvex = j;

p->nextarc = g->vertex[i].firstarc;

g->vertex[i].firstarc = p;

}

}

void DepthFirstSearch(AdjList *g, int v0)  //深度优先搜索

{

ArcNode *p;

printf("%c ", g->vertex[v0].data );

visited[v0] = True;

p = g->vertex[v0].firstarc;

while (p != NULL)

{

if (!visited[p->adjvex])

DepthFirstSearch(g, p->adjvex);

p = p->nextarc;

}

}

TraverseGraph(AdjList *g)      //深搜

{

int vi;

for (vi = 0; vi < g->vexnum ; vi++)

visited[vi] = False;               //初始化标志数组

for (vi = 0; vi < g->vexnum; vi++)

if (!visited[vi])

DepthFirstSearch(g,vi);

}

int main(void)

{

AdjList g;

Crtadjlist (&g);

TraverseGraph(&g);

printf("\n");

return 0;

}

时间: 2024-08-02 14:31:55

图的邻接表法深度优先搜索的相关文章

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

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

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

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

基于C++ STL图的邻接表表示及深度、广度搜索实现

基于C++ STL图的邻接表表示及深度.广度搜索实现,对图论的学习有帮助,代码如下: #include <iostream> #include <vector> #include <set> using namespace std; #define MAX(a, b) ((a) > (b) ? (a) : (b) ) //定义图的定点 typedef struct Vertex { int id; vector<int> connectors; //存

数据结构学习笔记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都是连通的,则称

数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历

图有四种存储结构:数组,邻接表,十字链表,邻接多重表.下面以数组为存储结构来实现图的深度优先搜索遍历和广度优先搜索遍历.其中广度优先搜索遍历中有用到STL中的queue,注意头文件的包含.具体代码如下: //图的数组(邻接矩阵)存储表示和深度优先遍历 const int MAX_VERTEX_NUM=20; //最大顶点数 typedef enum {DG,DN,UDG,UDN} GraphKind ;//(有向图,有向网,无向图,无向网) typedef int VRType; typedef

数据结构之---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

数据结构实验之图论二:基于邻接表的广度优先搜索遍历

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,

SDUT 2142 【TEST】数据结构实验之图论二:基于邻接表的广度优先搜索遍历

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一行为整数n(0< n <100),表示数据的组数.对于每组数据,第一行是三个整数k,m,t(0<

邻接表的深度优先遍历

转载请注明出处http://www.cnblogs.com/hslzju 对<大话数据结构>P241——邻接表的深度优先遍历,进行了自己的理解并完善了代码. 邻接矩阵的深度优先遍历见http://www.cnblogs.com/hslzju/p/5399249.html 举个简单的无序图例子,为了节省时间传手稿. 首先用邻接表的存储结构创建该图,再进行深度优先遍历.代码和解释如下(Qt Creator测试通过): 1 #include <iostream> 2 #include &