图的邻接矩阵表示及插入删除等操作
2017-05-19 16:41
309 查看
// graphmtx.h #pragma once #include<iostream> using namespace std; #define DEFAULT_VERTICES_SIZE 10 //默认最大顶点数 template< class T,class E> class GraphMtx { public: GraphMtx( int sz=DEFAULT_VERTICES_SIZE) { MaxVertices=sz>DEFAULT_VERTICES_SIZE ? sz : DEFAULT_VERTICES_SIZE; VerticesList=new T[MaxVertices]; for(int i=0;i<MaxVertices;++i) { VerticesList[i]='#'; } Edge=new E*[MaxVertices]; //开辟数组空间 for(int i=0;i<MaxVertices;++i) { Edge[i]=new E[MaxVertices]; } for(int i=0;i<MaxVertices;++i) { for(int j=0;j<MaxVertices;++j) { Edge[i][j]=0; //边为0 } } numVertices=numEdges=0; //初始化一个空图 } public: bool InsertVertex(T v) //插入顶点 { if(numVertices>=MaxVertices) return false; VerticesList[numVertices++]=v; return true; } bool InsertEdge(T vertex1,T vertex2) //插入边 { int v1=getPosVertex(vertex1); int v2=getPosVertex(vertex2); if(v1==-1||v2==-1) return false; Edge[v1][v2]=Edge[v2][v1]=1; numEdges++; //边的个数增加 return true; } void ShowGraph()const { cout<<" "; for(int i=0;i<numVertices;++i) cout<<VerticesList[i]<<" "; cout<<endl; for(int i=0;i<numVertices;++i) { cout<<VerticesList[i]<<" "; for(int j=0;j<numVertices;++j) { cout<<Edge[i][j]<<" "; } cout<<endl; } } int getPosVertex(T vertex)const //获取顶点所在位置 { for(int i=0;i<numVertices;++i) { if(VerticesList[i]==vertex) return i; } return -1; } public: int NumberOfVertex()const //返回当前顶点的个数 { return numVertices; } int NumberOfEdge()const //返回当前边数 { return numEdges; } private: int MaxVertices; //最大顶点个数 int numVertices; //当前顶点个数 int numEdges; //当前边的个数 T *VerticesList; //顶点的存储空间 E **Edge; //边的存储空间 public: int getFirstNeighber(T v)const; //获取邻接顶点 int getNextNeighber(T v1,T v2)const; //获取下一个邻接顶点 bool RemoveVertex(T vertex) //删去顶点vertex和所有与它相关联的边 { int v=getPosVertex(vertex); if(v < 0 ||v >= numVertices) //v不在图中时,不删除 return false; if(numVertices == 1) //只剩一个顶点 不删除 return false; int i,j; VerticesList[v] = VerticesList[numVertices-1]; //顶点表中删除该结点 for(i = 0;i<numVertices;i++) //减去与v相关联边数 if(Edge[i][v]==1) numEdges--; for(i = 0;i<numVertices;i++) //用最后一列填补第v列 Edge[i][v] = Edge[i][numVertices-1]; numVertices--; //顶点数减1 for(j = 0;j<numVertices;j++) Edge[v][j] = Edge[numVertices][j]; //用最后一行填补第v行 return true; } bool RemoveEdge(T vertex1,T vertex2) //在图中删去边(v1,v2) { int v1=getPosVertex(vertex1); int v2=getPosVertex(vertex2); if(v1==-1||v2==-1) return false; if(Edge[v2]==0) return false; Edge[v1][v2]=Edge[v2][v1]=0; numEdges --; return true; } }; template<class T,class E> int GraphMtx<T,E>::getFirstNeighber (T v)const //顶点位置为v { int p = getPosVertex(v); if(p!=-1) { for(int i=0;i<numVertices;i++) if(Edge[p][i]==1) return i; } return -1; } template<class T,class E> int GraphMtx<T,E>::getNextNeighber (T vertex1,T vertex2)const //顶点v1的某邻接顶点v2的下一个邻接顶点 { int v1=getPosVertex(vertex1); int v2=getPosVertex(vertex2); if(v1!=-1&&v2!=-1) { for(int i=v2+1;i<numVertices;i++) if(Edge[v1][i]==1) return i; } return -1; } //......test.cpp #include"graphmtx.h" /* 图:是由顶点集合(vertex)及顶点间的关系集合组成的一种数据结构:Graph = (V,E); 其中,顶点集合V = {x|x属于某个数据对象集}是有穷非空集合,E = {(x,y)|x,y属于V}或E={<x,y>|x,y属于V&&PATH(x,y)}是顶点间关系的有穷集合,也叫做边集合。path(x,y)表示从顶点x到顶点y的一条单向通路,它是有方向的。 图的邻接矩阵表示:首先将所有顶点的信息组织成一个顶点表,然后利用一个矩阵来表示各顶点之间的邻接关系,称为邻接矩阵。 */ void main() { GraphMtx<char,int>gm; gm.InsertVertex ('A'); gm.InsertVertex ('B'); gm.InsertVertex ('C'); gm.InsertVertex ('D'); gm.InsertEdge ('A','B'); gm.InsertEdge ('B','C'); gm.InsertEdge ('A','D'); gm.InsertEdge ('C','D'); gm.InsertEdge ('B','D'); gm.ShowGraph (); int num = gm.getFirstNeighber('C'); printf("%d\n",num); num = gm.getNextNeighber ('B','C'); printf("%d\n",num); num = gm.NumberOfVertex (); printf("%d\n",num); num = gm.NumberOfEdge (); printf("%d\n",num); //gm.RemoveVertex ('C'); //删除某一个顶点 //gm.ShowGraph (); gm.RemoveEdge ('B','D'); gm.ShowGraph (); }
相关文章推荐
- XML文件的操作(读取,插入,删除,修改)
- 如何使用c语言实现双向链表的插入删除操作
- 解决ASP 2.0中GridView控件的删除、插入、编辑命令操作客户端确认问题的另一方法
- c 单链表的创建、插入、删除、倒置操作
- 构建执行插入、更新和删除操作的Web应用程序(上)
- 创建可编辑的xml文档(之四) 删除、改名、插入操作
- 对oracle的blob字段的操作(插入,更新,删除)
- 数据库操作---插入、修改、删除
- 添加删除、更新按钮的提示确认信息,以及DATAGRID的添加、插入、更新、删除操作。
- 用C语言操作MySQL数据库,进行连接、插入、修改、删除等操作
- 对XML进行简单的查询,插入,删除,编辑操作
- 怎样在C#里对xml文件进行修改,新增,删除,插入操作?
- 单链表的创建、插入,删除、查找等操作
- C#中操作xml文件(插入节点、修改、删除)
- 单链表的创建、插入、删除、倒置操作
- 链表插入与删除操作中的头、尾指针
- ASP.NET对数据库的基本操作——插入,删除,修改(下)
- 转载:怎样在C#里对xml文件进行修改,新增,删除,插入操作?
- 用C语言编写一个包含链表的初始化、插入、删除、查找等基本操作的程序。
- 单链表的创建、插入、删除、倒置操作