图的应用程序.docx
《图的应用程序.docx》由会员分享,可在线阅读,更多相关《图的应用程序.docx(26页珍藏版)》请在冰豆网上搜索。
图的应用程序
#include
#include
#include
#defineMAXV100
typedefcharElemType;
typedefstructANode
/*
弧的结点结构类型
*/
{
intadjvex;/*
该弧的终点位置
*/
structANode*nextarc;
/*
指向下一条弧的指针
*/
}ArcNode;
typedefstructVnode/*
邻接表头结点的类型
*/
{
ElemTypedata;
/*
顶点信息
*/
ArcNode*firstarc;
/*
指向第一条弧
*/
}VNode;
typedefVNodeAdjList[MAXV];
/*AdjList
是邻接表类型
*/
typedefstruct
{
AdjListadjlist;
/*
邻接表
*/
intn,e;
/*
图中顶点数
n
和边数
e*/
}ALGraph;
/*
图的类型
*/
typedefstruct
{
intno;
/*
顶点编号
*/
ElemTypedata;
/*
顶点其他信息
*/
}VertexType;
/*
顶点类型
*/
typedefstruct
/*
图的定义
*/
{
intedges[MAXV][MAXV];
/*
邻接矩阵
*/
intvexnum,arcnum;
/*
顶点数
弧数
*/
VertexTypevexs[MAXV];
/*
存放顶点信息
*/
}MGraph;
voidjiemian()
//界面函数
{printf("***无向图的建立及其应用***\n");
printf("--------------------------\n");
printf("*1.邻接矩阵建图\n");
printf("*2.邻接表建图\n");
printf("*3.邻接表图的广度遍历\n");
printf("--------------------------\n");
printf("温馨提示:
为了让您使用愉快,请按提示操作!
\n");
printf("请选择:
");
}
voidshuchu1(MGraph*m)
//输出邻接矩阵
{
inti,j;
printf("邻接矩阵为:
\n");
for(i=0;ivexnum;i++)
{
for(j=0;jvexnum;j++)
{
printf("%d",m->edges[i][j]);
}
if(j=m->vexnum)
//换行判断
printf("\n");
}
}
voidcreategraph1()
//创建邻接矩阵
{
inti,j,a,b;
MGraph*m;
m=(MGraph*)malloc(sizeof(MGraph));
printf("这里是用邻接矩阵建图:
\n");
printf("请输入图的顶点数:
\n");
scanf("%d",&m->vexnum);
for(i=0;ivexnum;i++)
//邻接矩阵置零
{
for(j=0;jvexnum;j++)
{
m->edges[i][j]=0;
}
}
for(i=1;i<=m->vexnum;i++)
//输入顶点
{
printf("请输入第%d个顶点:
\n",i);
scanf("%c",&m->vexs[i-1].data);
getchar();
m->vexs[i].no=i;
}
printf("\n");
printf("请输入图的边数:
\n");
//输入边
scanf("%d",&m->arcnum);
printf("请输入边相连的两个顶点,逗号隔开,例如:
a->b,输入为:
1,2\n");
for(j=1;j<=m->arcnum;j++)
{
printf("请输入第%d条边相连的两个顶点:
\n",m->vexs[j].no);
scanf("%d,%d",&a,&b);
m->edges[a-1][b-1]=1;
}
system("CLS");
shuchu1(m);
}
voidshuchu2(ALGraph*a)
//输出邻接表
{
inti,j;
ArcNode*q;
printf("这是所建立的图:
\n");
for(i=0;in;i++)
{
printf("%c",a->adjlist[i].data);
printf("-->");
q=a->adjlist[i].firstarc;
for(j=0;jn;j++)
{
if(q==NULL)
{
printf("^\n");
break;
}
printf("%d",q->adjvex);
printf("-->");
q=q->nextarc;
}
}
}
voidcreategraph2(ALGraph*a)
//创建邻接表
{
inti,j,c,d;
ArcNode*p;
a->n=a->e=0;
printf("这是用邻接表建图:
\n");
printf("请输入图的顶点数:
\n");
scanf("%d",&a->n);
for(i=0;in;i++)
//置空
{
a->adjlist[i].firstarc=NULL;
}
for(i=1;i<=a->n;i++)
//输入顶点
{
printf("请输入第%d个顶点\n",i);
getchar();
scanf("%c",&a->adjlist[i-1].data);
}
printf("\n");
printf("请输入图的边数:
\n");
//输入边
scanf("%d",&a->e);
printf("请输入各条边相连的两个顶点,例如:
a->b,a为第一个顶点,b为第二个;输入:
1,2\n");
for(j=1;j<=a->e;j++)
{
printf("请输入第%d条边相连的两个顶点:
\n",j);
scanf("%d,%d",&c,&d);
if(c<1||d<1||c>a->n||d>a->n)
{
printf("输入有误!
\n");
continue;
}
p=(ArcNode*)malloc(sizeof(ArcNode));
//a到b
p->adjvex=d-1;
p->nextarc=a->adjlist[c-1].firstarc;
a->adjlist[c-1].firstarc=p;
p=(ArcNode*)malloc(sizeof(ArcNode));
//b到a
p->adjvex=c-1;
p->nextarc=a->adjlist[d-1].firstarc;
a->adjlist[d-1].firstarc=p;
}
system("CLS");
shuchu2(a);
//调用输出
}
intFLAG()
//判断是否返回主菜单
{
ints;
printf("返回主菜单按1,退出按0:
\n");
printf("请选择:
\n");
scanf("%d",&s);
system("CLS");
returns;
}
voidguangdu(ALGraph*a,intv)
//广度遍历
{
ArcNode*p;
intqueue[MAXV];
intvisited[MAXV];
intf=0,r=0,x,i;
for(i=0;in;i++)
{
visited[i]=0;
}
printf("%c",a->adjlist[v-1].data);
visited[v-1]=1;
r=(r+1)%MAXV;
queue[r]=v;
while(f!
=r)
{
f=(f+1)%MAXV;
x=queue[f];
p=a->adjlist[x].firstarc;
while(p!
=NULL)
{
if(visited[p->adjvex]==0)
{
visited[p->adjvex]=1;
printf("%c",a->adjlist[p->adjvex].data);
r=(r+1)%MAXV;
queue[r]=p->adjvex;
}
p=p->nextarc;
}
}
printf("\n");
getch();
system("CLS");
}
voidmain()
{
intflag=1,c,v,i;
ALGraph*a;
a=(ALGraph*)malloc(sizeof(ALGraph));
while(flag)
{
jiemian();
//选择界面
scanf("%d",&c);
getchar();
switch(c)
{
case1:
creategraph1();
//邻接矩阵
flag=FLAG();
break;
case2:
creategraph2(a);
//邻接表
flag=FLAG();
break;
case3:
printf("这里是图的广度遍历:
\n");
printf("请输入遍历的起始顶点序号:
\n");
scanf("%d",&v);
guangdu(a,v);
break;
default:
flag=0;
break;
}
if(flag==0)
{
printf("您已经成功退出!
下次再会!
\n");
exit(0);
}
}
}