建立图的邻接矩阵或邻接表存储并在此基础知识上实现图的深度和广度优先遍历
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include ""
#include ""
#include ""
#include ""
typedef enum {FALSE, TRUE} BOOLEAN;
#define OVERFLOW -1
#define OK 1
#define ERROR 0
|
#define INFINITY INT_MAX /* 最大值∞*/
/* 根据图的权值类型,分别定义为最大整数或实数*/ #define MAX_VERTEX_NUM 20 /* 最大顶点数目*/ typedef enum {DG, DN, UDG,UDN} GraphKind ;
/* {有向图,有向网,无向图,无向网} */
)
BOOLEAN Visited[MAX_VERTEX_NUM];
BOOLEAN visited[MAX_VERTEX_NUM];
#define VEX_NUM 20
#define MAXSIZE 50
typedef char Vextype;
typedef int ElemType;
!
typedef int Status;
irstedge) return -1;
else return[v].firstedge->adjvex);
}
int NextAdjVex(ALGraph G,int v,int w) {irstedge;
if(!p) return -1;
;
while(p->adjvex!=w) p=p->nextarc; ertex=vi;
G->adjlist[i].firstedge=NULL;
}
printf("顶点:");
for (i=0;i
printf("%c(%d)-",G->adjlist[i].vertex,i+1);
》
printf("\n请输入边的信息(vi,vj)\n例如:1,2:\n");
for (k=0;k
scanf("%d,%d",&i,&j); irstedge;
G->adjlist[i-1].firstedge=s;
s=(EdgeNode*)malloc(sizeof(EdgeNode));
s->adjvex=i-1;
[
s->nextarc=G->adjlist[j-1].firstedge;
G->adjlist[j-1].firstedge=s;
}
.
}/*CreateALGraph*/
$
void DFS(ALGraph *G, int v) {
EdgeNode *p ;
Visited[v]=TRUE ;
printf("%c->",G->adjlist[v].vertex); /* 置访问标志,访问顶点v */
p=G->adjlist[v].firstedge; /* 链表的第一个结点*/
while (p!=NULL){
>
if(!Visited[p->adjvex])
DFS(G, p->adjvex);/* 从v的未访问过的邻接顶点出发深度优先搜索*/
p=p->nextarc ;
}
}
void DFS_traverse (ALGraph *G)
?
{
int v ;
EdgeNode *p ;
printf("深度度优先搜索输出结点信息:");
for (v=0; v
for (v=0; v
if (!Visited[v]) DFS(G,v);
?
}
ertex);
return OK;
}
~
void BFSTraverse(ALGraph G, Status (*Visit)(int v,ALGraph G))
{// 连通图G 广度优先搜索
LinkQueue Q;
ElemType u;
// EdgeNode *p;
int v;
【
int w;
printf("广度优先搜索输出结点信息:");
for(v=0;v<;++v) visited[v]=FALSE;// 初始化访问标志InitQueue(Q); //置空的辅助队列
for(v=0;v<;++v)
if(!visited[v]){ //v 未访问
visited[v]=TRUE;
'
Visit(v,G);
EnQueue(Q,v);//v 入队列
while(!QueueEmpty(Q)){
DeQueue(Q,&u); //队头元素出队并置为u
for(w=FirstAdjVex(G,u);w>=0; w=NextAdjVex(G,u,w))
if(!visited[w]){ //w为u尚未访问的邻接顶点
visited[w]=TRUE; Visit(w,G);
(
EnQueue(Q,w);//访问的顶点w入队列
}//if
}//while
}//if
}//BFSTraverse
·
void main()
{
//Mgraph Gm;
//CreateMGraph(&Gm); //邻接矩阵存储
ALGraph G2;//邻接表存储