图的操作.docx
- 文档编号:11496480
- 上传时间:2023-03-02
- 格式:DOCX
- 页数:18
- 大小:70.46KB
图的操作.docx
《图的操作.docx》由会员分享,可在线阅读,更多相关《图的操作.docx(18页珍藏版)》请在冰豆网上搜索。
图的操作
图
一、实验要求
构造函数,析构函数,插入,删除,深度优先遍历,广度优先遍历等
二、功能说明
对图插入,删除,深度优先遍历,广度优先遍历等
三、概要设计
1以类封装定义一个图类Graphmtx,私有成员为图的最大顶点数maxVertices,当前边数numEdges,当前顶点数Vertices,顶点表VerticesList,邻接矩阵Edge,对图的各种操作:
插入顶点,插入边,删除顶点,删除边,深度优先遍历,广度优先遍历,输入,输出等函数设为公有成员函数;
2利用switch语句对Graphmtx类中的各种操作进行调用,进行插入、删除、深度优先遍历,广度优先遍历,输入,输出等操作)
四、详细设计
constintmaxWeight=100;
constintDefaultVertices=30;
template
classGraph{
public:
//intmaxWeight=100;
Graph(intsz=DefaultVertices){};
//~Graph();
boolGraphEmpty()const{
if(numEdges==0)returntrue;
elsereturnfalse;
}
boolGraphFull()const{
if(GraphVertices==maxVertices||munEdges==maxVertices*(maxVertices-1)/2)returntrue;
elsereturnfalse;}
intNumberOfVertices(){returnnumVertices;}
intNumberOfEdges(){returnnumEdges;}
virtualTgetValue(inti)=0;
virtualintgetWeight(intv1,intv2)=0;
virtualintgetFirstNeighbor(intv)=0;
virtualintgetNextNeighbor(intv,intw)=0;
virtualboolinsertVertex(constT&vertex)=0;
virtualboolinsertEdge(intv1,intv2,intcost)=0;
virtualboolremoveVertex(intv)=0;
virtualboolremoveEdge(intv1,intv2)=0;
virtualintgetVertexPos(Tvertex)=0;
protected:
intmaxVertices;
intnumEdges;
intnumVertices;
//intgetVertexPos(Tvertex);
};
#include
#include
//队列的抽象数据类型
constintmaxSize=200;
template
classQueue{
public:
virtualboolEnQueue(constT&x)=0;
virtualboolDeQueue(T&x)=0;
virtualboolgetFront(T&x)=0;
virtualboolIsEmpty()const=0;
virtualboolIsFull()const=0;
virtualintgetSize()const=0;
};
//循环队列类定义
template
classSeqQueue:
publicQueue
{
public:
SeqQueue(intsz=10);
~SeqQueue(){delete[]elements;}
boolEnQueue(constT&x);//进队
boolDeQueue(T&x);//出队
boolgetFront(T&x);//返回队头元素值
voidmakeEmpty(){front=rear=0;}//置空
boolIsEmpty()const{return(front==rear)?
true:
false;}//判队列空否
boolIsFull()const{return((rear+1)%maxSize==front)?
true:
false;}//判队列满否
intgetSize()const{return(rear-front+maxSize)%maxSize;}//求队列元素个数
friendostream&operator<<(ostream&os,SeqQueue
protected:
intrear,front;
T*elements;
intmaxSize;
};
template
SeqQueue
:
SeqQueue(intsz):
front(0),rear(0),maxSize(sz){
elements=newT[maxSize];
assert(elements!
=NULL);
}
template
boolSeqQueue
:
EnQueue(constT&x){
if(IsFull()==true){
//cout<<"队列已满"< returnfalse;} elements[rear]=x; rear=(rear+1)%maxSize; returntrue; } template boolSeqQueue : DeQueue(T&x){ if(IsEmpty()==true){ returnfalse;} x=elements[front]; front=(front+1)%maxSize; returntrue; } template boolSeqQueue : getFront(T&x){ if(IsEmpty()==true){ returnfalse;} x=elements[front]; returntrue; } template ostream&operator<<(ostream&os,SeqQueue os<<"front="< for(inti=Q.front;i! =Q.rear;i=(i+1)%maxSize) os< "< returnos; } #include"Graph.h" #include"Queue.h" #include template classGraphmtx: publicGraph public: Graphmtx(intsz=DefaultVertices); ~Graphmtx(){ delete[]VerticesList;delete[]Edge;} intgetWeight(intv1,intv2) {returnv1! =-1&&v2! =-1? Edge[v1][v2]: 0;} TgetValue(inti) {returni>=0&&i<=numVertices? VerticesList[i]: NULL;} boolinsertVertex(constT&vertex); boolinsertEdge(intv1,intv2,intcost); boolremoveVertex(inti); boolremoveEdge(intv1,intv2); intgetFirstNeighbor(intv); intgetNextNeighbor(intv,intw); voidinput(Graphmtx voidoutput(Graphmtx voidDFS(Graphmtx voidDFS(Graphmtx voidBFS(Graphmtx intgetVertexPos(Tvertex){ for(inti=0;i if(VerticesList[i]==vertex)returni; return-1; } private: T*VerticesList; int**Edge; }; template Graphmtx : Graphmtx(intsz){ maxVertices=sz;numVertices=0;numEdges=0; inti,j; VerticesList=newT[maxVertices]; Edge=(int**)newint*[maxVertices]; for(i=0;i Edge[i]=newint[maxVertices]; for(i=0;i for(j=0;j Edge[i][j]=(i==j)? 0: maxWeight; }; template boolGraphmtx : insertVertex(constT&vertex){ if(numVertices==maxVertices)returnfalse; VerticesList[numVertices++]=vertex; returntrue; }; template intGraphmtx : getFirstNeighbor(intv){ if(v! =-1){ for(intcol=0;col if(Edge[v][col]>0&&Edge[v][col] } return-1; }; template intGraphmtx : getNextNeighbor(intv,intw){ if(v! =-1&&w! =-1){ for(intcol=w+1;col if(Edge[v][col]>0&&Edge[v][col] } return-1; }; template boolGraphmtx : removeVertex(intv){ if(v<0||v>numVertices)returnfalse; if(numVertices==1)returnfalse; inti,j; VerticesList[v]=VerticesList[numVertices-1]; for(i=0;i if(Edge[i][v]>0&&Edge[i][v] for(i=0;i Edge[i][v]=Edge[i][numVertices-1]; numVertices--; for(j=0;j Edge[v][j]=Edge[numVertices][j]; returntrue; }; template boolGraphmtx : insertEdge(intv1,intv2,intcost){ if(v1>-1&&v1 Edge[v1][v2]=Edge[v2][v1]=cost; numEdges++; returntrue; } elsereturnfalse; }; template boolGraphmtx : removeEdge(intv1,intv2){ if(v1>-1&&v1 Edge[v1][v2]=Edge[v2][v1]=maxWeight; numEdges--; returntrue; } elsereturnfalse; }; template voidGraphmtx : input(Graphmtx inti,j,k,n,m;Te1,e2;intweight; cout<<"请输入顶点数和边数: "; cin>>n>>m; for(i=0;i cout<<"输入顶点"< "; cin>>e1;G.insertVertex(e1); } i=0; while(i cout<<"输入端点信息: "; cin>>e1>>e2>>weight; j=G.getVertexPos(e1);k=G.getVertexPos(e2); if(j==-1||k==-1) cout<<"边两端点信息有误,重新输入! "< else{ G.insertEdge(j,k,weight); i++; } } }; template voidGraphmtx : output(Graphmtx {inti,j,n,m;Te1,e2;intweight; n=G.NumberOfVertices();m=G.NumberOfEdges(); cout<<"顶点数"< for(i=0;i for(j=i+1;j weight=G.getWeight(i,j); if(weight>0&&weight e1=G.getValue(i);e2=G.getValue(j); cout<<"("< } } }; template voidGraphmtx : DFS(Graphmtx cout< visited[v]=true; intw=G.getFirstNeighbor(v); while(w! =-1){ if(visited[w]==false)DFS(G,w,visited); w=G.getNextNeighbor(v,w); } }; template voidGraphmtx : DFS(Graphmtx inti,loc,n=G.NumberOfVertices(); bool*visited=newbool[n]; for(i=0;i loc=G.getVertexPos(v); DFS(G,loc,visited); delete[]visited; }; template voidGraphmtx : BFS(Graphmtx inti,w,n=G.NumberOfVertices(); bool*visited=newbool[n]; for(i=0;i intloc=G.getVertexPos(v); cout< visited[loc]=true; SeqQueue while(! Q.IsEmpty()){ Q.DeQueue(loc); w=G.getFirstNeighbor(loc); while(w! =-1){ if(visited[w]==false){ cout< visited[w]=true; Q.EnQueue(w); } w=G.getNextNeighbor(loc,w); } } delete[]visited; } #include"Graphmtx.h" #include voidmain() { inti=1,n1,n2,weight; intvert; Graphmtx while(i>0&&i<10) { cout<<"1.构建图并输出"< cout<<"2.插入一个顶点"< cout<<"3.插入一条边"< cout<<"4.删除一个顶点"< cout<<"5.删除一条边"< cout<<"6.图的深度遍历"< cout<<"7.图的广度遍历"< cout<<"8.输出图"< cout<<"9.退出程序"< cin>>i; switch(i) { case1: G.input(G); cout<<"构建的图为: "< G.output(G); break; case2: cout<<"请输入要插入的顶点: "< cin>>vert; G.insertVertex(vert); break; case3: cout<<"请输入要插入的边连接的顶点1序号: "< cin>>n1; cout<<"请输入要插入的边连接的顶点2序号: "< cin>>n2; cout<<"请输入边的权值: "< cin>>weight; G.insertEdge(n1,n2,weight); break; case4: cout<<"请输入要删除顶点的序号: "< cin>>n1; G.removeVertex(n1); break; case5: cout<<"请输入要删除的边连接的两个顶点的序号: "< cin>>n1>>n2; G.removeEdge(n1,n2); break; case6: cout<<"请输入遍历起始顶点值: "< cin>>vert; cout<<"图的深度遍历: "< G.DFS(G,vert); break; case7: cout<<"请输入遍历起始顶点值: "< cin>>vert; cout<<"图的广度遍历: "< G.BFS(G,vert); break; case8: cout<<"输出此图: "< G.output(G); break; case9: return; } } } 五、测试结果 a)构建图并输出 b)插入一个顶点,插入一条边 c)图的深度遍历 d)图的广度遍历 E)删除顶点
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作