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>
#define MAX_VERTEX_NUM 20
#define QElemType int
#include "Queue.h"
//图的邻接表存储表示
typedef char VertexType; //顶点信息abcde
typedef int InfoType; //InfoType代表权值w类型
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;
void Graph_Create();
void Graph_Create_UDG(ALGraph *G);
void Graph_Create_DG(ALGraph *G);
void Graph_print(ALGraph G);
void dfs(int u,int *mark,ALGraph G);
void dfs_init(ALGraph G);
void bfs(ALGraph G);
ArcNode *nextAdjvex(ALGraph G,ArcNode *v,ArcNode *w);
ArcNode *FiestAdjvex(ALGraph G,QElemType v);
int main() {
Graph_Create();
return 0;
}
void Graph_Create() {
do {
ALGraph g;
printf("\n输入数字来确定你要选择的图的种类(1.无向图,2.有向图)\n");
scanf("%d",&g.kind);
switch(g.kind) {
case 0:
return;
case 1:
printf("无向图BFS遍历:\n");
Graph_Create_UDG(&g);
Graph_print(g);
bfs(g);
break;
case 2:
printf("有向图DFS遍历:\n");
Graph_Create_DG(&g);
Graph_print(g);
printf("深度搜索:\n");
dfs_init(g);
break;
default:
printf("错误输入!\n重试\n");
break;
}
} while(1);
}
void Graph_Create_UDG(ALGraph *G) {
//UDG 无向图
int i,u,v,w;
ArcNode* add;
printf("请输入无向图的顶点数,边数:");
scanf("%d %d",&G->vexnum,&G->arcnum);
getchar();
printf("请输入%d个顶点的信息:",G->vexnum);
for(i=0; i<G->vexnum; i++) {
scanf("%c",&G->vertices[i].data);
G->vertices[i].firstarc = NULL; //头节点初始化
}
printf("请依次输入%d条边的信息:\n",G->arcnum);
for(i=0; i<G->arcnum; i++) {
//依次读取m条边的信息
scanf("%d %d %d",&u,&v,&w);
add = (ArcNode*)malloc(sizeof(ArcNode)); //构造 u->v 这条边
add->adjvex = v;
add->info = (InfoType*) malloc(sizeof(InfoType));
*add->info = w;
add->nextarc = G->vertices[u].firstarc;
G->vertices[u].firstarc = add;
//无向图 ,相对称,则构造v->u这条边
add = (ArcNode*)malloc(sizeof(ArcNode));
add->adjvex = u;
add->info = (InfoType*) malloc(sizeof(InfoType));
*add->info = w;
add->nextarc = G->vertices[v].firstarc;
G->vertices[v].firstarc = add;
}
}
void Graph_Create_DG(ALGraph *G) {
//DG 有向图
int i,u,v,w;
ArcNode* add;
printf("请输入有向图的顶点数,边数:");
scanf("%d %d",&G->vexnum,&G->arcnum);
getchar();
printf