图的应用程序.docx

上传人:b****7 文档编号:23358846 上传时间:2023-05-16 格式:DOCX 页数:26 大小:16.37KB
下载 相关 举报
图的应用程序.docx_第1页
第1页 / 共26页
图的应用程序.docx_第2页
第2页 / 共26页
图的应用程序.docx_第3页
第3页 / 共26页
图的应用程序.docx_第4页
第4页 / 共26页
图的应用程序.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

图的应用程序.docx

《图的应用程序.docx》由会员分享,可在线阅读,更多相关《图的应用程序.docx(26页珍藏版)》请在冰豆网上搜索。

图的应用程序.docx

图的应用程序

#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);

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 互联网

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1