输入指定的边数和顶点数建立图,并输出深度优先遍历和广度优先遍历的结果。
实验要求:在程序中定义下述函数,并实现要求的函数功能:
CreateGraph(): 按从键盘输入的顶点数和边数建立图
DFSGrahp():深度优先遍历图
BFSGrahp():广度优先遍历图
现在连图都建不出来
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define Max 100
typedef int EdgeType;
typedef struct ArcNode{//边表节点
int adjvex;//该弧指向顶点的位置
struct ArcNode *next;//指向下一条弧的指针
}ArcNode;
typedef struct VNode{//顶点表节点
int data;//顶点信息
ArcNode *first;//指向第一条依附该顶点的弧的指针
}VNode,AdjList[Max];
typedef struct{
AdjList vertices;//邻接表
int vexnum,arcnum;//图的顶点数和弧数
}ALGraph;
void DFS(ALGraph *G,int v);
void CreatMGraph(ALGraph *G){
int i=0,j=0,k;
ArcNode *s;
scanf("%d %d",&G->vexnum,&G->arcnum);
//读入顶点信息
//i=0; scanf("%d",&(G->vertices[i].data));
//头节点后为空
for(i=0;i<G->arcnum;i++) G->vertices[i].first=NULL;
for(k=0;k<G->arcnum;k++){
scanf("%d %d",&i,&j);
s=(ArcNode*)malloc(sizeof(ArcNode));
s->adjvex=j;//插入第i行的是j,创建的新节点的邻边是j
s->next=G->vertices[i].first;// 新节点的后继是原来的头指针指向的结点
G->vertices[i].first=s;//原来头指针指向的结点改向新节点 s
s=(ArcNode*)malloc(sizeof(ArcNode));//再来创建一个新节点插入第j行
s->adjvex=i;//插入第j行的是i;
s->next=G->vertices[j].first;
G->vertices[j].first=s;
}
}
bool visited[Max];//标记数组
void DFSTraverse(ALGraph *G){
int v=0;
for(v=0;v<G->vexnum;++v) visited[v]=false;
for(v=0;v<G->vexnum;++v) if(!visited[v]) DFS(G,v);
}
int FirstNeighbour(ALGraph *G,int v){
return G->vertices[v].first->adjvex;
}
int NextNeighbour(ALGraph *G,int v,int w){
w=FirstNeighbour(G,v);
return G->vertices[w].first->adjvex;
}
void DFS(ALGraph *G,int v){
int w;
// visit(v);
printf("%d ",G->vertices[v].data);
visited[v]=true;
for(w=FirstNeighbour(G,v);w>=0;w=NextNeighbour(G,v,w))
if(!visited[w]) DFS(G,w);
}
int main()
{
ALGraph *G=NULL;
CreatMGraph(G);
DFSTraverse(G);
return 0;}