山东建筑大学数据结构课程设计报告课案文档格式.docx
- 文档编号:16482099
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:26
- 大小:34.93KB
山东建筑大学数据结构课程设计报告课案文档格式.docx
《山东建筑大学数据结构课程设计报告课案文档格式.docx》由会员分享,可在线阅读,更多相关《山东建筑大学数据结构课程设计报告课案文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
2015.4.22~2015.4.35,实现双向循环链表
2015.4.25~2015.4.29,编写测试代码。
4、考勤20%
5、课程设计说明书50%
6、成果展示30%
逆邻接链表实现有向图
6
一、问题描述
5
二、数据结构
三、逻辑设计
1、总体思路
先实现Network类,通过队列实现BFS,通过堆栈实现DFS和拓扑排序。
再构建Graph类,并继承Network类实现以逆邻接链表为存储结构的有向图。
2、模块划分(以图示的方法给出各个函数的调用关系)
Network类
Initializepos虚函数
Edges虚函数
Begin
虚函数
BFS函数
DFS函数
Topological函数
Deactivatepos虚函数
Vertices虚函数
Nextvertex
Begin函数
Out函数
Deactivatepos函数
Initializepos函数
Vertices函数
Edges函数
Nextvertex函数
Graph类
3、函数或类的具体定义和功能
Network类:
virtualintBegin(inti)=0;
//确定起始顶点
virtualintNextvertex(inti)=0;
//下一个顶点
virtualintEdges()=0;
//确定点
virtualintVertices()=0;
//确定边
virtualvoidInitializepos(inti)=0;
//让迭代器等于链表的第i个顶点的第一个元素
virtualvoidDeactivatepos(inti)=0;
//删除迭代器指的元素
voidBFS(intv,intreach[],intlabel,inta[]);
//宽度遍历
voidDFS(intv,intreach[],intlabel,inta[]);
//深度遍历
boolTopological(intv[]);
//拓扑排序
virtual~Network();
//析构函数
Graph类:
virtual~Graph();
intInDegree(intnode);
//入度
intOutDegree(intnode);
//出度
Graph&
Add(intnode1,intnode2);
//添加点
Delete(intnode1,intnode2);
//删除点
intBegin(inti);
intNextvertex(inti);
intEdges(){returne;
}//确定点
intVertices(){returnn;
}//确定边
voidInitializepos(inti){pos=al[i].begin();
}////让迭代器等于链表的第i个顶点的第一个元素
voidDeactivatepos(inti){al[i].erase(pos);
}//删除迭代器指的元素
voidOut();
//输出函数
四、编码
//Network.h
#include<
iostream>
#include<
queue>
stack>
vector>
usingnamespacestd;
classNetwork{
public:
virtualintBegin(inti)=0;
virtualintNextvertex(inti)=0;
virtualintEdges()=0;
virtualintVertices()=0;
virtualvoidInitializepos(inti)=0;
//让迭代器等于链表的第i点的第一个元素
virtualvoidDeactivatepos(inti)=0;
voidBFS(intv,intreach[],intlabel,inta[]);
voidDFS(intv,intreach[],intlabel,inta[]);
boolTopological(intv[]);
virtual~Network();
};
//Network.cpp
#include"
Network.h"
voidNetwork:
:
BFS(intv,intreach[],intlabel,inta[])
{
intn=Vertices();
//获取n的值,有几个顶点
queue<
int>
Q;
//创建一个队列
intk=0;
//定义一个k来使元素得到保存
reach[v]=label;
//标记点
a[k++]=v;
//用数组记录BFS的遍历顺序
Q.push(v);
//把一个元素加入队列
while(!
Q.empty())
{
intx;
x=Q.front();
//获取队列中的第一个元素
Q.pop();
//让队列中的第一个元素出队
for(inti=1;
i<
=n;
i++)//寻找x的下一个节点
{
intu=Begin(i);
if((u==x)&
&
(!
reach[i]))//因为是逆邻接链表
{
Q.push(i);
reach[i]=label;
a[k++]=i;
//把标记的元素放入遍历数组
}
while(u)//看后面是不是还有节点
u=Nextvertex(i);
reach[i]))
}
}
for(inti=v;
n;
i++)//输出BFS的运行结果
if(reach[i]==label)
cout<
<
"
执行完BFS后第"
个元素被标记"
endl;
else
个元素没有被标记"
从节点"
v<
开始BFS遍历的顺序是"
;
for(inti=1;
i++)//输出BFS的遍历顺序
cout<
a[i-1]<
"
};
}
DFS(intv,intreach[],intlabel,inta[])
stack<
S;
///创建一个堆栈
//获取n的值
S.push(v);
//把元素v加入堆栈
S.empty())
intx=S.top();
//获取堆栈的栈顶元素
if(!
reach[x])//如果元素没被标记,就把元素标记
{reach[x]=label;
a[k++]=x;
S.pop();
//把堆栈的栈顶弹出
i++)//获取节点的下一个元素
intu=Begin(i);
if((u==x)&
{
S.push(i);
//把元素加入堆栈
}
while(u)
u=Nextvertex(i);
S.pop();
//如果被标记元素就弹出
i++)//输出DFS的运行结果
if(reach[i]==label)
cout<
执行完DFS后第"
else
从节点1开始DFS遍历的顺序是"
for(inti=1;
i++)//输出DFS的遍历顺序
cout<
ends;
};
boolNetwork:
Topological(intv[])
intn=Vertices();
vector<
a(n+1);
stack<
//创建一个堆栈
for(inti=1;
=n;
i++)//初始化数组a,使每个点的a等于0,用来记录点的入度
a[i]=0;
i++)//遍历整个邻接链表,有入度的节点增加a的值
intx=Begin(i);
while(x)
a[i]++;
x=Nextvertex(i);
//后面有元素,则入度加1
for(inti=1;
i++)//如果a=0,把元素加入堆栈
if(a[i]==0)S.push(i);
intk=1;
while(!
inty;
y=S.top();
//拿出第一个元素
v[k++]=y;
//弹出获取值的元素
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(a[i]==0)S.push(i);
if(k==n+1)
returntrue;
else
returnfalse;
Network:
~Network(){
//Graph.h
list>
algorithm>
#include"
classGraph:
publicNetwork{
public:
Graph(int);
virtual~Graph();
intInDegree(intnode);
intOutDegree(intnode);
Graph&
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<
list<
>
al;
list<
iteratorpos;
//Graph.cpp
Graph.h"
Graph:
Graph(intnum){
e=0;
//初始化边,顶点
n=num;
al.resize(n+1);
//开空间
~Graph(){
intGraph:
InDegree(intnode)
returnal[node].size();
OutDegree(intnode)
list<
iteratorq;
//开链表的迭代器
inti=0;
for(intp=1;
p<
p++)
q=find(al[p].begin(),al[p].end(),node);
if(q!
=al[p].end())i++;
returni;
Graph:
Add(intnode1,intnode2){
if(node1<
1||node1>
n||node2<
1||node2>
n)return*this;
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;
Delete(intnode1,intnode2){
if(p==al[node2].end())return*this;
else
al[node2].erase(p);
//删除要删除的元素
e--;
voidGraph:
Out(){
for(inti=1;
i<
i++){
逆邻接链表中第"
行元素有"
for(p=al[i].begin();
p!
=al[i].end();
p++)cout<
*p<
'
cout<
return;
Begin(inti)
if(i<
1||i>
n)cout<
无该点"
Initializepos(i);
if(pos==al[i].end())
return0;
return*pos;
Nextvertex(inti)
pos++;
if(pos!
=al[i].end())
五、测试数据
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);
g.DFS(1,a,label,a1);
i++)
节点"
的入度为:
g.InDegree(i)<
"
的出度为:
g.OutDegree(i)<
g.Topological(c);
//执行拓扑排序
拓扑排序的第"
个元素是"
c[i]<
cout<
g.Delete(4,6);
g.Out();
6、测试情况
1、问题描述
a3
先构造双向循环链表的节点类,再逐步实现双向循环链表的基本函数。
DoubleCircularNode节点类
DoubleCircular类
template<
classT>
classDoubleCircular{
DoubleCircular();
//构造函数
~DoubleCircular();
boolIsEmpty()const;
//判断是否为空
intlength()const;
//计算长度
boolFind(intk,T&
x)const;
//判断节点是否存在
intSearch(constT&
//查找节点
DoubleCircular<
T>
Insert(intk,constT&
x);
//插入节点
Delete(intk,T&
//删除节点
voidOutput(ostream&
out)const;
private:
DoubleCircularNode<
*first;
//DoubleCircular.h
classDoubleCircularNode;
classDoubleCircularNode{
friendclassDoubleCircular<
Tdata;
*left,*right;
classDoubleCircularIterator{
T*Intialize(constDoubleCircular<
c)
location=c.first->
right;
if(location)
return&
location->
data;
return0;
T*Next(constDoubleCircular<
location)return0;
location=location->
if(location->
right!
=c.first->
right)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 山东 建筑 大学 数据结构 课程设计 报告