ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:17.20KB ,
资源ID:7165070      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7165070.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(图的基本操作.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

图的基本操作.docx

1、图的基本操作#include#include#include#define MAX_VERTEX_NUM 100#define MAX 1000000000typedef struct Arcnode /邻接表除头结点以外的结点 int adjvex; struct Arcnode *nextarc; int weight;ArcNode;typedef struct Vnode /邻接表的头结点 int data; struct Arcnode *fistarc;Vnode;Vnode AdjListMAX_VERTEX_NUM; /有多个头结点,定义为数组形式了int flagMAX_VE

2、RTEX_NUM;int countMAX_VERTEX_NUM;int mapMAX_VERTEX_NUMMAX_VERTEX_NUM; /无向图邻接矩阵int map2MAX_VERTEX_NUMMAX_VERTEX_NUM; /有向图的邻接矩阵int map3MAX_VERTEX_NUMMAX_VERTEX_NUM; /“临时”的邻接矩阵int topocountMAX_VERTEX_NUM;int topoflagMAX_VERTEX_NUM;int numMAX_VERTEX_NUM; /用于存储深度优先遍历和广度优先遍历的结果int K; /表示遍历过的节点数int choose;

3、 /主菜单选择变量int Num,Number; /Num表示顶点的个数,number表示的为边的个数void Build_VAdjacencyList() /建立并初始化头结点 int i; for(i=0;iNum;i+) AdjListi.data=i+1; AdjListi.fistarc=NULL; void BuildAdjacencyList() /建立邻接表,当然,在建立邻接表的同时也建立了此图的图的有向图邻接矩阵以及无向图的邻接矩阵 int a,b,c,i,j; ArcNode *p,*s; printf(请输入图中顶点的个数:n); scanf(%d,&Num); Buil

4、d_VAdjacencyList(); for(i=0;iNum;i+) for(j=0;jNum;j+) if(i=j) mapij=0; map2ij=0; else mapij=MAX; map2ij=MAX; printf(请输入图中边的个数:n); scanf(%d,&Number); printf(请输入各条边的两个顶点以及边的权值:n); for(i=0;ic) /建立此图的有向图的邻接矩阵 map2a-1b-1=c; if(mapa-1b-1c) /这里的2个if为建立此图的无向图的邻接矩阵 mapa-1b-1=c; if(mapb-1a-1c) / mapb-1a-1=c;

5、p=AdjLista-1.fistarc; /一下是建立邻接表 if(p=NULL) s=(ArcNode *)malloc(sizeof(ArcNode); s-adjvex=b-1; s-weight=c; s-nextarc=NULL; AdjLista-1.fistarc=s; else while(p-nextarc!=NULL) p=p-nextarc; s=(ArcNode *)malloc(sizeof(ArcNode); s-adjvex=b-1; s-weight=c; s-nextarc=NULL; p-nextarc=s; void ShowAdjacencyList(

6、) /以邻接表的形式输出各顶点所连接的点 if(Num=0) printf(请先建立有向图!n); else int i; ArcNode *p; for(i=0;iadjvex+1); p=p-nextarc; printf(n); void ShowAdjacencyListDegree() /以邻接表的形式输出各顶点的度 if(Num=0) printf(请先建立有向图!n); else int i,j,sum; ArcNode *p; for(i=0;inextarc; for(j=0;jadjvex=i) sum+; p=p-nextarc; printf(顶点%d的度为:%dn,i

7、,sum); void TopologicalSortAdjacencyList() /邻接表的拓扑排序 if(Num=0) printf(请先建立有向图!n); else memset(topocount,0,sizeof(topocount); memset(topoflag,0,sizeof(topoflag); int i,sum,k=0; ArcNode *p; sum=0; while(sumNum) for(i=0;iadjvex=1; p=p-nextarc; for(i=0;iNum;i+) if(topoflagi=0) topoflagi=2; topocountsum=

8、i+1; sum+; break; if(i=Num+1) printf(此有向图有环!n); k=1; break; for(i=0;iNum;i+) if(topoflagi=1) topoflagi=0; if(k=0) for(i=0;iadjvex=0) s=s-nextarc; else flags-adjvex=0; numK=s-adjvex; K+; p=AdjLists-adjvex.fistarc; DFS(p); s=s-nextarc; void DFSAdjacencyList() /对邻接表进行深度优先遍历 if(Num=0) printf(请先建立有向图!n);

9、 else int i,k; K=0; ArcNode *p; for(i=0;iNum;i+) flagi=1; for(k=0;kNum;k+) if(flagk=1) numK=k; K+; p=AdjListk.fistarc; DFS(p); printf(深度优先遍历的顺序为:n); for(i=0;iNum;i+) printf(%d ,numi+1); printf(n); void BFSAdjacencyList() /对邻接表进行广度优先遍历 if(Num=0) printf(请先建立有向图!n); else int i,j; ArcNode *p; K=0; j=0;

10、for(i=0;iNum;i+) flagi=1; memset(count,0,sizeof(count); for(i=0;iNum;i+) if(flagi=1) flagi=0; numK=i; K+; while(jadjvex=1) numK=p-adjvex; K+; flagp-adjvex=0; p=p-nextarc; printf(广度优先遍历的顺序为:n); for(i=0;iNum;i+) printf(%d ,numi+1); printf(n); void AdjacencyListPrim() /用Prim算法对邻接矩阵求最小生成树 if(Num=0) prin

11、tf(请先建立有向图!n); else int min1,pi,i,j,ans=0; for(i=0;iNum;i+) flagi=0; counti=map0i; flag0=1; count0=0; for(i=1;iNum;i+) min1=MAX; for(j=0;jNum;j+) if(flagj=0&countjmin1) min1=countj; pi=j; if(min1=MAX) printf(图不连通!n); return; flagpi=1; for(j=0;jmappij) countj=mappij; for(i=0;iNum;i+) ans+=counti; pri

12、ntf(%dn,ans); void AdjacencyListDijkstra() /对邻接矩阵对各顶点到其他顶点的最短距离,在此用的是Dijkstra 算法 if(Num=0) printf(请先建立有向图!n); else int min1,pi,i,j,k; for(k=0;kNum;k+) memset(flag,0,sizeof(flag); memset(count,0,sizeof(count); for(i=0;iNum;i+) flagi=0; counti=map2ki; flagk=1; countk=0; for(i=1;iNum;i+) min1=MAX; for(

13、j=0;jNum;j+) if(flagj=0&countjmin1) min1=countj; pi=j; flagpi=1; for(j=0;jcountpi+map2pij) countj=countpi+map2pij; for(i=0;iNum;i+) map3ki=counti; for(i=0;iNum;i+) for(j=0;jNum;j+) if(i=j) continue; if(map3ij!=MAX) printf(顶点%d与顶点%d之间的最短距离为:%dn,i+1,j+1,map3ij); else printf(顶点%d与顶点%d之间的最短距离为:+n,i+1,j+

14、1); void ShowMenu() /菜单 printf(-n); printf(|对图的操作如下: |n); printf(-n); printf(| 1.建立有向图 ; 2.输出该临接表 |n); printf(| 3.输出个顶点的度 ; 4.进行拓扑排序 |n); printf(| 5.深度优先遍历 ; 6.广度优先遍历 |n); printf(| 7.无向图最小生成树 ; 8.有向图求最短路径 |n); printf(| 0.退出 |n); printf(-n); printf(请选择想要进行的操作:n); scanf(%d,&choose); int main() /主函数 Nu

15、m=0; Number=0; ShowMenu(); while(1) if(choose=0) break; else if(choose=1) BuildAdjacencyList(); ShowMenu(); else if(choose=2) ShowAdjacencyList(); ShowMenu(); else if(choose=3) ShowAdjacencyListDegree(); ShowMenu(); else if(choose=4) TopologicalSortAdjacencyList(); ShowMenu(); else if(choose=5) DFSAdjacencyList(); ShowMenu(); else if(choose=6) BFSAdjacencyList(); ShowMenu(); else if(choose=7) AdjacencyListPrim(); ShowMenu(); else if(choose=8) AdjacencyListDijkstra(); ShowMenu(); return 0;

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

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