无向图的深度优先遍历

2022-07-22 12:59:22

无向图的深度优先遍历

输入:图的顶点及边的数目、每条边依附的顶点

输出:以任意一点为起点,进行广度优先遍历的结果。

#include"stdio.h"#include"stdlib.h"#include"conio.h"#define MAXADJSIZE 20int visited[MAXADJSIZE];//图的  邻接表  储存方式typedefstruct ArcNode{struct ArcNode*nextarc;//下一个弧int adjvex;//所在定点}ArcNode;typedefstruct VNode{struct ArcNode*firstarc;//指向第一个弧int data;//顶点信息}VNode,AdjList[MAXADJSIZE];typedefstruct{
	AdjList vex;int vexnum,arcnum;}Graph;//队列的链式储存   用于广度优先的遍历typedefstruct QNode{int v;struct QNode*next;}QNode,*Qptr;typedefstruct{
  	Qptr front;
  	Qptr rear;}LinkQ;voidInitQueue(LinkQ&Q){if(!(Q.front=Q.rear=(Qptr)malloc(sizeof(QNode)*MAXADJSIZE)))printf("储存分配失败!!!\n");else{
		Q.front->next=NULL;}}voidEnQueue(LinkQ&Q,int e){
	Qptr p;if(!(p=(Qptr)malloc(sizeof(QNode))))printf("储存分配失败!!!\n");else{
	p->v=e;
	p->next=NULL;
	Q.rear->next=p;
	Q.rear=p;}}voidDeQueue(LinkQ&Q,int&e){if(Q.rear==Q.front)printf("此队列为空!!!\n");else{
	Qptr p;if(!(p=(Qptr)malloc(sizeof(QNode))))printf("储存分配失败!!!\n");else{
    p=Q.front->next;
	e=p->v;
	Q.front->next=p->next;if(Q.rear==p) Q.rear=Q.front;//当队列中的最后一个元素被删除的时候,rear会丢失,应该对其重新赋值free(p);}}}intEmptyQueue(LinkQ Q){if(Q.front==Q.rear)return1;elsereturn0;}voidVISIT(int v){printf("v%d  ",v+1);}//与节点v相接的第一个边intFirstAdjVex(Graph G,int v){return G.vex[v].firstarc->adjvex;}// 与节点v相接的下一个边intNextAdjVex(Graph G,int v,int w){   ArcNode*p;if(!(p=(ArcNode*)malloc(sizeof(ArcNode))))printf("储存分配失败!!!\n");
	p=G.vex[v].firstarc;while(p->adjvex!=w&&p->nextarc!=NULL)	
	  p=p->nextarc;if(p->nextarc==NULL)return-5;else{	
	  p=p->nextarc;	
	  w=p->adjvex;return w;}}voidBFSTraverse(Graph G){//图的广度优先遍历int v,u; 	
	LinkQ Q;for(v=0;v<G.vexnum;++v) 
	  visited[v]=0;InitQueue(Q);for(v=0;v<G.vexnum;++v){printf("以点v%d为起点的结果:",v+1);if(!visited[v]){VISIT(v);visited[v]=1;EnQueue(Q,v);while(!EmptyQueue(Q)){DeQueue(Q,u);for(int w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))if(!visited[w]){VISIT(w);
		    visited[w]=1;EnQueue(Q,w);}}}for(int i=0;i<G.vexnum;++i) 
	  visited[i]=0;InitQueue(Q);printf("\n");}}voidcreat(Graph&G)//创建存储图的邻接表{int j,i;	
	ArcNode*s,*t,*p;int v1,v2;printf("输入无向图顶点数目和无向图边数:\n");scanf("%d%d",&G.vexnum,&G.arcnum);for(i=0;i<G.vexnum;i++){	
	  G.vex[i].data=i;
  	  G.vex[i].firstarc=NULL;}for(int k=0;k<G.arcnum;k++){printf("请输入第%d条边依附的两个顶点:\n",k+1);scanf("%d %d",&v1,&v2);	
		v1--;
		v2--;
		s=(ArcNode*)malloc(sizeof(ArcNode));
		t=(ArcNode*)malloc(sizeof(ArcNode));
		s->adjvex=v1;	
		s->nextarc=G.vex[v2].firstarc;
		G.vex[v2].firstarc=s;	
		t->adjvex=v2;
		t->nextarc=G.vex[v1].firstarc;	
		G.vex[v1].firstarc=t;}}voidPrint(Graph&G){
	ArcNode*p;printf("%4s %6s %12s\n","编号","顶点","相邻边编号");for(int i=0;i<G.vexnum;i++){printf("%4d     v%d",i,G.vex[i].data+1);for(p=G.vex[i].firstarc;p;p=p->nextarc)printf("%4d",p->adjvex);printf("\n");}}intmain(){
	Graph G;creat(G);//	Print(G);BFSTraverse(G);return0;}

在这里插入图片描述在这里插入图片描述

  • 作者:妙趣前端
  • 原文链接:https://blog.csdn.net/qq_45768871/article/details/104852192
    更新时间:2022-07-22 12:59:22