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