#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
#define max 32727 //定义无穷大
#define N 20 //最大顶点数
//邻接矩阵的图结构
typedef struct
{
int data[N];//定义顶点表
int side[N][N];//定义邻接矩阵
int vexnum,arcnum;//图当前的顶点数和弧数
}graph;
//求邻接表位置
int LocatedVex(graph *g,int v)
{
for(int i=0;i<g->vexnum;++i)
{
if(v==g->data[i]) return i;
}
}
//构建邻接矩阵
void creatUDN(graph *g)
{
printf("请输入图当前的顶点数和弧数(中间以逗号隔开):");
scanf("%d,%d",&g->vexnum,&g->arcnum);
printf("\n");
//构造顶点表
for(int i=0;i<g->vexnum;++i)
{
printf("请输入第%d个顶点元素:",i+1);
scanf("%d",&g->data[i]);
printf("\n");
}
//初始化邻接矩阵
for(int i=0;i<g->vexnum;++i)
{
for(int j=0;j<g->vexnum;++j)
{
g->side[i][j]=0;
}
}
//构建邻接矩阵
for(int k=0;k<g->arcnum;++k)
{
int i,j,v1,v2;
printf("请输入具有关系的两个顶点的元素值(无需重复,中间以逗号隔开):");
scanf("%d,%d",&v1,&v2);
printf("\n");
i=LocatedVex(g,v1);
j=LocatedVex(g,v2);
g->side[i][j]=1;
g->side[j][i]=g->side[i][j];
}
}
void print(graph *g)
{
for(int i=0;i<g->vexnum;i++)
{
for(int j=0;j<g->vexnum;j++) printf("%3d",g->side[i][j]);
printf("\n");
}
}
int visited[N]; //定义辅助数组--全局变量
//初始化辅助数组
void initvisited()
{
for(int i=0;i<N;i++) visited[i]=0;
}
//深度优先搜索
void DFS(graph *g,int i)
{
printf("%3d",g->data[i]);
visited[i]=1;
for(int j=0;j<g->vexnum;j++)
{
if(!visited[j]&&g->side[i][j]) DFS(g,j);//两点同时满足未访问且两点间存在关系,递归调用
}
}
//用数组代替队列,实现功能
int Queue[N];
//初始化队列
void initqueue()
{
for(int i=0;i<N;i++) Queue[i]=0;
}
//广度优先遍历
void BFS(graph *g,int i)
{
int k,m=0;
int rear=0,front=0;
visited[i]=1;
Queue[rear]=i;//把下标入队
rear++;
while(front<rear)
{
k=Queue[front];//出队,记录下此时下标
front++;
for(int j=0;j<g->vexnum;j++)
{
if(g->side[k][j]&&!visited[j])
{
Queue[rear]=j;
rear++;
visited[j]=1;
}
}
}
//for(int m=0;m<g->vexnum;m++) printf("%3d",Queue[m]);
for(int m=0;m<g->vexnum;m++) printf("%3d",g->data[Queue[m]]);
}
int main()
{
graph g;
creatUDN(&g);
print(&g);
printf("深度优先遍历顺序为:\n");
DFS(&g,0);
printf("\n");
printf("广度优先遍历顺序为:\n");
BFS(&g,0);
return 0;
}



#include<stdio.h>
#include<malloc.h>
#define max 32727 //定义无穷大
#define N 20 //最大顶点数
//邻接矩阵的图结构
typedef struct
{
int data[N];//定义顶点表
int side[N][N];//定义邻接矩阵
int vexnum,arcnum;//图当前的顶点数和弧数
}graph;
//求邻接表位置
int LocatedVex(graph *g,int v)
{
for(int i=0;i<g->vexnum;++i)
{
if(v==g->data[i]) return i;
}
}
//构建邻接矩阵
void creatUDN(graph *g)
{
printf("请输入图当前的顶点数和弧数(中间以逗号隔开):");
scanf("%d,%d",&g->vexnum,&g->arcnum);
printf("\n");
//构造顶点表
for(int i=0;i<g->vexnum;++i)
{
printf("请输入第%d个顶点元素:",i+1);
scanf("%d",&g->data[i]);
printf("\n");
}
//初始化邻接矩阵
for(int i=0;i<g->vexnum;++i)
{
for(int j=0;j<g->vexnum;++j)
{
g->side[i][j]=0;
}
}
//构建邻接矩阵
for(int k=0;k<g->arcnum;++k)
{
int i,j,v1,v2;
printf("请输入具有关系的两个顶点的元素值(无需重复,中间以逗号隔开):");
scanf("%d,%d",&v1,&v2);
printf("\n");
i=LocatedVex(g,v1);
j=LocatedVex(g,v2);
g->side[i][j]=1;
g->side[j][i]=g->side[i][j];
}
}
void print(graph *g)
{
for(int i=0;i<g->vexnum;i++)
{
for(int j=0;j<g->vexnum;j++) printf("%3d",g->side[i][j]);
printf("\n");
}
}
int visited[N]; //定义辅助数组--全局变量
//初始化辅助数组
void initvisited()
{
for(int i=0;i<N;i++) visited[i]=0;
}
//深度优先搜索
void DFS(graph *g,int i)
{
printf("%3d",g->data[i]);
visited[i]=1;
for(int j=0;j<g->vexnum;j++)
{
if(!visited[j]&&g->side[i][j]) DFS(g,j);//两点同时满足未访问且两点间存在关系,递归调用
}
}
//用数组代替队列,实现功能
int Queue[N];
//初始化队列
void initqueue()
{
for(int i=0;i<N;i++) Queue[i]=0;
}
//广度优先遍历
void BFS(graph *g,int i)
{
int k,m=0;
int rear=0,front=0;
visited[i]=1;
Queue[rear]=i;//把下标入队
rear++;
while(front<rear)
{
k=Queue[front];//出队,记录下此时下标
front++;
for(int j=0;j<g->vexnum;j++)
{
if(g->side[k][j]&&!visited[j])
{
Queue[rear]=j;
rear++;
visited[j]=1;
}
}
}
//for(int m=0;m<g->vexnum;m++) printf("%3d",Queue[m]);
for(int m=0;m<g->vexnum;m++) printf("%3d",g->data[Queue[m]]);
}
int main()
{
graph g;
creatUDN(&g);
print(&g);
printf("深度优先遍历顺序为:\n");
DFS(&g,0);
printf("\n");
printf("广度优先遍历顺序为:\n");
BFS(&g,0);
return 0;
}


