首页 邻接矩阵实现无向图有向图基本操作

邻接矩阵实现无向图有向图基本操作

举报
开通vip

邻接矩阵实现无向图有向图基本操作邻接矩阵实现无向图有向图基本操作 /*/ /*以无向图为基类,有向图为派生类,以邻接矩阵为存储方式,实现无向 图,有向 图的建立,插入,删除等操作*/ /*/ #include iostream #include string using namespace std; struct _ArcInfo//边信息 { char*v1; char*v2; }; struct _VexInfo { int adj;//顶点类型,是否相邻接 }; class UnDirectGraph { publi...

邻接矩阵实现无向图有向图基本操作
邻接矩阵实现无向图有向图基本操作 /*/ /*以无向图为基类,有向图为派生类,以邻接矩阵为存储方式,实现无向 图,有向 图的建立,插入,删除等操作*/ /*/ #include iostream #include string using namespace std; struct _ArcInfo//边信息 { char*v1; char*v2; }; struct _VexInfo { int adj;//顶点类型,是否相邻接 }; class UnDirectGraph { public: int ArcNum;//边数 _ArcInfo ArcInfo; //邻接矩阵 _VexInfo AdjMax[20][20]; int VexNum;//顶点数 char*Vexs[20];//存放顶点 public: UnDirectGraph(); ~UnDirectGraph(); int LocateVex(char*Vex);//获得节点在图中序号,在邻接矩阵中使用 virtual void CreateGraph();//构造无向图 void ShowGraph();//输出邻接矩阵 void InsertVex(char*&newVex);//向无向图中插入一个新节点 virtual void InsertArc(char*&v1,char*&v2);//向无向图中插入一条边 virtual void DeleteVex(char*oldVex);//删除一个节点 virtual void DeleteArc(char*&v1,char*&v2);//删除一条边 }; class DirectGraph:public UnDirectGraph//有向图继承无向图 { public: DirectGraph(); ~DirectGraph(); 重写基类的四个 关于工期滞后的函关于工程严重滞后的函关于工程进度滞后的回复函关于征求同志党风廉政意见的函关于征求廉洁自律情况的复函 数,基类中相应函数设为虚函数 // void CreateGraph();//构造有向图 void InsertArc(char*&v1,char*&v2);//向有向图中插入一条弧 void DeleteArc(char*&v1,char*&v2);//删除有向图中一条弧 void DeleteVex(char*oldVex);//删除有向图中的一个顶点 }; UnDirectGraph:UnDirectGraph() { VexNum=0; ArcNum=0; int i; for(i=0;i 20;i++) Vexs[i]=new char; ArcInfo.v1=new char; ArcInfo.v2=new char; } UnDirectGraph:~UnDirectGraph() { } int UnDirectGraph:LocateVex(char*Vex)//获取节点vex在图中的位置 { int i; for(i=0;i VexNum;i++) { if(strcmp(Vex,Vexs[i])==0) return i; } return 0; } void UnDirectGraph:CreateGraph()//创建无向图 { cout"输入顶点数和边数:"; cin VexNum ArcNum; int i,j,k; cout"输入各个顶点:"endl; for(i=0;i VexNum;i++)//输入顶点 cin Vexs[i]; for(i=0;i VexNum;i++) { for(j=0;j VexNum;j++) AdjMax[i][j].adj=0;//邻接矩阵初始化各点不相邻 } for(k=0;k ArcNum;k++) { cout"输入边的信息:"; cin ArcInfo.v1 ArcInfo.v2; i=LocateVex(ArcInfo.v1); j=LocateVex(ArcInfo.v2); AdjMax[j][i].adj=AdjMax[i][j].adj=1;//无向图中两个顶点相邻 } } void UnDirectGraph:ShowGraph()//输出邻接矩阵 { int i,j; for(i=0;i VexNum;i++) { for(j=0;j VexNum;j++) cout""AdjMax[i][j].adj; cout endl; } } void UnDirectGraph:InsertVex(char*&newVex)//向图中插入一个节点 { Vexs[VexNum]=newVex; VexNum++; for(int i=0;i VexNum;i++) { AdjMax[i][VexNum-1].adj=AdjMax[VexNum-1][i].adj=0;//插入一个孤立 节点 } } void UnDirectGraph:InsertArc(char*&v1,char*&v2)//在图中增加一条 边 { int i,j; i=LocateVex(v1); j=LocateVex(v2); if(i 0||j 0) return; ArcNum++; AdjMax[i][j].adj=AdjMax[j][i].adj=1; } void UnDirectGraph:DeleteArc(char*&v1,char*&v2)//删除两个节点之 间的边 { int i,j; i=LocateVex(v1); j=LocateVex(v2); ArcNum--; AdjMax[i][j].adj=AdjMax[j][i].adj=0; } void UnDirectGraph:DeleteVex(char*oldVex) { int k; int k1,k2; k=LocateVex(oldVex);//待删除节点的序号 for(int i=0;i VexNum;i++) { k1=LocateVex(Vexs[i]); if(AdjMax[k][k1].adj==1)//两节点之间有边 DeleteArc(oldVex,Vexs[i]);//删除该节点与其他结点之间的边 } for(int j=k+1;j VexNum;j++) Vexs[j-1]=Vexs[j];//该节点之后的元素向前移 VexNum--; cout"删除后顶点数:"VexNum endl; cout"删除后边数:"ArcNum endl; } DirectGraph:DirectGraph()//派生类的构造函数,首先要实现基类的构 造函数 { VexNum=0; ArcNum=0; int i; for(i=0;i 20;i++) Vexs[i]=new char; ArcInfo.v1=new char; ArcInfo.v2=new char; } DirectGraph:~DirectGraph() { } void DirectGraph:CreateGraph()//创建有向图 { cout"输入有向图顶点数和弧数:"; cin VexNum ArcNum; int i,j,k; cout"输入有向图的各个顶点:"endl; for(i=0;i VexNum;i++) cin Vexs[i]; for(i=0;i VexNum;i++) { for(j=0;j VexNum;j++) AdjMax[i][j].adj=0; } for(k=0;k ArcNum;k++) { cout"输入有向图1条弧的弧头和弧尾:"endl; cin ArcInfo.v1 ArcInfo.v2; i=LocateVex(ArcInfo.v1); j=LocateVex(ArcInfo.v2); AdjMax[i][j].adj=1; } } void DirectGraph:InsertArc(char*&v1,char*&v2)//向有向图中插入一 条弧 { int i,j; i=LocateVex(v1); j=LocateVex(v2); if(i 0||j 0) return; ArcNum++; AdjMax[i][j].adj=1; } void DirectGraph:DeleteArc(char*&v1,char*&v2)//删除有向图中的一 条弧 { int i,j; i=LocateVex(v1); j=LocateVex(v2); ArcNum--; AdjMax[i][j].adj=0; } void DirectGraph:DeleteVex(char*oldVex)//删除有向图中的一个顶点 { int k,k1; k=LocateVex(oldVex); for(int i=0;i VexNum;i++) { k1=LocateVex(Vexs[i]);// if(AdjMax[k][k1].adj==1)//要删除结点为弧头的弧 DeleteArc(oldVex,Vexs[i]); if(AdjMax[k1][k].adj==1)//要删除结点为弧尾的弧 DeleteArc(Vexs[i],oldVex); } j VexNum;j++) for(int j=k+1; Vexs[j-1]=Vexs[j]; VexNum--; cout"删除后结点数:"VexNum endl; cout"删除后弧数:"ArcNum endl; } int main() { cout"无向图操作"endl; UnDirectGraph UDG=UnDirectGraph(); UDG.CreateGraph(); cout"图的邻接矩阵:"endl; UDG.ShowGraph(); char*newVex=new char; cout"插入一个新节点:"endl; cin newVex; UDG.InsertVex(newVex); cout"插入新增加的边:"endl; for(int i=0;i UDG.VexNum-1;i++) UDG.InsertArc(newVex,UDG.Vexs[i]);cout"新图的邻接矩阵:"endl; UDG.ShowGraph(); cout"删除一个节点"endl; UDG.DeleteVex(UDG.Vexs[3]); UDG.ShowGraph(); cout"有向图操作"endl; DirectGraph DG=DirectGraph(); DG.CreateGraph(); cout"有向图的邻接矩阵:"endl; DG.ShowGraph(); cout"向有向图中插入一个节点:"endl; char*newVex1=new char; cin newVex1; DG.InsertVex(newVex1); DG.InsertArc(newVex1,DG.Vexs[0]);//向有向图中插入几条弧 DG.InsertArc(DG.Vexs[2],newVex1); DG.InsertArc(DG.Vexs[1],newVex1); DG.ShowGraph(); 删除有向图中的一个节点"endl; cout" DG.DeleteVex(DG.Vexs[3]); DG.ShowGraph(); return 0; }
本文档为【邻接矩阵实现无向图有向图基本操作】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_348501
暂无简介~
格式:doc
大小:25KB
软件:Word
页数:10
分类:生活休闲
上传时间:2017-10-08
浏览量:114