}
boolNetwork:
:
Topological(intv[])
{
intn=Vertices();//获取n的值
vectora(n+1);
stackS;//创建一个堆栈
for(inti=1;i<=n;i++)//初始化数组a,使每个点的a等于0,用来记录点的入度
a[i]=0;
for(inti=1;i<=n;i++)//遍历整个邻接链表,有入度的节点增加a的值
{
intx=Begin(i);
while(x)
{
a[i]++;
x=Nextvertex(i);//后面有元素,则入度加1
}
}
for(inti=1;i<=n;i++)//如果a=0,把元素加入堆栈
if(a[i]==0)S.push(i);
intk=1;
while(!
S.empty())
{
inty;
y=S.top();//拿出第一个元素
S.pop();
v[k++]=y;//弹出获取值的元素
for(inti=1;i<=n;i++)//遍历整个邻接链表,使有y的元素的入度减一
{
intu=Begin(i);
if(u==y&&a[i]!
=0)
{
a[i]--;
if(a[i]==0)S.push(i);//如果有入度等于0的元素,把元素加入堆栈
}
while(u)
{
u=Nextvertex(i);
if(u==y&&a[i]!
=0)
{
a[i]--;
if(a[i]==0)S.push(i);
}
}
}
}
if(k==n+1)
returntrue;
else
returnfalse;
}
Network:
:
~Network(){
}
//Graph.h
#include
#include
#include
#include
#include"Network.h"
usingnamespacestd;
classGraph:
publicNetwork{
public:
Graph(int);
virtual~Graph();
intInDegree(intnode);
intOutDegree(intnode);
Graph&Add(intnode1,intnode2);
Graph&Delete(intnode1,intnode2);
intBegin(inti);
intNextvertex(inti);
intEdges(){returne;}
intVertices(){returnn;}
voidInitializepos(inti){pos=al[i].begin();}
voidDeactivatepos(inti){al[i].erase(pos);}
voidOut();
private:
intn;
inte;
vector>al;
list:
:
iteratorpos;
};
//Graph.cpp
#include"Graph.h"
Graph:
:
Graph(intnum){
e=0;//初始化边,顶点
n=num;
al.resize(n+1);//开空间
}
Graph:
:
~Graph(){
}
intGraph:
:
InDegree(intnode)
{
returnal[node].size();
}
intGraph:
:
OutDegree(intnode)
{
list:
:
iteratorq;//开链表的迭代器
inti=0;
for(intp=1;p<=n;p++)
{
q=find(al[p].begin(),al[p].end(),node);
if(q!
=al[p].end())i++;
}
returni;
}
Graph&Graph:
:
Add(intnode1,intnode2){
if(node1<1||node1>n||node2<1||node2>n)return*this;
list:
:
iteratorp;
p=find(al[node2].begin(),al[node2].end(),node1);//寻找有没有node1
if(p!
=al[node2].end())return*this;//如果有,返回
else{
al[node2].push_back(node1);
e++;
}
return*this;
}
Graph&Graph:
:
Delete(intnode1,intnode2){
if(node1<1||node1>n||node2<1||node2>n)return*this;
list:
:
iteratorp;
p=find(al[node2].begin(),al[node2].end(),node1);
if(p==al[node2].end())return*this;
else
{
al[node2].erase(p);//删除要删除的元素
e--;
}
return*this;
}
voidGraph:
:
Out(){
for(inti=1;i<=n;i++){
list:
:
iteratorp;
cout<<"逆邻接链表中第"<
for(p=al[i].begin();p!
=al[i].end();p++)cout<<*p<<'';
cout<}
return;
}
intGraph:
:
Begin(inti)
{
if(i<1||i>n)cout<<"无该点";
Initializepos(i);
if(pos==al[i].end())
return0;
else
return*pos;
}
intGraph:
:
Nextvertex(inti)
{
if(i<1||i>n)cout<<"无该点";
pos++;
if(pos!
=al[i].end())
return*pos;
else
return0;
}
五、测试数据
#include"Graph.h"
#include"Network.h"
intb[20];
intb1[20];
intc[20];
inta[20];
inta1[20];
intmain(void)
{
intn=6;
intlabel=2;
Graphg(n);//创建对象
g.Add(1,4).Add(1,3).Add(2,4).Add(2,5).Add(3,4).Add(3,6).Add(4,6).Add(5,6);
g.Out();
g.BFS(1,b,label,b1);
cout<g.DFS(1,a,label,a1);
for(inti=1;i<=n;i++)
{
cout<<"节点"<
";
cout<cout<<"节点"<
";
cout<}
g.Topological(c);//执行拓扑排序
for(inti=1;i<=n;i++)
cout<<"拓扑排序的第"<
cout<g.Delete(4,6);
g.Out();
}
6、测试情况
双向循环链表
1、问题描述
实现双向循环链表。
二、数据结构
a3
三、逻辑设计
1、总体思路
先构造双向循环链表的节点类,再逐步实现双向循环链表的基本函数。
2、模块划分(以图示的方法给出各个函数的调用关系)
DoubleCircularNode节点类
DoubleCircular类
DoubleCircular类
DoubleCircular类
DoubleCircular类
DoubleCircular类
DoubleCircular类
DoubleCircular类
DoubleCircular类
3、函数或类的具体定义和功能
template
classDoubleCircular{
public:
DoubleCircular();//构造函数
~DoubleCircular();//析构函数
boolIsEmpty()const;//判断是否为空
intlength()const;//计算长度
boolFind(intk,T&x)const;//判断节点是否存在
intSearch(constT&x)const;//查找节点
DoubleCircular&Insert(intk,constT&x);//插入节点
DoubleCircular&Delete(intk,T&x);//删除节点
voidOutput(ostream&out)const;//输出函数
private:
DoubleCircularNode*first;
};
四、编码
//DoubleCircular.h
template
classDoubleCircularNode;
#include
usingnamespacestd;
template
classDoubleCircular{
public:
DoubleCircular();
~DoubleCircular();
boolIsEmpty()const;
intlength()const;
boolFind(intk,T&x)const;
intSearch(constT&x)const;
DoubleCircular&Insert(intk,constT&x);
DoubleCircular&Delete(intk,T&x);
voidOutput(ostream&out)const;
private:
DoubleCircularNode*first;
};
template
classDoubleCircularNode{
friendclassDoubleCircular;
private:
Tdata;
DoubleCircularNode*left,*right;
};
template
classDoubleCircularIterator{
public:
T*Intialize(constDoubleCircular&c)
{
location=c.first->right;
if(location)
return&location->data;
return0;
}
T*Next(constDoubleCircular&c)
{
if(!
location)return0;
location=location->right;
if(location->right!
=c.first->right)
{
return&location->data;