1、1图的深度优先与广度优先遍历实验题目:从键盘输入的数据创建图(图的存储结构可采用邻接矩阵或邻接表) ,并对图进行深度优先搜索和广度优先搜索(1)算法设计思路简介先定义邻接矩阵和邻接表类型,实现邻接表和邻接矩阵的相互转换,输出邻接表和邻接矩阵,再实现深度和广度优先遍历在主程序中提供下列菜单:1图的建立2深度优先遍历图3广度优先遍历图0结束(2)算法描述:可以用自然语言、伪代码或流程图等方式VertexType; /顶点类型MGraph; /图的邻接矩阵类型ArcNode; /定义邻接表类型void DispMat(MGraph g) /输出邻接矩阵void MatToList(MGraph g,
2、ALGraph * int info; VertexType; typedef struct /图的定义int edgesmaxmax;int n,e;VertexType vexsmax; MGraph;/定义邻接表类型typedef struct ANode 2int adjvex; struct ANode *nextarc; /指向下一条弧的指针int info; /存放弧的信息(权值)ArcNode;typedef struct Vnode int data; ArcNode *firstarc; /指向第一条弧VNode;typedef VNode AdjListmax; /Adj
3、List 是邻接表类型,把大表变成几个小的连接到一起typedef struct AdjList adjlist;int n,e; /图中顶点数和和边数ALGraph;int visitedmax; /全局数组用于判断后面节点是否被访问过void DispMat(MGraph g) /输出邻接矩阵int i,j;for(i=0;iadjlisti.firstarc=NULL;for(i=0;iadjvex=j;p-info=g.edgesij;p-nextarc=G-adjlisti.firstarc; /将*p 连接到表后3G-adjlisti.firstarc=p;G-e=g.e;G-n=
4、g.n; void DispAdj(ALGraph *G) /输出邻接表 int i;ArcNode *p; for(i=0;in;i+)p=G-adjlisti.firstarc;if(p!=NULL)printf(“ %d: “,i); while(p!=NULL) printf(“ %d “,p-adjvex); /输出弧的终点p=p-nextarc; printf(“n“);void change(int visited,ALGraph *G) /给全局变量 visited 赋初值int i;for(i=0;in;i+)visitedi=0;void ListToMat(ALGraph
5、 *G,MGraph g) /将邻接表转换为邻接矩阵的形式int i,j;int n=G-n;ArcNode *p;for(i=0;iadjlisti.firstarc;while(p!=NULL)g.edgesip-adjvex=p-info;p=p-nextarc;4g.n=n;g.e=G-e;void DFS(ALGraph *G,int v) /递归深度优先遍历ArcNode *p; /change(visited,G);visitedv=1; /第一个点设为已被访问并输出,接着以他为主进行遍历printf(“ %d“,v); p=G-adjlistv.firstarc;while(p
6、!=NULL)if(visitedp-adjvex=0)DFS(G,p-adjvex);p=p-nextarc; void BFS(ALGraph *G,int v) ArcNode *p;int queuemax,front=0,rear=0; /定义循环队列并初始化int visitedmax;int w,i;for(i=0;in;i+)visitedi=0;printf(“ %d “,v); /把输入的第 v 个作为第一个广度遍历的节点,一直这样进行下去visitedv=1; rear=(rear+1)%max; queuerear=v; /把 v 入队while(front!=rear
7、) /队列不为空的时候 front=(front+1)%max; w=queuefront;p=G-adjlistw.firstarc; while(p!=NULL) if(visitedp-adjvex=0) /当前节点未被访问 printf(“%d “,p-adjvex);visitedp-adjvex=1;rear=(rear+1)%max; queuerear=p-adjvex;p=p-nextarc;printf(“n“);void main()5 int i,j;MGraph g;ALGraph *G; int Amax6;printf(“请输入邻接矩阵:n“);for(i=0;i
8、6;i+)for(j=0;j6;j+)scanf(“%d“,g.n=6;g.e=10;for(i=0;ig.n;i+)for(j=0;jg.n;j+)g.edgesij=Aij; /给邻接矩阵赋值printf(“这是图的邻接矩阵的形式:“);printf(“n“);DispMat(g); /输出邻接矩阵的函数G=(ALGraph *)malloc(sizeof(ALGraph);MatToList(g,G);printf(“这是图的邻接表的形式:“);printf(“n“);DispAdj(G);printf(“从顶点 0 开始的深度优先遍历:n“);DFS(G,0);printf(“n“);printf(“从顶点 0 开始的广度优先遍历:n“);BFS(G,0);printf(“n“);