无向图的创建,深度优先遍历和广度优先遍历实现!
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "malloc.h"
#include "stdio.h"
#define INFINITY 32767
#define MAX_VEX 20
#define QUEUE_SIZE (MAX_VEX+1)
bool *visited;
typedef struct
{
char *vexs;
int arcs[MAX_VEX][MAX_VEX];
int vexnum,arcnum;
}MGraph;
class Queue
{
public:
void InitQueue()
{
base=(int *)malloc(QUEUE_SIZE*sizeof(int));
front=rear=0;
}
void EnQueue(int e)
{
base[rear]=e;
rear=(rear+1)%QUEUE_SIZE;
}
void DeQueue(int &e)
{
e=base[front];
front=(front+1)%QUEUE_SIZE;
}
public:
int *base;
int front;
int rear;
};
int Locate(MGraph G,char c)
{
for(int i=0;i
return i;
return -1;
}
void CreateUDN(MGraph &G)
{
int i,j,w,s1,s2;
char a,b,temp;
printf("请输入顶点数和弧数:");
scanf("%d%d",&G.vexnum,&G.arcnum);
temp=getchar();
G.vexs=(char*)malloc(G.vexnum*sizeof(char));
printf("输入%d个顶点.\n",G.vexnum);
for(i=0;i
printf("输入顶点%d:",i);
scanf("%c",&G.vexs[i]);
temp=getchar();
}
for(i=0;i
printf("弧的输入方法:1 2 1\n");
printf("输入%d条弧.\n",G.arcnum);
for(i=0;i
printf("输入弧%d:",i);
scanf("%c %c %d",&a,&b,&w);
temp=getchar();
s1=Locate(G,a);
s2=Locate(G,b);
G.arcs[s1][s2]=G.arcs[s2][s1]=w;
}
}
int FirstVex(MGraph G,int k)
{
int i;
if(k>=0&&k<=G.vexnum)
{
for(i=0;i
return i;
}
return -1;
}
int NextVex(MGraph G,int i,int j)
{
int k;
if(i>=0&&i
for(k=j+1;k
return k;
}
return -1;
}
void DFS(MGraph G, int k)
{
int i;
if(k==-1)
{
for(i=0;i
DFS(G,i);
}
else
{
visited[k]=true;
printf("% c",G.vexs[k]);
for(i=FirstVex(G,k);i>=0;i=NextVex(G,k,i))
if(!visited[i])
DFS(G,i);
}
}
void BFS(MGraph G)
{
int k;
Queue Q;
Q.InitQueue();
for(int i=0;i
{
visited[i]=true;
printf("% c",G.vexs[i]);
Q.EnQueue(i);
while(Q.front!=Q.rear)
{
Q.DeQueue(k);
for(int w=FirstVex(G,k);w>=0;w=NextVex(G,k,w))
if(!visited[w])
{
visited[w]=true;
printf("% c",G.vexs[w]);
Q.EnQueue(w);
}
}
}
}
//#include "ge.h"
void main()
{
printf("功能:无向图的创建,深度优先遍历和广度优先遍历实现!\n");
int i;
MGraph G;
CreateUDN(G);
visited=(bool *)malloc(G.vexnum*sizeof(bool));
printf("\n深度优先遍历:");
for(i=0;i
DFS(G,-1);
printf("\n广度优先遍历: ");
for(i=0;i
BFS(G);
printf("\n");
}