2.(必做题)设计并验证如下算法:带权图采用邻接表表示,实现无向图的广度优先搜索与有向图的深度优先搜索。
#define MAX_VERTEX_NUM 20 //图的邻接表存储表示
typedef struct ArcNode{
int adjvex; //该弧所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条弧的指针
InfoType *info; //该弧相关信息的指针
}ArcNode;
typedef struct VNode {
VertexType data; //顶点信息
ArcNode *firstarc; //指向第一条依附该顶点弧的指针
}VNode,AdjList[MAX_VERTEX_NUM]
Typedef struct {
AdjList vertices;
int vexnum,arcnum; //图的当前顶点数和弧数
int kind; //图的种类标志
}ALGraph;
#include"stdio.h"
#include"stdlib.h"
#include"Q.h"
#define MaxVex 255
#define TRUE 1
#define FALSE 0
#define maxsize 10
bool visited[MaxVex];
typedef char elemtype;
typedef int Status;
typedef struct LoopQueue
{
int data[MaxVex];
int front,rear;
}LoopQueue,*Queue;
void initQueue(Queue &Q)
{
Q->front=Q->rear=0;
}
Status QueueEmpty(Queue &Q)
{
if(Q->front == Q->rear)
{return TRUE;}
else
{return FALSE;}
}
Status QueueFull(Queue &Q)
{
if((Q->rear+1)%MaxVex == Q->front)
{return TRUE;}
else
{return FALSE;}
}
void EnQueue(Queue &Q,int e)
{
if(!QueueFull(Q))
{
Q->data[Q->rear] = e;
Q->rear = (Q->rear+1)%MaxVex;
}
}
void DeQueue(Queue &Q,int *e)
{
if(!QueueEmpty(Q))
{
*e = Q->data[Q->front];
Q->front = (Q->front+1)%MaxVex;
}
}
Status locatevex(graph g,elemtype v)
{
int i;
for(i=0;i<g.n;i++)
if(g.vexlist[i].data==v)return i;
return -1;
}
void print(graph g)
{
int i;
edgenode *p;
printf("图的邻接表表示:\n");
for(i=0;i<g.n;i++)
{
printf("\n%4c",g.vexlist[i].data);
p=g.vexlist[i].firstedge;
while(p!=NULL)
{
printf("-->%d",p->adjvex);p=p->next;
}
}
printf("\n");
}
void creategraphW(graph *g)
{
int i,j,k;
elemtype v1,v2;
edgenode *s;
printf("请输入无向图的顶点数及边数\n");
printf("顶点数 n=");scanf("%d",&g->n);
printf("边 数 e=");scanf("%d",&g->e);
printf("请输入无向图的顶点信息:\n");getchar();
for(i=0;i<=g->n;i++)
{
scanf("%c",&g->vexlist[i].data);
g->vexlist[i].firstedge=NULL;
}
printf("请输入无向图的边的信息:\n");
for(k=0;k<g->e;k++)
{
printf("请输入第%d条边的两个端点下标:",k+1);
scanf("%c%c",&v1,&v2);getchar();
i=locatevex(*g,v1);
j=locatevex(*g,v2);
if(i>=0&&j>=0)
{
s=(edgenode *)malloc(sizeof(edgenode));
s->adjvex=j;
s->next=g->vexlist[i].firstedge;
g->vexlist[i].firstedge=s;
s=(edgenode *)malloc(sizeof(edgenode));
s->adjvex=i;
s->next=g->vexlist[j].firstedge;
g->vexlist[j].firstedge=s;
}
}
}
void creategraphY(graph *g)
{
int i,j,k;
elemtype v1,v2;
edgenode *s;
printf("请输入有向图的顶点数及边数\n");
printf("顶点数 n=");scanf("%d",&g->n);
printf("边 数 e=");scanf("%d",&g->e);
printf("请输入有向图的顶点信息:\n");getchar();
for(i=0;i<=g->n;i++)
{
scanf("%c",&g->vexlist[i].data);
g->vexlist[i].firstedge=NULL;
}
printf("请输入有向图的边的信息:\n");
for(k=0;k<g->e;k++)
{
printf("请输入第%d条边的两个端点下标:",k+1);
scanf("%c%c",&v1,&v2);getchar();
i=locatevex(*g,v1);
j=locatevex(*g,v2);
if(i>=0&&j>=0)
{
s=(edgenode *)malloc(sizeof(edgenode));
s->adjvex=j;
s->next=g->vexlist[i].firstedge;
g->vexlist[i].firstedge=s;
}
}
}
void DFS(graph g,int i)
{
edgenode *p;
printf("%3c",g.vexlist[i].data);
visited[i]=1;
p=g.vexlist[i].firstedge;
while(p!=NULL)
{
if(visited[p->adjvex]==0)
DFS(g,p->adjvex);
p=p->next;
}
}
void DFStraverse(graph g)
{
int v;
for (v=0; v<g.n;v++)visited[v]=0;
for (v=0; v<g.n;v++)
if (!visited[v])DFS(g,v);
}
void BFSTraverse(graph g)
{
int i;
Queue Q = (Queue)malloc(sizeof(LoopQueue));
for (i=0; i<g.n; ++i)
{
visited[i] = FALSE;
}
initQueue(Q);
for (i=0; i<g.n; ++i)
{
if(!visited[i])
{
visited[i] = TRUE;
printf("%c ", g.vexlist[i].data);
EnQueue(Q, i);
while (!QueueEmpty(Q))
{
DeQueue(Q, &i);
edgenode *p = g.vexlist[i].firstedge;
while (p)
{
if (!visited[p->adjvex])
{
visited[p->adjvex] = TRUE;
printf("%c ", g.vexlist[p->adjvex].data);
EnQueue(Q, p->adjvex);
}
p = p->next;
}
}
}
}
}
/*.h*/
#include"stdio.h"
#include"stdlib.h"
#define queuesize 100
#define MaxVex 255
#define queuesize 100
#define TRUE 1
#define FALSE 0
#define maxsize 10
typedef char elemtype;
typedef int Status;
typedef struct edgenode
{
int adjvex;
struct edgenode *next;
int weight;
}edgenode;
typedef struct vexnode
{
elemtype data;
edgenode *firstedge;
}vexnode;
typedef struct
{
vexnode vexlist[maxsize];
int n,e;
}graph;
/*main*/
#include"stdio.h"
#include"stdlib.h"
#include"Q.h"
void creategraphW(graph *g);
void creategraphY(graph *g);
void DFStraverse(graph g);
void BFSTraverse(graph g);
void print(graph g);
int main()
{
graph g;
creategraphW(&g);
printf("\n无向图的广度优先遍历为: ");
BFSTraverse(g);
print(g);
creategraphY(&g);
printf("有向图的深度优先遍历序列:\n");
DFStraverse(g);
print(g);
printf("\n");
return 0;
}