文章参考过网上的内容,如有侵权,请联系
#include<stdio.h>
#include<stdlib.h>
#define MAX_NUM 20
typedef struct ArcNode{
int adjvex; //该弧指向的顶点的位置
struct ArcNode *nextarc; //指向下一条弧的指针
}ArcNode;
typedef struct VNode{//顶点表结点
int data; //顶点信息
ArcNode *firstarc; //指向第一条依附该点的弧的指针
}VNode,AdjList[MAX_NUM];
typedef struct{
AdjList vertices;
int vexnum,arcnum; //图的当前顶点数和弧数
}ALGraph;
int CreateList(ALGraph &G)
{
int i=0;
printf("输入顶点数和弧数\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("输入顶点\n");
for(i=0;i<G.vexnum;++i)
{
G.vertices[i].data=i; //初始化顶点
G.vertices[i].firstarc=NULL; //顶点指针初始化
} //构造顶点
}
void GInsert(ALGraph &G)
{
ArcNode *p;
int i,j,k;
//printf("请输入各条边");
for(k=0;k<G.arcnum;k++){
printf("请输入第%d条边\n",k+1);
scanf("%d%d",&i,&j);
p=(ArcNode *)malloc(sizeof(ArcNode)); //生成j的表结点
p->adjvex=j;
p->nextarc=G.vertices[i].firstarc; //将结点j链接到i的单链表
G.vertices[i].firstarc=p;
p=(ArcNode *)malloc(sizeof(ArcNode)); //生成i的表结点
p->adjvex=i;
p->nextarc=G.vertices[j].firstarc; //将结点i链接到j的单链表
G.vertices[j].firstarc=p;
}
}
int visit[MAX_NUM]={0}; //用于判断顶点是否被访问
void DFSTraverse(ALGraph &G,int v)
{//深度遍历
printf("%d ",v);
visit[v]=1; //已访问标志
ArcNode *p=G.vertices[v].firstarc;
while(p){
if(!visit[p->adjvex])
DFSTraverse(G,p->adjvex);
p=p->nextarc;
}
}
void BFSTraverse(ALGraph &G,int v)
{
int arear=-1,afront=-1,Q[MAX_NUM];
printf("%d ",v);
visit[v]=1; //已访问标志
Q[++arear]=v;
while(arear!=afront){
v=Q[++afront];
ArcNode *p=G.vertices[v].firstarc;
while(p){
if(!visit[p->adjvex]){
printf("%d ",p->adjvex);
visit[p->adjvex]=1;
Q[++arear]=p->adjvex;
}
p=p->nextarc;
}
}
}
int main()
{
ALGraph G;
CreateList(G);
GInsert(G);
DFSTraverse(G,1);
printf("\n");
BFSTraverse(G,1);
}