图的邻接矩阵和邻接表相互转换.docx
- 文档编号:857646
- 上传时间:2022-10-13
- 格式:DOCX
- 页数:7
- 大小:22.21KB
图的邻接矩阵和邻接表相互转换.docx
《图的邻接矩阵和邻接表相互转换.docx》由会员分享,可在线阅读,更多相关《图的邻接矩阵和邻接表相互转换.docx(7页珍藏版)》请在冰豆网上搜索。
图的邻接矩阵和邻接表相互转换
图的邻接矩阵和邻接表相互转换
图的邻接矩阵存储方法具有如下几个特征:
1)无向图的邻接矩阵一定是一个对称矩阵。
2)对于无向图的邻接矩阵的第i行非零元素的个数正好是第i个顶点的度。
3)对于有向图,邻接矩阵的第i行非零元素的个数正好是第i个顶点的出度(或入度)。
4)用邻接矩阵方法存储图,很容易确定图中任意两个顶点之间是否有边相连;但是,要确定图中有多少条边,则必须按行、按列对每个元素进行检测,所发费得时间代价大。
邻接表是图的一种顺序存储与链式存储相结合的存储方法。
若无向图中有n个顶点、e条边,则它的邻接表需n个头结点和2e个表结点。
显然,在边稀疏的情况下,用邻接表表示图比邻接矩阵存储空间。
在无向图的邻接表中,顶点的度恰好是第i个链表中的结点数,而在有向图中,第i个链表中结点个数是顶点的出度。
在建立邻接表或邻逆接表时,若输入的顶点信息即为顶点的编号,则建立临接表的时间复杂度是;否则,需要通过查找才能得到顶点在图中位置,则时间复杂度为。
在邻接表上容易找到任意一顶点的第一个邻接点和下一个邻接点,但要判断任意两个顶点之间是否有边或弧,则需要搜索第i个或第j个链表,因此,不及邻接矩阵方便。
邻接矩阵和邻接表相互转换程序代码如下:
#include
#defineMAX20
//图的邻接表存储表示
typedefstructArcNode{
intadjvex;//弧的邻接定点
charinfo;//邻接点值
structArcNode*nextarc;//指向下一条弧的指针
}ArcNode;
typedefstructVnode{//节点信息
chardata;
ArcNode*link;
}Vnode,AdjList[MAX];
typedefstruct{
AdjListvertices;
intvexnum;//节点数
intarcnum;//边数
}ALGraph;
//图的邻接矩阵存储表示
typedefstruct{
intn;//顶点个数
charvexs[MAX];//定点信息
intarcs[MAX][MAX];//边信息矩阵
}AdjMatrix;
/***_____________________________________________________***/
//函数名:
AdjListToMatrix(AdjListg1,AdjListMatrix&gm,intn)
//参数:
(传入)AdjListg1图的邻接表,(传入)intn顶点个数,(传出)AdjMatrixgm图的邻接矩阵
//功能:
把图的邻接表表示转换成图的邻接矩阵表示
voidAdjListToAdjMatrix(ALGraphgl,AdjMatrix&gm){
inti,j,k;
ArcNode*p;
gm.n=gl.vexnum;
for(k=0;k gm.vexs[k]=gl.vertices[k].data; for(i=0;i for(j=0;j gm.arcs[i][j]=0; for(i=0;i p=gl.vertices[i].link;//取第一个邻接顶点 while(p! =NULL){//取下一个邻接顶点 gm.arcs[i][p->adjvex]=1; p=p->nextarc; } } } /***________________________________________________***/ //函数名: AdjMatrixToAdjList voidAdjMatrixToAdjList(AdjMatrixgm,ALGraph&gl){ inti,j,k,choice; ArcNode*p; k=0; gl.vexnum=gm.n; cout<<"请选择所建立的图形是无向图或是有向图: "; cin>>choice; for(i=0;i gl.vertices[i].data=gm.vexs[i]; gl.vertices[i].link=NULL; } for(i=0;i for(j=0;j if(gm.arcs[i][j]==1){ k++;p=newArcNode; p->adjvex=j;p->info=gm.vexs[j];p->nextarc=gl.vertices[i].link; gl.vertices[i].link=p; } if(choice==1) k=k/2; gl.arcnum=k; } voidCreateAdjList(ALGraph&G){ inti,s,d,choice; ArcNode*p; cout<<"请选择所建立的图形是有向图或是无向图: "; cin>>choice; cout<<"请输入节点数和边数: "< cin>>G.vexnum>>G.arcnum; for(i=0;i cout<<"第"< "; cin>>G.vertices[i].data; G.vertices[i].link=NULL; } if(choice==1){ for(i=0;i<2*(G.vexnum);i++){ cout<<"边----起点序号,终点序号: "; cin>>s>>d; p=newArcNode; p->adjvex=d; p->info=G.vertices[d].data; p->nextarc=G.vertices[s].link; G.vertices[s].link=p; } } else{ for(i=0;i cout<<"边----起点序号,终点序号: "; cin>>s>>d; p=newArcNode; p->adjvex=d; p->info=G.vertices[d].data; p->nextarc=G.vertices[s].link; G.vertices[s].link=p; } } } voidCreateAdjMatrix(AdjMatrix&M){ inti,j,k,choice; cout<<"请输入顶点个数: "; cin>>M.n; cout<<"请输入如顶点信息: "< for(k=0;k cin>>M.vexs[k]; cout<<"请选择所建立的图形是无向图或是有向图: "; cin>>choice; cout<<"请输入边信息: "< for(i=0;i for(j=0;j M.arcs[i][j]=0; switch(choice){ case1: {for(k=0;k cin>>i>>j;M.arcs[i][j]=M.arcs[j][i]=1; } };break; case2: {for(k=0;k cin>>i>>j;M.arcs[i][j]=1; } };break; } } voidOutPutAdjList(ALGraph&G){ inti;ArcNode*p; cout<<"图的邻接表如下: "< for(i=0;i cout< p=G.vertices[i].link; while(p! =NULL){ cout<<"---->("< p=p->nextarc; } cout< } } voidOutPutAdjMatrix(AdjMatrixgm){ cout<<"图的邻接矩阵如下: "< for(inti=0;i for(intj=0;j cout< cout< } } voidmain(){ ALGraphgl1,gl2; AdjMatrixgm1,gm2; CreateAdjList(gl1); AdjListToAdjMatrix(gl1,gm1); OutPutAdjList(gl1);OutPutAdjMatrix(gm1); CreateAdjMatrix(gm2); AdjMatrixToAdjList(gm2,gl2); OutPutAdjList(gl2);OutPutAdjMatrix(gm2); } WelcomeTo Download! ! ! 欢迎您的下载,资料仅供参考!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 邻接矩阵 邻接 相互 转换
![提示](https://static.bdocx.com/images/bang_tan.gif)