无向图的创建,深度优先遍历和广度优先遍历实现!

#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;iif(G.vexs[i]==c)
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;ifor(j=0;jG.arcs[i][j]=INFINITY;
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;iif(G.arcs[k][i]!=INFINITY)
return i;
}
return -1;
}


int NextVex(MGraph G,int i,int j)
{
int k;
if(i>=0&&i=0&&j{
for(k=j+1;kif(G.arcs[i][j]!=INFINITY)
return k;
}
return -1;
}

void DFS(MGraph G, int k)
{
int i;
if(k==-1)
{
for(i=0;iif(!visited[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;iif(!visited[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;ivisited[i]=false;
DFS(G,-1);
printf("\n广度优先遍历: ");
for(i=0;ivisited[i]=false;
BFS(G);
printf("\n");
}

相关文档
最新文档