#include<stdio.h>
#include<stdlib.h>
#define MVNum 100 //最大顶点数
typedef char VerTexType; //元素类型char
typedef struct
{
VerTexType vexs[MVNum]; //顶点阵
int arcs[MVNum][MVNum]; //邻接矩阵
int vexnum,arcnum; //顶点数和边数
}AMGraph;
void CreateG(AMGraph *G)
{
int i,j,k;
char a;
printf("please input vexnum and arcnum:"); //读入顶点和边数
scanf("%d%d",&G->vexnum,&G->arcnum);
scanf("%c",&a); //读入\r
printf("please input strings:");
for(i=0;i<G->vexnum;i++)
scanf("%c",&G->vexs[i]);
for(i=0;i<G->vexnum;i++) //初始化邻接矩阵
for(j=0;j<G->vexnum;j++)
G->arcs[i][j]=0;
printf("please input arcs:\n"); //读入边连接关系,并存入邻接矩阵
for(k=0;k<G->arcnum;++k)
{
scanf("%d%d",&i,&j);
G->arcs[i][j]=1;
G->arcs[j][i]=1; //无向图
}
}
typedef enum{false=0,true} bool; //枚举建立bool
bool visited[MVNum];
void DFS_AM(AMGraph G,int v) //深度优先遍历
{
int w;
printf("%c",G.vexs[v]);
visited[v]=true;
for(w=0;w<G.vexnum;w++)
if((G.arcs[v][w]!=0)&&(!visited[w]))
DFS_AM(G,w);
}
void DFS(AMGraph G)
{
int i;
for(i=0;i<G.vexnum;i++)
visited[i]=false;
DFS_AM(G,0);
}
void BFS(AMGraph G,int v) //广度优先遍历
{
int i,u,w;
int Queue[MVNum]; //定义队列
static int front=0,rear=0; //初始化队列
for(i=0;i<G.vexnum;i++)
visited[i]=false;
printf("%c",G.vexs[v]);
visited[v]=true;
Queue[rear]=v; ++rear; //入队
while(front!=rear) //队列非空
{
u=Queue[front]; ++front; //出队
for(w=0;w<G.vexnum;w++)
if(G.arcs[u][w]!=0&&!visited[w])
{
printf("%c",G.vexs[w]);
visited[w]=true;
Queue[rear]=w; ++rear; //入队
}
}
}
///main
int main()
{
AMGraph *G;
int v;
G=(AMGraph *)malloc(sizeof(AMGraph));
if(G==NULL)
exit(0);
CreateG(G); //创建图
printf("DFS:");
DFS(*G); //深度优先遍历
printf("\n");
printf("please input a vex to BFS:"); //选择一个顶点进行广度优先遍历
scanf("%d",&v);
printf("BFS:");
BFS(*G,v);
printf("\n");
system("pause");
free(G);
return 0;
}
数据结构-图的简易实现-C
最新推荐文章于 2022-05-03 15:34:26 发布