1、作业16分别使用邻接矩阵和邻接表实现图数据结构及其相关操作:(1) 实现构造和析构函数;(3) 图的数据(顶点和边信息)从终端输入,实现相应的输入函数;(4) 统计每一个顶点的度(视为有向图时,分别给出入度和出度);(5) 给出图的DFS和BFS遍历序列;(6) 当此图为有向无环图时,给出拓扑排序序列;template class LLN public: LLN(T x,LLN * l); virtual LLN(); T data; LLN * link;template LLN:LLN(T x,LLN * l) data=x; link=l;template LLN:LLN()#inclu
2、deLLN.htemplate class LS public: bool GetTop(T& x); /T GetTop(); void push(T x); bool pop(); bool IsEmpty(); LS(); virtual LS(); LLN * top;template LS:LS() top=NULL;template LS:LS() while(top) LLN * p=top-link; delete top; top=p; template bool LS:IsEmpty() return top=NULL?true:false;template bool LS
3、:pop() if(IsEmpty() return false; else LLN * p=top; top=top-link; delete p; return true; template void LS:push(T x) top=new LLN(x,top);template bool LS:GetTop(T& x) if(IsEmpty() return false; else x=top-data; return true; #include #include templateclass QueC public: void MakeEmpty(); bool IsFull();
4、bool IsEmpty(); T GetFront(); bool DeQ(); bool EnQ(T x); QueC(int sz = 10); virtual QueC(); int rear, front; T *elements; int maxSize;templateQueC:QueC(int sz): front(0), rear(0), maxSize(sz) elements=new TmaxSize; assert(elements!=NULL);templateQueC:QueC() delete elements;templatebool QueC:EnQ(T x)
5、 if (IsFull() = true) return false; elementsrear=x; rear=(rear+1)%maxSize; return true;templatebool QueC:DeQ() if (IsEmpty() = true) return false; front = (front+1) % maxSize; return true;templateT QueC:GetFront() if (IsEmpty() = true) return false; return elementsfront;templatebool QueC:IsEmpty() r
6、eturn (front = rear)?true:false;templatebool QueC:IsFull() return (rear+1) % maxSize = front)?true:false;templatevoid QueC:MakeEmpty() front = rear = 0;class GM public: void TopoSt(); void BFS(); void DFS(); void DFS(int i,bool * v); int InRank(int n); int Rank(int m); bool Create(); int * edge; cha
7、r * ver; int numV; int maxV; GM(int sz); virtual GM();#include stdafx.h#include GM.h#include #include QueC.h#include LS.hGM:GM(int sz) maxV=sz; ver=new charsz; edge=new intsz*sz; numV=0;GM:GM() delete edge; delete ver;bool GM:Create() cout输入顶点个数(顶点个数不能大于maxV):numV; if (numVmaxV) couterror!endl; retu
8、rn false; else cout输入顶点信息数组:endl; for (int i=0;iveri; cout输入边信息数组(1有关,0无关):endl; for (i=0;iedgei; cout边信息数组为:endl; for (i=0;inumV*numV;i+) coutedgei ; if(i+1)%numV=0) coutendl; return true; int GM:Rank(int m) if(mnumV) return -1; else int count=0; for (int i=m*numV;i(m+1)*numV);i+) count=count+edgei
9、; return count; int GM:InRank(int n) if(nnumV) return -1; else int count=0; for(int j=n;jnumV*numV;j=j+numV) count=count+edgej; return count; void GM:DFS(int i,bool * v) vi=true; coutveri ; for (int j=i*numV;j(i+1)*numV);j+) if(!vj%numV&edgej=1) /j%numV是对应顶点的列号, DFS(j%numV,v); /vj%numV判断顶点是否被访问过 voi
10、d GM:DFS() bool * v=new boolnumV; for (int i=0;inumV;i+) vi=false; for (i=0;inumV;i+) if(vi) continue; DFS(i,v); coutendl; delete v;void GM:BFS() bool * v=new boolnumV; for (int i=0;inumV;i+) vi=false; QueC q; for (i=0;inumV;i+) if(vi) continue; else q.EnQ(i); coutveri ; vi=true; while (!q.IsEmpty()
11、 int n=q.GetFront(); q.DeQ(); for (int j=n*numV;j(n+1)*numV);j+) if (!vj%numV&edgej=1) vj%numV=true; coutverj%numV ; q.EnQ(j%numV); coutendl; void GM:TopoSt() cout拓扑排序:; LS ls; int IR81; for (int i=0;inumV;i+) IRi=InRank(i); for (i=0;inumV;i+) if (IRi=0) ls.push(i); int count=0; while (!ls.IsEmpty()
12、 int top; ls.GetTop(top); coutvertop ; ls.pop(); count+; for (int j=top*numV;j(top+1)*numV);j+) if (edgej=1) IRj%numV-; if (IRj%numV=0) ls.push(j%numV); if (countnumV) cout存在有向环。endl; #include stdafx.h#include GM.h#include int main(int argc, char* argv) GM gm(10); gm.Create(); int i; couti; cout此顶点的
13、出度:gm.Rank(i)endl; cout此顶点的入度:gm.InRank(i)endl; cout深度优先:; gm.DFS(); cout广度优先:; gm.BFS(); gm.TopoSt(); coutendl; return 0;class Vertex public: Vertex(); virtual Vertex(); char data; Edge * adj;#include stdafx.h#include Vertex.hVertex:Vertex()Vertex:Vertex()class Edge public: Edge(int num); virtual E
14、dge(); int dest; Edge * link;#include stdafx.h#include Edge.hEdge:Edge(int num) dest=num; link=NULL;Edge:Edge()#include Vertex.hclass GL public: void TopoSt(); void BFS(); void DFS(); int InRank(int j); int Rank(int i); bool Create(); GL(int sz); virtual GL(); int maxV; int numV; Vertex * NodeTable;
15、protected: void DFS(int i,bool * v);#include stdafx.h#include GL.h#include #include QueC.h#includeLS.hGL:GL(int sz) maxV=sz; NodeTable=new Vertexsz; numV=0;GL:GL() for (int i=0;ilink; delete p; p=q; bool GL:Create() cout输入顶点个数(顶点个数不能大于maxV):numV; if (numVmaxV) couterror!endl; return false; else cout
16、输入顶点的信息:endl; for (int i=0;iNodeTablei.data; NodeTablei.adj=NULL; cout输入边的信息,输入中含-1时停止:vede; if (ve=-1)|(de=-1) break; Edge * p=new Edge(NULL); p-dest=de; p-link=NodeTableve.adj; NodeTableve.adj=p; return true; int GL:Rank(int i) if(inumV) return -1; else Edge * p=NodeTablei.adj; int count=0; while
17、(p) +count; p=p-link; return count; int GL:InRank(int j) if(jnumV) return -1; else int count=0; for(int i=0;idest=j) +count; p=p-link; return count; void GL:DFS(int i,bool * v) vi=true; coutNodeTablei.datalink) if(!vp-dest) DFS(p-dest,v); void GL:DFS() bool * v=new boolnumV; for (int i=0;inumV;i+) v
18、i=false; for (i=0;inumV;i+) if(vi) continue; DFS(i,v); coutendl; delete v;void GL:BFS() bool * v=new boolnumV; for (int i=0;inumV;i+) vi=false; QueC q; for (i=0;inumV;i+) if(vi) continue; else q.EnQ(i); coutNodeTablei.datalink) if (!vp-dest) vp-dest=true; coutdest.datadest); coutendl; void GL:TopoSt
19、() cout拓扑排序:; LS ls; int IR81; for (int i=0;inumV;i+) IRi=InRank(i); for (i=0;inumV;i+) if (IRi=0) ls.push(i); int count=0; while (!ls.IsEmpty() int top; ls.GetTop(top); coutNodeTabletop.datalink) IRp-dest-; if (IRp-dest=0) ls.push(p-dest); if (countnumV) cout存在有向环。endl; LS.h/LLN.h/QueC.h是模板#include stdafx.h#include GL.h#include int main(int argc, char* argv) GL gl(10); gl.Create(); int m; coutm; cout此顶点的出度:gl.Rank(m)endl; cout此顶点的入度:gl.InRank(m)endl; cout深度优先:; gl.DFS(); cout广度优先:; gl.BFS(); gl.TopoSt(); coutendl; return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1