1、5.查找结点v的w邻接结点的下一个邻接结点w,转到步骤3。(4)图的广度优先遍历:采取邻接矩阵结构,指定任意顶点x为初始顶点,利用顺序循环队列以保持访问过的结点的顺序1.首先访问初始结点v并标记结点v为已访问;2.结点v入队列;3.当队列非空时则继续执行,否则算法结束;4.出队列取得队头结点u;5.查找u的第一个邻接结点w;6.若u的邻接结点w不存在则转到步骤3,否则循环执行下列步骤:6.1若结点w尚未被访问,则访问结点w并标记结点w为已访问;6.2结点w入队列;6.3查找结点u的w邻接结点的下一个邻接结点w,转到步骤6 。(5)判断有向图的强连通性:采取邻接表结构,在图中寻找一个包含所有顶点
2、且首尾相连的环,若这样的环存在,则该图为强连通图,否则不为强连通图。(6)用邻接矩阵的信息生成邻接表:定义一个邻接表的边信息结构体,将邻接矩阵的边信息转换成邻接表的边信息存储到邻接边的单链表中。5.模块划分:mian():主函数模块。在主函数模块中调用以下函数:(1)void CreatGraph(AdjMGraph *G,DataType v,int n,RowColWeight E,int e):创建一个邻接矩阵存储结构的图;(2)void Print(AdjMGraph *G):输出图的邻接矩阵;(3)void MVertices(AdjMGraph *G,DataType a):求出邻
3、接矩阵存储结构下图的每个顶点的度;(4)void CreatLGraph(AdjLGraph *G,DataType v,int n,RowCol d,int e):用邻接矩阵的信息生成邻接表;(5)void LVertices(AdjLGraph *G,DataType a):求出邻接表存储结构下图的每个顶点的度;(6)int LianTong(AdjLGraph *G,DataType a):判断有向图的强连通性;(7)void DepthFirstSearch(AdjMGraph G,void Visit(DataType item):对图作DFS遍历,输出DFS顶点序列;(8)void
4、 BroadFirstSearch(AdjMGraph G,void Visit(DataType item):对图作BFS遍历,输出BFS顶点序列;(9)int ChaZhao(AdjMGraph *G,int v):查找顶点v;(10)void MDelete(AdjMGraph *G,int v):删除查找到的结点v并删除该结点及与之相关的边;6.数据结构:(1)有向图顶点的数据类型DataType 定义如下: typedef int DataType ;(2)邻接矩阵存储结构下图的结构体定义如下:typedef struct SeqList Vertices; /存放结点的顺序表 in
5、t edgeMaxVerticesMaxVertices; /存放边的邻接矩阵 int numOfEdges; /边的条数AdjMGraph; /边的结构体定义(3)邻接矩阵存储结构下图的边信息结构体定义如下: int row; /行下标 int col; /列下标 int weight; /权值RowColWeight; /边信息结构体定义(4)邻接表存储结构下图的结构体定义如下:typedef struct Node int dest; /邻接边的弧头结点序号 struct Node *next;Edge; /邻接边单链表的结点结构体 DataType data; /结点数据元素 int
6、sorce; /邻接边的弧尾结点序号 Edge *adj; /邻接边的头指针AdjLHeight; /数组的数据元素类型结构体 AdjLHeight aMaxVertices; /邻接表数组 int numOfVerts; /结点个数 /边个数AdjLGraph; /邻接表结构体(5)邻接表存储结构下图的边信息结构体定义如下:RowCol;(6)顺序循环队列的结构体定义如下:typedef struct DataType queueMaxQueueSize; int rear; int front; int count;SeqCQueue;(7)顺序表的结构体定义如下: DataType li
7、stMaxSize; int size;SeqList;7.功能模块图:8.源程序:源程序存放在八个文件夹中,文件SeqList.h是顺序表的结构体定义和操作函数,文件SeqCQueue.h是顺序循环队列的结构体定义和操作函数,文件AdjMGraph.h是邻接矩阵存储结构下图的结构体定义和操作函数,文件AdjMGraphCreate.h是邻接矩阵存储结构下图的创建函数,文件AdjLGraph.h是邻接表存储结构下图的结构体定义和操作函数,文件AdjLGraphCreate.h是邻接表存储结构下图的创建函数,文件AdjMGraphTraverse.h是邻接矩阵存储结构下图的深度优先遍历和广度优先
8、遍历操作函数,文件图的基本操作与实现.c是主函数。(1)/* 文件SeqList.h */ DataType listMaxSize; int size;SeqList;void ListInitiate(SeqList *L) L-size=0;int ListLength(SeqList L) return L.size;int ListInsert(SeqList *L,int i,DataType x) int j; if(L-size=MaxSize) printf(数组已满无法插入!n); return 0; else if(iL-size)参数不合法! else for(j=L-
9、size;ji;i-)L-listj=L-listj-1; L-listi=x;size+; return 1;int ListDelete(SeqList *L,int i,DataType *x)sizelisti; for(j=i+1;jsize-1;j+)L-listj-1=L-listj;size-;int ListGet(SeqList L,int i,DataType *x) if(irear=0;front =0;count =0;int QueueNotEmpty(SeqCQueue Q) if(Q.count !=0) return 1; else return 0;int
10、 QueueAppend(SeqCQueue *Q,DataType x) if(Q-count0&Q-rear=Q-front)队列已满无法插入! else Q-queue Q-rear=x;rear =(Q-rear +1)%MaxQueueSize;count +;int QueueDelete(SeqCQueue *Q,DataType *d)count =0)队列已空无数据出队列! *d=Q-queueQ-front;front=(Q-front+1)%MaxQueueSize;count -;int QueueGet(SeqCQueue Q,DataType*d) if(Q.cou
11、nt =0) *d=Q.queue Q.front ;(3)/* 文件AdjMGraph.h*/#includeSeqList.h SeqList Vertices; int edgeMaxVerticesMaxVertices; int numOfEdges;AdjMGraph;void Initiate(AdjMGraph *G,int n) /初始化 int i,j; for(i=0;iedgeij=0; elseedgeij=MaxWeight; G-numOfEdges=0; /边的条数置为0 ListInitiate(&G-Vertices); /顺序表初始化void Insert
12、Vertex(AdjMGraph *G,DataType vertex) /在图G中插入结点vertex ListInsert(&Vertices,G-Vertices.size,vertex); /顺序表尾插入void InsertEdge(AdjMGraph *G,int v1,int v2,int weight)/在图G中插入边,边的权为weight if(v1Vertices.size|v2Vertices.size)参数v1或v2越界出错! exit(1); G-edgev1v2=weight;numOfEdges+;void DeleteEdge(AdjMGraph *G,int
13、v1,int v2) /在图中删除边edgev1v2=MaxWeight|v1=v2)该边不存在! exit(0);edgev1v2=MaxWeight;numOfEdges-;void DeleteVerten(AdjMGraph *G,int v) /删除结点v int n=ListLength(G-Vertices),i,j; DataType x;i+) /计算删除后的边数 if(i=v|j=v)&edgeijedgeijedgeij=G-edgei+1j;i+) /删除第v列 for(j=v;edgeij+1; ListDelete(&Vertices,v,&x); /删除结点vin
14、t GetFistVex(AdjMGraph *G,int v) /在图G中寻找序号为v的结点的第一个邻接结点/如果这样的邻接结点存在,返回该邻接结点的序号;否则,返回-1 int col; if(v参数v1越界出错! for(col=0;coledgevcoledgevcoledgev1coledgev1coledgeij);/邻接矩阵存储结构下求出每个顶点的度并输出void MVertices(AdjMGraph *G,DataType a) int i,j,m; DataType bMaxVertices;/用数组b记录相应结点的度 bi=0; /置0 printf(邻接矩阵存储结构下图
15、的顶点的度为: for(m=0;mm+) /求出每个结点的度 for(i=0; for(j=0; if(i=m& /求出邻接矩阵第i行权值存在的边的个数,当边存在时,bm加1 bm+; if(j=m&i!=m& /求出邻接矩阵第j列权值存在的边的个数,当边存在时,bm加1 顶点%d的度为:%dn,am,bm);/查找图G中是否存在点vint ChaZhao(AdjMGraph *G,int v) if(0=v&vedgevi /当邻接矩阵的第v行有边存在时,删除边edgeiv /当邻接矩阵的第j行有边 DeleteEdge(G,i,v); DeleteVerten(G,v);/删除结点v(4)
16、/* 文件AdjMGraphCreate.h */ int row; int weight;RowColWeight;void CreatGraph(AdjMGraph *G,DataType v,int n,RowColWeight E,int e)/在图G中插入n个结点信息v和e条边信息E int i,k; Initiate(G,n); /结点顺序表初始化 InsertVertex(G,vi); /结点插入 for(k=0;ke;k+) InsertEdge(G,Ek.row,Ek.col,Ek.weight); /边插入(5)/* 文件AdjLGraph.h */邻接表的存储结构 int dest; struct Node *next;Edge; DataType data; int sorce; Edge *adj;AdjLHeight; AdjLHeight aMaxVertices; int numOfVerts;AdjLGraph;/初始化操作函数void LAdjInitiate(AdjLGraph *G)numOfVerts=0;MaxVertices;ai.sorce=i;ai.adj=NULL;/撤销操作函数void LAdjDestroy(AdjLGraph *G)/撤销图G中的所有邻接边单链表 Edge *p,*q;num
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1