山东大学数据结构实验报告八.docx
《山东大学数据结构实验报告八.docx》由会员分享,可在线阅读,更多相关《山东大学数据结构实验报告八.docx(23页珍藏版)》请在冰豆网上搜索。
山东大学数据结构实验报告八
山东大学软件工程学院
数据结构课程实验报告
学号:
姓名:
班级:
软件工程2014级2班
实验题目:
图的操作
实验学时:
实验日期:
2015.12.9
实验目的:
掌握图的基本概念,描述方法;遍历方法。
硬件环境:
实验室
软件环境:
VistualStudio2013
实验步骤与内容:
实验内容:
1、创建图类。
二叉树的存储结构使用邻接矩阵或链表。
2、提供操作:
遍历、BFS、DFS
3、对建立好的图,执行上述各操作。
4、输出生成树。
5、输出最小生成树。
代码体:
Adjacencywdigraph.h
#ifndefADJACENCYWDIGRAPH_H
#defineADJACENCYWDIGRAPH_H
classAdjacencyWDigraph{
friendclassAdjacencyWGraph;
public:
AdjacencyWDigraph(intVertices=10,intnoEnge=0);
~AdjacencyWDigraph();
boolExist(inti,intj)const;
intEdges()const{returne;}
intVertices()const{returnn;}
AdjacencyWDigraph&Add(inti,intj,constint&w=1);
AdjacencyWDigraph&Delete(inti,intj);
intOutDegree(inti)const;
intInDegree(inti)const;
voidInitializePos(){pos=newint[n+1];}
voidDeactivatePos(){delete[]pos;}
intBegin(inti);
intNextVertex(inti);
voidBFS(intv,intreach[],intlabel=1);
voidDFS(intv,intreach[],intlabel=1);
boolConnected(int&x);
int**SpanningTree();
int**SpanningMinTree();
voidOutPut();
private:
intMinNum();
intMin(intv,intreach[]);
boolConnecting(inti);
voiddfs(intv,intreach[],intlabel);
intNoEdge,n,e;
int**a;
int*pos;
};
#endif
Adjacencywdigraph.cpp
#include
#include
usingnamespacestd;
#include"adjacencywdigraph.h"
AdjacencyWDigraph:
:
AdjacencyWDigraph(intVertices,intnoEdge){
n=Vertices;
e=0;
NoEdge=noEdge;
a=newint*[n+1];
for(inti=1;i<=n;i++)
a[i]=newint[n+1];
for(inti=1;i<=n;i++)
for(intj=1;j<=n;j++)
a[i][j]=NoEdge;
}
AdjacencyWDigraph:
:
~AdjacencyWDigraph(){
for(inti=1;i<=n;i++)
delete[]a[i];
delete[]a;
}
boolAdjacencyWDigraph:
:
Exist(inti,intj)const{
if(i<1||j<1||i>n||j>n||a[i][j]==NoEdge)
returnfalse;
returntrue;
}
AdjacencyWDigraph&AdjacencyWDigraph:
:
Add(inti,intj,constint&w){
if(i<1||j<1||i>n||j>n)
cout<<"错误!
点"<
elseif(a[i][j]!
=NoEdge)
cout<<"错误!
该边已存在,无法再添加"<else{
a[i][j]=w;
e++;
}
return*this;
}
AdjacencyWDigraph&AdjacencyWDigraph:
:
Delete(inti,intj){
if(i<1||j<1||i>n||j>n||a[i][j]==NoEdge)
cout<<"错误!
该边不存在,无法删除"<else{
a[i][j]=NoEdge;
e--;
}
return*this;
}
intAdjacencyWDigraph:
:
OutDegree(inti)const{
if(i<1||i>n){
cout<<"错误,该点不存在!
"<return0;
}
else{
intsum=0;
for(intj=1;j<=n;j++)
if(a[i][j]!
=NoEdge)
sum++;
returnsum;
}
}
intAdjacencyWDigraph:
:
InDegree(inti)const{
if(i<1||i>n){
cout<<"错误,该点不存在!
"<return0;
}
else{
intsum=0;
for(intj=1;j<=n;j++)
if(a[j][i]!
=NoEdge)
sum++;
returnsum;
}
}
intAdjacencyWDigraph:
:
Begin(inti){
if(i<1||i>n){
cout<<"错误,该点不存在!
"<return0;
}
else{
for(intj=1;j<=n;j++)
if(a[i][j]!
=NoEdge){
pos[i]=j;
returnj;
}
pos[i]=n+1;
return0;
}
}
intAdjacencyWDigraph:
:
NextVertex(inti){
if(i<1||i>n){
cout<<"错误,该点不存在!
"<return0;
}
else{
for(intj=pos[i]+1;j<=n;j++)
if(a[i][j]!
=NoEdge){
pos[i]=j;
returnj;
}
pos[i]=n+1;
return0;
}
}
voidAdjacencyWDigraph:
:
BFS(intv,intreach[],intlabel){
if(v<1||v>n){
cout<<"错误,该点不存在!
"<return;
}
queueq;
InitializePos();
reach[v]=label;
q.push(v);
while(!
q.empty()){
intw=q.front();
q.pop();
intu=Begin(w);
while(u){
if(!
reach[u]){
q.push(u);
reach[u]=label;
}
u=NextVertex(w);
}
}
DeactivatePos();
}
voidAdjacencyWDigraph:
:
dfs(intv,intreach[],intlabel){
reach[v]=label;
intu=Begin(v);
while(u){
if(!
reach[u])
dfs(u,reach,label);
u=NextVertex(v);
}
}
voidAdjacencyWDigraph:
:
DFS(intv,intreach[],intlabel){
if(v<1||v>n){
cout<<"错误,该点不存在!
"<return;
}
InitializePos();
dfs(v,reach,label);
DeactivatePos();
}
voidAdjacencyWDigraph:
:
OutPut(){
for(inti=1;i<=n;i++){
for(intj=1;j<=n;j++)
cout<cout<}
}
boolAdjacencyWDigraph:
:
Connecting(inti){
int*reach=newint[n+1];
for(intj=1;j<=n;j++)
reach[j]=0;
BFS(i,reach,1);
for(intj=1;j<=n;j++)
if(!
reach[j]){
delete[]reach;
returnfalse;
}
delete[]reach;
returntrue;
}
boolAdjacencyWDigraph:
:
Connected(int&x){
bool*flag=newbool[n+1];
for(inti=1;i<=n;i++)
flag[i]=Connecting(i);
for(inti=1;i<=n;i++)
if(flag[i]){
x=i;
returntrue;
}
returnfalse;
}
intAdjacencyWDigraph:
:
Min(intv,intreach[]){
intk=0,min=0;
for(inti=1;i<=n;i++){
if(!
reach[i]&&a[v][i]!
=NoEdge&&!
min){
k=i;
min=a[v][i];
}
elseif(!
reach[i]&&a[v][i]!
=NoEdge&&min>a[v][i]){
k=i;
min=a[v][i];
}
}
returnk;
}
int**AdjacencyWDigraph:
:
SpanningTree(){
intx;
if(!
Connected(x)){
cout<<"该图不是连通图,无法生成树!
"<return0;
}
else{
InitializePos();
queueq;
int**b=newint*[n+1];
for(inti=1;i<=n;i++)
b[i]=newint[n+1];
for(inti=1;i<=n;i++)
for(intj=1;j<=n;j++)
b[i][j]=0;
int*reach=newint[n+1];
for(inti=1;i<=n;i++)
reach[i]=0;
reach[x]=1;
q.push(x);
while(!
q.empty()){
intw=q.front();
q.pop();
intu=Begin(w);
while(u){
if(!
reach[u]){
q.push(u);
b[w][u]=a[w][u];
reach[u]=1;
}
u=NextVertex(w);
}
}
delete[]reach;
DeactivatePos();
returnb;
}
}
intAdjacencyWDigraph:
:
MinNum(){
intk=0,m=0;
for(inti=1;i<=n;i++){
if(Connecting(i)){
intmin=0;
for(intj=1;j<=n;j++){
if(a[i][j]!
=NoEdge&&!
min){
min=a[i][j];
}
elseif(a[i][j]!
=NoEdge&&min>a[i][j]){
min=a[i][j];
}
}
if(m&&m>min){
m=min;
k=i;
}
elseif(!
m){
m=min;
k=i;
}
}
}
returnk;
}
int**AdjacencyWDigraph:
:
SpanningMinTree(){
intx;
if(!
Connected(x)){
cout<<"该图不是连通图,无法生成树!
"<return0;
}
else{
int**b=newint*[n+1];
for(inti=1;i<=n;i++)
b[i]=newint[n+1];
for(inti=1;i<=n;i++)
for(intj=1;j<=n;j++)
b[i][j]=0;
int*reach=newint[n+1];
for(inti=1;i<=n;i++)
reach[i]=0;
x=MinNum();
reach[x]=1;
intk1,k2,z,min=1;
while(min){
min=0;
for(inti=1;i<=n;i++)
if(reach[i]){
k2=Min(i,reach);
if(k2&&!
min){
min=a[i][k2];
z=i;
k1=k2;
}
elseif(k2&&min>a[i][k2]){
min=a[i][k2];
z=i;
k1=k2;
}
}
reach[k1]=1;
b[z][k1]=a[z][k1];
}
delete[]reach;
returnb;
}
}
Adjacencywgraph.h
#ifndefADJACENCYWGRAPH_H
#defineADJACENCYWGRAPH_H
#include"adjacencywdigraph.h"
classAdjacencyWGraph:
publicAdjacencyWDigraph{
public:
AdjacencyWGraph(intVertices=10,intnoEdge=0):
AdjacencyWDigraph(Vertices,noEdge){}
AdjacencyWGraph&Add(inti,intj,constint&w=1);
AdjacencyWGraph&Delete(inti,intj);
intDegree(inti){returnOutDegree(i);}
boolConnected();
int**SpanningTree();
int**SpanningMinTree();
intMinNum();
};
#endif
Adjacencywgraph.cpp
#include
#include
usingnamespacestd;
#include"adjacencywgraph.h"
AdjacencyWGraph&AdjacencyWGraph:
:
Add(inti,intj,constint&w){
if(i<1||j<1||i>n||j>n)
cout<<"错误!
点"<
elseif(a[i][j]!
=NoEdge)
cout<<"错误!
该边已存在,无法再添加"<else{
a[i][j]=w;
a[j][i]=w;
e++;
}
return*this;
}
AdjacencyWGraph&AdjacencyWGraph:
:
Delete(inti,intj){
if(i<1||j<1||i>n||j>n||a[i][j]==NoEdge)
cout<<"错误!
该边不存在,无法删除"<else{
a[i][j]=NoEdge;
a[j][i]=NoEdge;
e--;
}
return*this;
}
boolAdjacencyWGraph:
:
Connected(){
int*reach=newint[n+1];
for(inti=1;i<=n;i++)
reach[i]=0;
BFS(1,reach,1);
for(inti=1;i<=n;i++)
if(!
reach[i])
returnfalse;
returntrue;
}
int**AdjacencyWGraph:
:
SpanningTree(){
if(!
Connected()){
cout<<"该图不是连通图,无法生成树!
"<return0;
}
else{
InitializePos();
queueq;
int**b=newint*[n+1];
for(inti=1;i<=n;i++)
b[i]=newint[n+1];
for(inti=1;i<=n;i++)
for(intj=1;j<=n;j++)
b[i][j]=0;
int*reach=newint[n+1];
for(inti=1;i<=n;i++)
reach[i]=0;
reach[1]=1;
q.push
(1);
while(!
q.empty()){
intw=q.front();
q.pop();
intu=Begin(w);
while(u){
if(!
reach[u]){
q.push(u);
b[w][u]=b[u][w]=a[w][u];
reach[u]=1;
}
u=NextVertex(w);
}
}
DeactivatePos();
delete[]reach;
returnb;
}
}
intAdjacencyWGraph:
:
MinNum(){
intd=0,e=0,min=0;
for(inti=1;i<=n;i++){
for(intj=1;j<=n;j++){
if(a[i][j]!
=NoEdge&&!
min){
min=a[i][j];
d=i;
e=j;
}
elseif(a[i][j]!
=NoEdge&&a[i][j]min=a[i][j];
d=i;
e=j;
}
}
}
returnd;
}
int**AdjacencyWGraph:
:
SpanningMinTree(){
if(!
Connected()){
cout<<"该图不是连通图,无法生成树!
"<return0;
}
else{
int**b=newint*[n+1];
for(inti=1;i<=n;i++)
b[i]=newint[n+1];
for(inti=1;i<=n;i++)
for(intj=1;j<=n;j++)
b[i][j]=0;
int*reach=newint[n+1];
for(inti=