
#include<stdio.h>
#include<stdlib.h>
#define MAX_VEX_NUM 20
typedef struct
{
char vertex[MAX_VEX_NUM];
int arcs[MAX_VEX_NUM][MAX_VEX_NUM];
int vex_num;
int arc_num;
}Mgraph;
int LocateVex(Mgraph g,char v)
{
int i;
for(i=0;i<g.vex_num;i++)
{
if(g.vertex[i]==v)
return i;
}
return-1;
}
void create_UDG(Mgraph &g)
{
int i,j,k;
char v1,v2;
int cost;
printf("请输入顶点个数,边的条数:");
scanf("%d,%d",&g.vex_num,&g.arc_num);
getchar();
printf("请输入顶点信息(逐个 输入、回车):\n");
for(i=0;i<g.vex_num;i++)
{
scanf("%c",&g.vertex[i]);
getchar();
}
for(i=0;i<g.vex_num;i++)
for(j=0;j<g.vex_num;j++)
g.arcs[i][j]=0;
printf("请输入边的邻接点(输入字母以逗号相间):\n");
for(k=0;k<g.arc_num;k++)
{
scanf("%c,%c",&v1,&v2);
getchar();
i=LocateVex(g,v1);
j=LocateVex(g,v2);
g.arcs[j][i]=g.arcs[i][j]=1;
}
}
void out_UDG(Mgraph g)
{
int i,j;
printf("图的顶点是:\n");
for(i=0;i<g.vex_num;i++)
{
printf("%c",g.vertex[i]);
}
printf("\n");
printf("图的邻接矩阵是:\n");
for(i=0;i<g.vex_num;i++)
{
for(j=0;j<g.vex_num;j++)
printf("%8d",g.arcs[i][j]);
printf("\n");
}
}
int visited[MAX_VEX_NUM];
void DFS(Mgraph g,int i)
{
int j;
visited[i]=1;
printf("%c",g.vertex[i]);
for(j=0;j<g.vex_num;j++)
{
if(!visited[j]&&g.arcs[i][j])
DFS(g,j);
}
}
void DFSTraverse(Mgraph g)
{
printf("深度优先遍历:");
int i;
for(i=0;i<g.vex_num;i++)visited[i]=0;
for(i=0;i<g.vex_num;i++)
{
if(!visited[i])
DFS(g,i);
}
}
void BFSTraverse(Mgraph g)
{
printf("广度优先遍历:");
int u,v;
for(u=0;u<g.vex_num;u++)visited[u]=0;
for(u=0;u<g.vex_num;u++)
if(!visited[u])
{
visited[u]=1;
printf("%c",g.vertex[u]);
for(v=0;v<g.vex_num;v++)
if(!visited[v]&&g.arcs[u][v])
{
visited[v]=1;
printf("%c",g.vertex[v]);
}
}
}
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
}ArcNode,*Arc;
typedef struct VNode
{
char data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VEX_NUM];
typedef struct
{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
void creat__UDG(ALGraph &g)
{
Arc p,q;
int i,m[MAX_VEX_NUM],n[MAX_VEX_NUM];
printf("请输入顶点个数、边的条数:");
scanf("%d,%d",&g.vexnum,&g.arcnum);
getchar();
printf("请输入顶点信息(逐个 输入、回车):\n");
for(i=1;i<=g.vexnum;i++)
{
scanf("%c",&g.vertices[i].data);
getchar();
g.vertices[i].firstarc=NULL;
}
printf("请输入边的邻接点标号(输入数字以逗号相间):\n");
for(i=1;i<=g.arcnum;i++)
{
scanf("%d,%d",&m[i],&n[i]);
getchar();
}
for(i=g.arcnum;i>0;i--)
{
p=(Arc)malloc(sizeof(ArcNode));
q=(Arc)malloc(sizeof(ArcNode));
p->adjvex=n[i];
p->nextarc=g.vertices[m[i]].firstarc;
g.vertices[m[i]].firstarc=p;
q->adjvex=m[i];
q->nextarc=g.vertices[n[i]].firstarc;
g.vertices[n[i]].firstarc=q;
}
}
void out__UDG(ALGraph &g)
{
int i;
printf("图的邻接表:\n");
for(i=1;i<=g.vexnum;i++)
{
printf("%c:",g.vertices[i].data);
while(g.vertices[i].firstarc->nextarc!=NULL)
{
printf("(%c)",g.vertices[g.vertices[i].firstarc->adjvex].data);
printf("%d->",g.vertices[i].firstarc->adjvex);
g.vertices[i].firstarc=g.vertices[i].firstarc->nextarc;
}
printf("(%c)",g.vertices[g.vertices[i].firstarc->adjvex].data);
printf("%d\n",g.vertices[i].firstarc->adjvex);
}
}
void DFS_(ALGraph G, int i)
{
Arc p;
visited[i]=1;
printf("%c",G.vertices[i].data);
p=G.vertices[i].firstarc;
while(p)
{
if(!visited[p->adjvex])
DFS_(G,p->adjvex);
p=p->nextarc;
}
}
void DFS_Traverse(ALGraph G)
{
printf("深度优先遍历:");
for(int i=1;i<=G.vexnum;++i)
visited[i]=0;
for(int i=1;i<=G.vexnum;i++)
{
if (!visited[i])
DFS_(G, i);
}
}
void BFS_Traverse(ALGraph G)
{
printf("广度优先遍历:");
Arc p;
int Qu[20],front,rear;
int w,i;
for(int i=0;i<MAX_VEX_NUM;i++)visited[i]=0;
front=rear=0;
printf("%c",G.vertices[1].data);
visited[1]=1;
rear=(rear+1)%20;
Qu[rear]=1;
while(front!=rear)
{
front=(front+1)%20;
w=Qu[front];
p=G.vertices[w].firstarc;
while(p)
{
if(visited[p->adjvex]==0)
{
visited[p->adjvex]=1;
printf("%c",G.vertices[p->adjvex].data);
rear=(rear+1)%20;
Qu[rear]=p->adjvex;
}
p=p->nextarc;
}
}
}
void menu()
{
printf("*******请输入菜单选项*******\n");
printf("1 以邻接矩阵为存储结构 *\n");
printf("2 以邻接表为存储结构 *\n");
printf("0 退出系统 *\n");
}
int main()
{
printf("bbb欢迎使用无向图遍历系统ddd\n");
int flag;
while(1)
{
menu();
scanf("%d",&flag);
getchar();
switch(flag)
{
case 0:printf("正在退出,请稍后");
printf(".");
printf(".");
printf(".");
printf("bbbbbbbb欢迎下次使用dddddddd\n");
return 0;
case 1:Mgraph p;
create_UDG(p);
DFSTraverse(p);
printf("\n");
BFSTraverse(p);
printf("\n");
out_UDG(p);
printf("****************************\n");
break;
case 2:ALGraph q;
creat__UDG(q);
DFS_Traverse(q);
printf("\n");
BFS_Traverse(q);
printf("\n");
out__UDG(q);
printf("****************************\n");
}
}
}