#include<stdio.h>
#include<stdlib.h>
#define true 1
#define false 0
typedef struct ANode //边结点
{
int adjvex;
struct ANode *nextarc;
}ANode,*ArcNode;
typedef struct VNode //顶点信息
{
int flag;
char data;
ArcNode firstarc;
}VNode,*VexNode;
typedef struct
{
int* base;
int Front;
int Rear;
}SqQueue;
void CreateUDG(VexNode *HNode);
int LocateVex(VexNode G,char g,int V);
void DFS_AL(VexNode G,int v);
void BFS(VexNode G,int v);
int InitQueue(SqQueue *Q);
int EnQueue(SqQueue *Q,int e);
int DeQueue(SqQueue *Q);
void BFS(VexNode G,int v);
int main()
{
VexNode HNode;
CreateUDG(&HNode);
int v=1;
int w=1;
printf("广度优先搜索的结果为:");
scanf("%d",&v);
DFS_AL(HNode,v);
printf("深度优先搜索的结果为:");
scanf("%d",&w);
BFS(HNode,w);
return 0;
}
void CreateUDG(VexNode *HNode)
{
int vexnum,arcnum;
printf("请输入顶点数:");
scanf("%d",&vexnum);
getchar();
*HNode=(VexNode)malloc(sizeof(VNode)*vexnum);
int i,k;
printf("请输入顶点:");
for(i=0;i<vexnum;i++)
{
scanf("%c",&(*HNode)[i].data);
(*HNode)[i].flag=false;
(*HNode)[i].firstarc=NULL;
}
printf("请输入边数:");
scanf("%d",&arcnum);
char g1,g2;
int a,b;
ArcNode p1,p2;
for(k=0;k<arcnum;k++)
{
getchar();
printf("请输入边;\n");
scanf("%c%c",&g1,&g2);
a=LocateVex(HNode[0],g1,vexnum);
b=LocateVex(HNode[0],g2,vexnum);
p1=(ArcNode)malloc(sizeof(ANode));
p1->adjvex=b;
p1->nextarc=(*HNode)[a].firstarc;
(*HNode)[a].firstarc=p1;
p2=(ArcNode)malloc(sizeof(ANode));
p2->adjvex=a;
p2->nextarc=(*HNode)[b].firstarc;
(*HNode)[b].firstarc=p2;
}
return ;
}
int LocateVex(VexNode G,char g,int V)
{
int i;
for(i=0;i<V;i++)
{
if(G[i].data==g)
return i;
}
return 0;
}
void DFS_AL(VexNode G,int v)
{
int w;
ArcNode p;
printf("%c",G[v].data);
G[v].flag=true;
p=G[v].firstarc;
while(p!=NULL)
{
w=p->adjvex;
if(!G[w].flag) DFS_AL(G,w);
p=p->nextarc;
}
return ;
}
void BFS(VexNode G,int v)
{
int m;
ArcNode p;
SqQueue Q;
InitQueue(&Q);
EnQueue(&Q,v);
while(Q.Front!=Q.Rear)
{
m=DeQueue(&Q);
if(G[m].flag)
{
printf("%c",G[m].data);
G[m].flag=false;
}
p=G[m].firstarc;
while(1)
{
EnQueue(&Q,p->adjvex);
if(p->nextarc)
p=p->nextarc;
else break;
}
}
}
int InitQueue(SqQueue *Q)
{
Q->base=(int*)malloc(sizeof(int)*20);
if(!Q->base) exit -1;
Q->Front=Q->Rear=0;
return 0;
}
int EnQueue(SqQueue *Q,int e)
{
Q->base[Q->Rear]=e;
Q->Rear=Q->Rear+1;
return 0;
}
int DeQueue(SqQueue *Q)
{
int e;
if(Q->Front==Q->Rear) return 0;
e=Q->base[Q->Front];
Q->Front=Q->Front+1;
return e;
}