ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

用邻接表表示图的BFS,DFS遍历

2022-03-19 15:01:37  阅读:165  来源: 互联网

标签:gg 遍历 return struct int Graph DFS BFS adjvex


BFS

#include <stdio.h>
#include<stdlib.h>
#define MaxVertexNum 10   /* 最大顶点数设为10 */
typedef int Vertex;       /* 用顶点下标表示顶点,为整型 */

/* 邻接点的定义 */
typedef struct AdjVNode *PtrToAdjVNode; 
struct AdjVNode{
    Vertex AdjV;        /* 邻接点下标 */
    PtrToAdjVNode Next; /* 指向下一个邻接点的指针 */
};

/* 顶点表头结点的定义 */
typedef struct Vnode{
    PtrToAdjVNode FirstEdge; /* 边表头指针 */
} AdjList[MaxVertexNum];     /* AdjList是邻接表类型 */

/* 图结点的定义 */
typedef struct GNode *PtrToGNode;
struct GNode{  
    int Nv;     /* 顶点数 */
    int Ne;     /* 边数   */
    AdjList G;  /* 邻接表 */
};
typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */
typedef struct queue{
	Vertex data[MaxVertexNum];
	int front,rear;
}*queue;

queue que;
int Visited[MaxVertexNum]; /* 顶点的访问标记 */

LGraph CreateGraph(); /* 创建图并且将Visited初始化 */

void Visit( Vertex V )
{
    printf(" %d", V);
}

void BFS ( LGraph Graph, Vertex S);
queue GreateQueue();
void EnQueue(queue q,Vertex x);
int DeQueue(queue q);
int Empty(queue q);
int FirstNei(LGraph gg,int v);
int NextNei(LGraph gg,int v,int x);

int main()
{
    LGraph G;
    Vertex S;

    G = CreateGraph();
	printf("输入遍历始节点\n");
    scanf("%d", &S);
    printf("BFS from %d:", S);
    BFS(G, S);
	system("pause");
    return 0;
}
LGraph CreateGraph(){
	int i,vi,vj;
	LGraph gg;
	PtrToAdjVNode p,q;
	for(i=0;i<MaxVertexNum;i++)//初始化visit数组
		Visited[i]=0;
	gg=(LGraph)malloc(sizeof(struct GNode));
	printf("输入节点个数,边数\n");
	scanf("%d %d",&gg->Nv,&gg->Ne);
	for(i=0;i<gg->Nv;i++){//头结点置空
		gg->G[i].FirstEdge=NULL;
	}
	printf("向图中加入边\n");
	for(i=0;i<gg->Ne;i++){
		scanf("%d %d",&vi,&vj);
		p=(PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
		p->AdjV=vj;
		p->Next=gg->G[vi].FirstEdge;
		gg->G[vi].FirstEdge=p;

		q=(PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
		q->AdjV=vi;
		q->Next=gg->G[vj].FirstEdge;
		gg->G[vj].FirstEdge=q;
	}

	return gg;
}
/* 你的代码将被嵌在这里 */
void BFS ( LGraph Graph, Vertex S){
	int k,w;
	que=GreateQueue();
	Visit(S);
	Visited[S]=1;
	EnQueue(que,S);
	while(!Empty(que)){
		k=DeQueue(que);
		for(w=FirstNei(Graph,k);w>=0;w=NextNei(Graph,k,w))
			if(!Visited[w]){
				Visited[w]=1;
				Visit(w);
				EnQueue(que,w);
			}
	}
}

queue GreateQueue(){
	queue q;
	q=(queue)malloc(sizeof(struct queue));
	q->front=q->rear=0;
	return q;
}
void EnQueue(queue q,Vertex x){
	q->data[q->rear]=x;
	q->rear=(q->rear+1)%MaxVertexNum;
}
int DeQueue(queue q){
	int temp;
	temp=q->data[q->front];
	q->front=(q->front+1)%MaxVertexNum;
	return temp;
}
int Empty(queue q){
	if(q->front==q->rear)
		return 1;
	else
		return 0;
}
//查找v节点指向的第一个节点
int FirstNei(LGraph gg,int v){
	if(v==-1)
		return -1;
	else if(gg->G[v].FirstEdge==NULL)
		return -1;
	else
		return gg->G[v].FirstEdge->AdjV;

}
//查找v节点指向的x节点的下一个指向到节点
int NextNei(LGraph gg,int v,int x){
	PtrToAdjVNode p;
	if(v==-1)
		return -1;
	p=gg->G[v].FirstEdge;
	while(p && p->AdjV!=x)
		p=p->Next;
	if(p->Next)
		return p->Next->AdjV;
	else
		return -1;
}

DFS

#include<stdio.h>
#include<stdlib.h>
#define N 100
typedef struct adjvex{
	int data;//存储边的权值
	int adjvex;//存储边指向尾节点编号
	struct adjvex * nextAdj;//指向下一条边
}adjvex;
typedef struct vex{
	int vex;//存储邻接表表头节点值
	adjvex* firstAdj;//指向该头结点首条边指向到值
}vex[N];
typedef struct graph{
	vex v;
	int vexNum,adjNum;//存储节点数,边数
}*Graph;

Graph CreatGraph(Graph gg);
void dfsSearch(Graph gg);
void DFS(Graph gg,int v);
int FirstNei(Graph gg,int v);
int NextNei(Graph gg,int v,int x);

Graph G;
int visit[N];
void main(){
	G=CreatGraph(G);
	dfsSearch(G);
	system("pause");
}
//创建图
Graph CreatGraph(Graph gg){
	adjvex * p,*q;
	int i,vi,vj,k;
	gg=(Graph)malloc(sizeof(struct graph));
	printf("输入节点个数,及边的条数\n");
	scanf("%d %d",&gg->vexNum,&gg->adjNum);
	for(i=0;i<gg->vexNum;i++){
		gg->v[i].vex=i;
		gg->v[i].firstAdj=NULL;
	}

	for(i=0;i<gg->adjNum;i++){
		scanf("%d %d %d",&vi,&vj,&k);
		//使用头插法
		p=(adjvex*)malloc(sizeof(struct adjvex));
		p->data=k;
		p->adjvex=vj;
		p->nextAdj=gg->v[vi].firstAdj;
		gg->v[vi].firstAdj=p;
		//头插法插入,无向图对称节点
		q=(adjvex*)malloc(sizeof(struct adjvex));
		q->data=k;
		q->adjvex=vi;
		q->nextAdj=gg->v[vj].firstAdj;
		gg->v[vj].firstAdj=q;

	}

	return gg;
}
//DFS遍历图
void dfsSearch(Graph gg){
	int i;
	for(i=0;i<gg->vexNum;i++)
		visit[i]=0;
	for(i=0;i<gg->vexNum;i++)
		if(!visit[i])
			DFS(gg,i);

}
void DFS(Graph gg,int v){
	int w;
	printf("%d ",v);
	visit[v]=1;
	for(w=FirstNei(gg,v);w>=0;w=NextNei(gg,v,w)){
		if(!visit[w])
			DFS(gg,w);
	}
}
//查找v节点指向的第一个节点
int FirstNei(Graph gg,int v){
	if(v==-1)
		return -1;
	else if(gg->v[v].firstAdj==NULL)
		return -1;
	else
		return gg->v[v].firstAdj->adjvex;

}
//查找v节点指向的x节点的下一个指向到节点
int NextNei(Graph gg,int v,int x){
	adjvex *p;
	if(v==-1)
		return -1;
	p=gg->v[v].firstAdj;
	while(p && p->adjvex!=x)
		p=p->nextAdj;
	if(p->nextAdj)
		return p->nextAdj->adjvex;
	else
		return -1;
}

标签:gg,遍历,return,struct,int,Graph,DFS,BFS,adjvex
来源: https://blog.csdn.net/qq_43271509/article/details/123595031

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有