使用邻接表实现的图的深度优先搜索算法。主要参数含义:
1. 定义了结构体`ArcNode`表示图中的边,包含了一个邻接点的索引和指向下一个边的指针。
2. 定义了结构体`VNode`表示图中的顶点,包含了顶点的编号和指向第一个边的指针。
3. 定义了结构体`Graph`表示整个图,包含了一个顶点数组和顶点的数量。
4. 实现了初始化函数`Init`,用于初始化图的顶点数组。
5. 实现了插入边的函数`Insert`,将边插入到对应顶点的邻接表中。
6. 实现了深度优先搜索算法`DeepSearch`,用递归方式搜索从顶点`u`到顶点`v`的所有路径,并输出这些路径。
7. 在`main`函数中创建一个图,并插入边。然后调用深度优先搜索算法找到从顶点1到顶点5的所有路径。
`DeepSearch`函数中的参数意义如下:
1. `Graph *G`:指向图的指针。该指针指向一个包含所有顶点和边的邻接表。
2. `int u`:表示当前正在遍历的顶点编号。
3. `int v`:表示要到达的目标顶点的编号。
4. `int path[]`:用于存储当前路径上的所有顶点编号,path[d]=u表示第d个顶点是u。
5. `int d`:表示当前路径上的顶点数量,即从起点u到当前顶点的路径长度(从path[1]到path[d])。
6. `int visit[]`:用于标记图中的每个顶点是否被访问过。visit[u]等于1表示顶点u已被访问过,等于0表示未被访问过。在遍历过程中,遍历过的顶点需要标记为已访问,以免下一次重复访问。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef struct ArcNode{
int adjvex;
ArcNode *nextarc;
}ArcNode;
typedef struct{
int num;
ArcNode *firstarc;
}VNode;
typedef struct{
VNode adjlist[MaxSize];
int numNodes;
}Graph;
void Init(Graph *G,int n){
G->numNodes=n;
for(int i=1;i<=G->numNodes;i++){
G->adjlist[i].num=i;
G->adjlist[i].firstarc=NULL;
}
}
void Insert(Graph *G,int u,int v){
ArcNode *node=(ArcNode *)malloc(sizeof(ArcNode));
node->adjvex=v;
node->nextarc=NULL;
ArcNode *p=G->adjlist[u].firstarc;
if(p==NULL) G->adjlist[u].firstarc=node;
else{
while(p->nextarc!=NULL) p=p->nextarc;
p->nextarc=node;
}
}
void DeepSearch(Graph *G,int u,int v,int path[],int d,int visit[]){
static int count=0;
path[d]=u; visit[u]=1;
if(u==v){
printf("第%d条路径为:",++count);
for(int i=1;i<=d;i++)
printf("%d",path[i]);
printf("\n");
visit[u]=0;
return;
}
else{
ArcNode *p=G->adjlist[u].firstarc;
while(p!=NULL){
if(visit[p->adjvex]==0)
DeepSearch(G,p->adjvex,v,path,d+1,visit);
p=p->nextarc;
}
visit[u]=0;
}
}
int main(){
Graph *G=(Graph *)malloc(sizeof(Graph));
Init(G,5);
Insert(G,1,2);Insert(G,1,3);Insert(G,1,4);
Insert(G,2,1);Insert(G,2,5);
Insert(G,3,1);Insert(G,3,5);
Insert(G,4,1);
Insert(G,5,2);Insert(G,5,3);
int path[6],visit[6];
for(int i=1;i<=5;i++) visit[i]=0;
DeepSearch(G,1,5,path,1,visit);
return 0;
}