基于邻接表的dfs和bfs

创建邻接表

typedef struct adjnode{  //邻接点
	int adj;
//	int w;
	struct adjnode *next;
}*Adj;

typedef struct vnode{  //顶点
    int data;
	Adj first;
}adjlist[20];

typedef struct gnode{  //图
	int vexnum,arcnum;
	adjlist vnode;
}*graph;

graph creategh(){  //初始化一个只有顶点的图(无向图)
	int i;
	graph gh;
	gh = (graph)malloc(sizeof(struct gnode));
	printf("输入顶点数:");
	scanf("%d",&gh->vexnum);
	gh->arcnum = 0;
	for(i=0;i < gh->vexnum;i++){
		gh->vnode[i].data = i;
		gh->vnode[i].first = NULL;
	}
	return gh;
}

void insertedge(graph gh){  //连接图的顶点
	int i,j;
	int v1,v2;
	printf("输入弧数:");
	scanf("%d",&gh->arcnum);
	for(i=0;i < gh->arcnum;i++){
		Adj adj1 = (Adj)malloc(sizeof(struct adjnode));
		Adj adj2 = (Adj)malloc(sizeof(struct adjnode));
		printf("输入头尾:");
		scanf("%d%d",&v1,&v2);
		//头插
		adj1->adj = v2;  
		adj1->next = gh->vnode[v1].first;
		gh->vnode[v1].first = adj1;
		//无向图一条边要插入两次
		adj2->adj = v1;
		adj2->next = gh->vnode[v2].first;
		gh->vnode[v2].first = adj2;
	}
}

/********图的邻接表创建完成********/

访问标记数组,dfs和bfs都需要

int visited[20] = {0};  //0表示未访问,1表示已访问

一、深度优先搜索dfs

void dfstravers(graph gh,int n){ 
	visited[n] = 1;
	printf("%d ",n+1); 
	Adj p = gh->vnode[n].first;
	while(p){
		if(visited[p->adj]==0)
		    dfstravers(gh,p->adj);
		p = p->next;
	}
}

二、广度优先搜索bfs

(1)辅助队列,这边用的是循环队列

typedef struct qnode{ 
	int *data;
	int front,rear;
	int maxsize;
	int length;
}qnode,*queue;

queue createqueue(int maxsize){ //创建一个空队列
	queue q;
	q = (queue)malloc(sizeof(qnode));
	q->maxsize = maxsize;
	q->data = (int*)malloc(sizeof(int)*maxsize);
	q->rear = q->front = 0;
	q->length = 0;
	return q;
}

int IsFull(queue q){  //判断队列是否满
	if((q->rear+1)%q->maxsize == q->front) return 1;
	return 0;
}

int IsEmpty(queue q){ //判断队列是否空
	if(q->rear==q->front) return 1;
	return 0;
}

void insertqueue(queue q,int n){ //入队
	if(IsFull(q)){
		printf("队列满");
		return;
	}
	q->data[q->rear] = n;
	q->rear = (q->rear+1) % q->maxsize;
	++q->length;
}

int deletqueue(queue q){ //出队
	if(IsEmpty(q)){
		printf("队列空");
		return -1;
	}
	int n = q->data[q->front];
	q->front = (q->front+1) % q->maxsize; 
	--q->length;
	printf("%d ",n+1);
	return n;
}

(2)bfs实现

void bfstravers(graph gh,int n){
	int i;
	Adj p;
	queue q = createqueue(20);
	for(i=0;i<gh->vexnum;i++){
		if(visited[i]==0){ 
			visited[i] = 1;
			insertqueue(q,i);  //入队
			while(!IsEmpty(q)){
			    int n = deletqueue(q); //出队
			    p = gh->vnode[n].first;
				while(p){  //邻接点入队
					if(!visited[p->adj]){
						visited[p->adj] = 1;
						insertqueue(q,p->adj); 
					}
					p = p->next;
				}		
			}
		} 
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值