山东大学数据结构实验报告八.docx

上传人:b****8 文档编号:11446114 上传时间:2023-03-01 格式:DOCX 页数:23 大小:55.17KB
下载 相关 举报
山东大学数据结构实验报告八.docx_第1页
第1页 / 共23页
山东大学数据结构实验报告八.docx_第2页
第2页 / 共23页
山东大学数据结构实验报告八.docx_第3页
第3页 / 共23页
山东大学数据结构实验报告八.docx_第4页
第4页 / 共23页
山东大学数据结构实验报告八.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

山东大学数据结构实验报告八.docx

《山东大学数据结构实验报告八.docx》由会员分享,可在线阅读,更多相关《山东大学数据结构实验报告八.docx(23页珍藏版)》请在冰豆网上搜索。

山东大学数据结构实验报告八.docx

山东大学数据结构实验报告八

山东大学软件工程学院

数据结构课程实验报告

 

学号:

姓名:

班级:

软件工程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=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 动物植物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1