数据结构题集答案第章图.docx
《数据结构题集答案第章图.docx》由会员分享,可在线阅读,更多相关《数据结构题集答案第章图.docx(58页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第七章 图 7.14 Status Build_AdjList(ALGraph &G)/输入有向图的顶点数,边数,顶点信息与边的信息建立邻接表InitALGraph(G);scanf(%d,&v);if(v0) return ERROR; /顶点数不能为负G.vexnum=v;scanf(%d,&a);if(a0) return ERROR; /边数不能为负G.arcnum=a;for(m=0;mv;m+)G.verticesm.data=getchar(); /输入各顶点的符号for(m=1;m=a;m+)t=getchar();h=getchar(); /t为弧尾,h为弧头if(i=Loc
2、ateVex(G,t)0) return ERROR;if(j=LocateVex(G,h)nextarc;q=q-nextarc);q-nextarc=p;p-adjvex=j;p-nextarc=NULL;/whilereturn OK;/Build_AdjList 7.15 /本题中的图G均为有向无权图,其余状况简洁由此写出Status Insert_Vex(MGraph &G, char v)/在邻接矩阵表示的图G上插入顶点vif(G.vexnum+1)MAX_VERTEX_NUM return INFEASIBLE;G.vexs+G.vexnum=v;return OK;/Inser
3、t_Vex Status Insert_Arc(MGraph &G,char v,char w)/在邻接矩阵表示的图G上插入边(v,w)if(i=LocateVex(G,v)0) return ERROR;if(j=LocateVex(G,w)0) return ERROR;if(i=j) return ERROR;if(!G.arcsij.adj)G.arcsij.adj=1;G.arcnum+;return OK;/Insert_Arc Status Delete_Vex(MGraph &G,char v)/在邻接矩阵表示的图G上删除顶点vn=G.vexnum;if(m=LocateVex
4、(G,v)0) return ERROR;G.vexsmG.vexsn; /将待删除顶点交换到最终一个顶点for(i=0;in;i+)G.arcsim=G.arcsin;G.arcsmi=G.arcsni; /将边的关系随之交换G.arcsmm.adj=0;G.vexnum-;return OK;/Delete_Vex分析:假如不把待删除顶点交换到最终一个顶点的话,算法将会比较困难,而伴随着大量元素的移动,时间困难度也会大大增加. Status Delete_Arc(MGraph &G,char v,char w)/在邻接矩阵表示的图G上删除边(v,w)if(i=LocateVex(G,v)0
5、) return ERROR;if(j=LocateVex(G,w)0) return ERROR;if(G.arcsij.adj)G.arcsij.adj=0;G.arcnum-;return OK;/Delete_Arc 7.16 /为节约篇幅,本题只给出Insert_Arc算法.其余算法请自行写出. Status Insert_Arc(ALGraph &G,char v,char w)/在邻接表表示的图G上插入边(v,w)if(i=LocateVex(G,v)0) return ERROR;if(j=LocateVex(G,w)adjvex=j;p-nextarc=NULL;if(!G.
6、verticesi.firstarc) G.verticesi.firstarc=p;elsefor(q=G.verticesi.firstarc;q-q-nextarc;q=q-nextarc)if(q-adjvex=j) return ERROR; /边已经存在q-nextarc=p;G.arcnum+;return OK;/Insert_Arc 7.17 /为节约篇幅,本题只给出较为困难的Delete_Vex算法.其余算法请自行写出. Status Delete_Vex(OLGraph &G,char v)/在十字链表表示的图G上删除顶点vif(m=LocateVex(G,v)0) re
7、turn ERROR;n=G.vexnum;for(i=0;itailvex=m) /假如待删除的边是头链上的第一个结点q=G.xlisti.firstin;G.xlisti.firstin=q-hlink;free(q);G.arcnum-;else /否则for(p=G.xlisti.firstin;p&p-hlink-tailvex!=m;p=p-hlink);if(p)q=p-hlink;p-hlink=q-hlink;free(q);G.arcnum-;/else/forfor(i=0;iheadvex=m) /假如待删除的边是尾链上的第一个结点q=G.xlisti.firstout
8、;G.xlisti.firstout=q-tlink;free(q);G.arcnum-;else /否则for(p=G.xlisti.firstout;p&p-tlink-headvex!=m;p=p-tlink);if(p)q=p-tlink;p-tlink=q-tlink;free(q);G.arcnum-;/else/forfor(i=m;ihlink)p-headvex-;for(p=G.xlisti.firstout;p;p=p-tlink)p-tailvex-; /修改各链中的顶点序号G.vexnum-;return OK;/Delete_Vex 7.18 /为节约篇幅,本题只给
9、出Delete_Arc算法.其余算法请自行写出. Status Delete_Arc(AMLGraph &G,char v,char w)/在邻接多重表表示的图G上删除边(v,w)if(i=LocateVex(G,v)0) return ERROR;if(j=LocateVex(G,w)jvex=j)G.adjmulisti.firstedge=G.adjmulisti.firstedge-ilink;elsefor(p=G.adjmulisti.firstedge;p&p-ilink-jvex!=j;p=p-ilink);if (!p) return ERROR; /未找到p-ilink=p
10、-ilink-ilink; /在i链表中删除该边if(G.adjmulistj.firstedge-ivex=i)G.adjmulistj.firstedge=G.adjmulistj.firstedge-jlink;elsefor(p=G.adjmulistj.firstedge;p&p-jlink-ivex!=i;p=p-jlink);if (!p) return ERROR; /未找到q=p-jlink;p-jlink=q-jlink;free(q); /在i链表中删除该边G.arcnum-;return OK;/Delete_Arc 7.19 Status Build_AdjMulis
11、t(AMLGraph &G)/输入有向图的顶点数,边数,顶点信息与边的信息建立邻接多重表InitAMLGraph(G);scanf(%d,&v);if(v0) return ERROR; /顶点数不能为负G.vexnum=v;scanf(%d,&a);if(a0) return ERROR; /边数不能为负G.arcnum=a;for(m=0;mv;m+)G.adjmulistm.data=getchar(); /输入各顶点的符号for(m=1;m=a;m+)t=getchar();h=getchar(); /t为弧尾,h为弧头if(i=LocateVex(G,t)0) return ERRO
12、R;if(j=LocateVex(G,h)ivex=i;p-jvex=j;p-ilink=NULL;p-jlink=NULL; /边结点赋初值if(!G.adjmulisti.firstedge) G.adjmulisti.firstedge=p;elseq=G.adjmulisti.firstedge;while(q)r=q;if(q-ivex=i) q=q-ilink;else q=q-jlink;if(r-ivex=i) r-ilink=p;/留意i值既可能出现在边结点的ivex域中,else r-jlink=p; /又可能出现在边结点的jvex域中/else /插入i链表尾部if(!G
13、.adjmulistj.firstedge) G.adjmulistj.firstedge=p;elseq=G.adjmulisti.firstedge;while(q)r=q;if(q-jvex=j) q=q-jlink;else q=q-ilnk;if(r-jvex=j) r-jlink=p;else r-ilink=p;/else /插入j链表尾部/forreturn OK;/Build_AdjList 7.20 int Pass_MGraph(MGraph G)/推断一个邻接矩阵存储的有向图是不是可传递的,是则返回1,否则返回0for(x=0;xG.vexnum;x+)for(y=0;
14、yG.vexnum;y+)if(G.arcsxy)for(z=0;zG.vexnum;z+)if(z!=x&G.arcsyz&!G.arcsxz) return 0;/图不行传递的条件/ifreturn 1;/Pass_MGraph分析:本算法的时间困难度也许是O(n2*d). 7.21 int Pass_ALGraph(ALGraph G)/推断一个邻接表存储的有向图是不是可传递的,是则返回1,否则返回0for(x=0;xnextarc)y=p-adjvex;for(q=G.verticesy.firstarc;q;q=q-nextarc)z=q-adjvex;if(z!=x&!is_adj
15、(G,x,z) return 0;/for/for/Pass_ALGraph int is_adj(ALGraph G,int m,int n)/推断有向图G中是否存在边(m,n),是则返回1,否则返回0for(p=G.verticesm.firstarc;p;p=p-nextarc)if(p-adjvex=n) return 1;return 0;/is_adj 7.22 int visitedMAXSIZE; /指示顶点是否在当前路径上 int exist_path_DFS(ALGraph G,int i,int j)/深度优先推断有向图G中顶点i到顶点j是否有路径,是则返回1,否则返回0
16、if(i=j) return 1; /i就是jelsevisitedi=1;for(p=G.verticesi.firstarc;p;p=p-nextarc)k=p-adjvex;if(!visitedk&exist_path(k,j) return 1;/i下游的顶点到j有路径/for/else/exist_path_DFS 7.23 int exist_path_BFS(ALGraph G,int i,int j)/广度优先推断有向图G中顶点i到顶点j是否有路径,是则返回1,否则返回0int visitedMAXSIZE;InitQueue(Q);EnQueue(Q,i);while(!Q
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 答案 第章图
限制150内