用队列实现以邻接矩阵作存储结构图的宽度优先搜索
发布网友
发布时间:2022-04-25 21:00
我来回答
共3个回答
热心网友
时间:2022-05-02 17:08
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int visited[20]={0};
typedef struct
{
char vexs[20];/*顶点表*/
int edges[20][20];
int n,e;
}Mgraph;
typedef struct QNode
{
int data;
struct QNode *next;
int Queusize;
}
QNode,*QueuePtr;//定义队列结点类型
typedef struct
{
QueuePtr front;
QueuePtr rear;
}
LinkQueue;//队列的类型
void InitQueue(LinkQueue *Q)//创建队列
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
Q->front->next=NULL;
}
void EnQueue(LinkQueue *Q,int e)//将元素插入队列
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
}
int DeQueue(LinkQueue *Q)//将元素出列且返回元素的位置
{
int e;
QueuePtr p;
p=Q->front->next;
e=p->data;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
free(p);
return (e);
}
int QueueEmpty(LinkQueue *Q)//判断队列是否为空
{
if(Q->front==Q->rear )
return 1;
else
return 0;
}
void CreateMGraph(Mgraph *G)
{
int i,j,k;
printf("输入顶点和边数\n");
scanf("%d %d", &G->n,&G->e);
getchar();
printf("输入%d个顶点\n",G->n);
for(i=0;i<G->n; i++ )
G->vexs[i]=getchar();
for (i = 0;i<G->n; i++)
for (j = 0;j <G->n; j++)
G->edges[i][j]=0;
printf("在矩阵中输入%d个元素:\n",2*(G->e));
for(k = 0;k<2*(G->e);k++)
{
scanf("%d%d",&i,&j);
G->edges[i][j]=1;
}
}
void BFS(Mgraph G,int i)//广度优先遍历
{
int u,j;
LinkQueue Q;
InitQueue(&Q);
printf("%c",G.vexs[i]);
visited[i]=1;//标记
EnQueue(&Q,i);
while(!QueueEmpty(&Q))
{
i=DeQueue(&Q);
for(j=0;j<G.n;j++)
if(G.edges[i][j]==1&&!visited[j])
{ printf("%c",G.vexs[j]);
visited[j]=1;
EnQueue(&Q,j);
}
}
}
main()
{
Mgraph G;
CreateMGraph(&G);
printf("广度:\n");
BFS(G,0);
}
给你吧,有不懂再问我。
热心网友
时间:2022-05-02 18:26
这个是你要的东西:
详细说明:1,图的建立与遍历操作 建立图的邻接矩阵 输出图从顶点V0出发按深度优先遍历的顶点序列 输出图从顶点V0出发按广度优先遍历的顶点序列 2,图的建立与拓扑排序
到这下载吧,我给你下的,如果不会弄把你的邮箱留下,我给你传
http://download.pudn.com/downloads64/sourcecode/math/65520769operate.rar
以下是部分代码:
#include"graph1.h"
#include"graph2.h"
#include<STDLIB.H>
void main(){
char input1;
int input2;
c:
do{
system("cls");
cout<<ENDL; cin 2:?; 1 0 cout<<endl<<?请选择 cout<<?='=================图的操作==========================="<<endl<<endl;' 图的建立与拓朴排序?<<endl; cout<<setw(20)<<2<<?------- 图的建立与遍历操作?<<endl; cout<<setw(20)<<1<<?------- 出口?<<endl; cout<<setw(20)<<0<<?------->>input1;
}while(input1<'0'||input1>'2');
switch(input1){
case '0':
cout<<ENDL<<" cin 1 0 cout<<? 4:?; 3 2 请选择: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~?<<endl; cout<<setw(10)<<4<<?.------返回上一层菜单?<<endl; cout<<setw(10)<<3<<?.------输出图从顶点V0出发按广度优先遍历的顶点序列?<<endl; cout<<setw(10)<<2<<?.------输出图从顶点V0出发按深度优先遍历的顶点序列?<<endl; cout<<setw(10)<<1<<?.------建立图的邻接矩阵?<<endl; cout<<setw(10)<<0<<?.------出口?<<endl; ~~~~~~~~~~~~~~~~~~~~~~~图的建立与遍历操作~~~~~~~~~~~~~~~~~~~~~~~~~?<<endl<<endl; cout<<endl; system(?cls?); do{ a: ?1?: case exit(1); 再见!?<<endl;>>input1;
}while(input1>'4'||input1<'0');
Matrix ga;
switch(input1){
case '0':
cout<<ENDL<<" cin cout<<endl; system(?cls?); ?1?: case exit(1); 再见!?<<endl; cout<<?请输入搜索起始顶点号(0~?<<ga.VertexNum-1<<?):?; cout<<?------------------输出图从顶点V0出发按深度优先遍历的顶点序列-----------?<<endl<<endl; ?2?: a; goto system(?pause?); ga.PrintMatrix(); ga.CreateMatrix(); ga.InitMatrix(); cout<<?------------------------建立图的邻接矩阵-----------------------------?<<endl;>>input2;
ga.Initvisited();
ga.dfsMatrix(input2);
cout<<ENDL; cin cout<<endl; system(?cls?); case cout<<?请输入搜索起始顶点号(0~?<<ga.VertexNum-1<<?):?; a; goto system(?pause?); cout<<?----------------------输出图从顶点V0出发按广度优先遍历的顶点序列----------?<<endl<<endl; ?3?:>>input2;
ga.bfsMatrix(input2);
cout<<ENDL; cin 1 0 cout<<? 2 cout<<endl; system(?cls?); do{ case ?2?: a; goto system(?pause?); 3:?; cout<<?请选择: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`?<<endl; cout<<setw(40)<<?3.------返回上一层菜单?<<endl; cout<<setw(42)<<?2.------输出图的拓朴序列?<<endl; cout<<setw(40)<<?1.------建立图的邻接表?<<endl; cout<<setw(30)<<?0.------出口?<<endl; ~~~~~~~~~~~~~~~~图的建立与拓朴排序~~~~~~~~~~~~~~~~~~~?<<endl<<endl; b: gl; GAdjoin } c; ?4?:>>input1;
}while(input1<'0'||input1>'3');
switch(input1){
case '0':
cout<<ENDL<<" cout<<endl; system(?cls?); ?1?: case exit(1); 再见!?<<endl; ?2?: goto system(?pause?); ?3?: } c; pre }< b; gl.Toposort(); ?; cout<<?该图的拓扑序列是: cout<<?---------------------------输出图的拓朴序列---------------------------------?<<endl; gl.PrintAdjoin(); cout<<endl<<?邻接表:?<<endl; gl.CreateAdjoin(); gl.InitAdjoin(); cout<<?-------------------------------建立图的邻接表-------------------------------?<<endl;>
热心网友
时间:2022-05-02 20:00
#include
<stdio.h>
#include
<stdlib.h>
#include
<malloc.h>
int
visited[20]={0};
typedef
struct
{
char
vexs[20];/*顶点表*/
int
edges[20][20];
int
n,e;
}Mgraph;
typedef
struct
QNode
{
int
data;
struct
QNode
*next;
int
Queusize;
}
QNode,*QueuePtr;//定义队列结点类型
typedef
struct
{
QueuePtr
front;
QueuePtr
rear;
}
LinkQueue;//队列的类型
void
InitQueue(LinkQueue
*Q)//创建队列
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
Q->front->next=NULL;
}
void
EnQueue(LinkQueue
*Q,int
e)//将元素插入队列
{
QueuePtr
p;
p=(QueuePtr)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
}
int
DeQueue(LinkQueue
*Q)//将元素出列且返回元素的位置
{
int
e;
QueuePtr
p;
p=Q->front->next;
e=p->data;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
free(p);
return
(e);
}
int
QueueEmpty(LinkQueue
*Q)//判断队列是否为空
{
if(Q->front==Q->rear
)
return
1;
else
return
0;
}
void
CreateMGraph(Mgraph
*G)
{
int
i,j,k;
printf("输入顶点和边数\n");
scanf("%d
%d",
&G->n,&G->e);
getchar();
printf("输入%d个顶点\n",G->n);
for(i=0;i<G->n;
i++
)
G->vexs[i]=getchar();
for
(i
=
0;i<G->n;
i++)
for
(j
=
0;j
<G->n;
j++)
G->edges[i][j]=0;
printf("在矩阵中输入%d个元素:\n",2*(G->e));
for(k
=
0;k<2*(G->e);k++)
{
scanf("%d%d",&i,&j);
G->edges[i][j]=1;
}
}
void
BFS(Mgraph
G,int
i)//广度优先遍历
{
int
u,j;
LinkQueue
Q;
InitQueue(&Q);
printf("%c",G.vexs[i]);
visited[i]=1;//标记
EnQueue(&Q,i);
while(!QueueEmpty(&Q))
{
i=DeQueue(&Q);
for(j=0;j<G.n;j++)
if(G.edges[i][j]==1&&!visited[j])
{
printf("%c",G.vexs[j]);
visited[j]=1;
EnQueue(&Q,j);
}
}
}
main()
{
Mgraph
G;
CreateMGraph(&G);
printf("广度:\n");
BFS(G,0);
}
给你吧,有不懂再问我。