码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构与算法 第四次实验报告 图

时间:2017-02-21 21:53:52      阅读:487      评论:0      收藏:0      [点我收藏+]

标签:需要   family   turn   blog   nbsp   功能   深度优先遍历   出图   而且   

数据结构与算法

第四次实验报告

 

 

 

姓名:许恺

学号:2014011329

班级:计算机14-1

 

 

 

 

 

 

 

 

中国石油大学(北京)计算机科学与技术系

 

 

 

 

 

1、图的定义,文件为"Graph.h"

#ifndef GRAPH_H//定义头文件

#define GRAPH_H

#include<string>//引入标准库中的头文件

using namespace std;

const int MaxSize=12;

struct ArcNode//定义边表结点

{

int adjvex;//邻接点域

ArcNode *next;//指向下一个边结点的指针

};

template <class T>

struct VertexNode//定义顶点表结点

{

T vertex;//顶点的名称

ArcNode *firstedge;//边表的头指针

};

template <class T>

class Graph

{

public:

//*****************************邻接矩阵函数***********************************//

Graph(int* a, T* v,int n );//构造函数,初始化具有n个顶点的图

~Graph( );//析构函数

void Dijkstra( int v,int endv);//最小距离

void Floyd();

void PutOutVexInfo();//取顶点信息

void PutOutArcInfo();//输出路径

void SetArc(int v1,int v2,int arclength);//修改路径

void DeleteVex(int pos);//删除顶点pos的信息

void InsertVex(int num,T name);//在num的位置上插入一顶点,值为name

void DeleteArc(int i, int j);//在图中删除一条边,其依附的两个顶点的编号为i和j

void InsertArc(int i, int j,int n);//在图中插入一条边,其依附的两个顶点的编号为i和j

//*****************************邻接表函数************************************//

Graph(T a[ ], int n, int e);//构造函数,初始化具有n个顶点的图

T GetVex_L(int i); //取图中第i个顶点数据信息

void PutVex_L(int i, T value); //将图中第i个顶点的数据域置为value

void InsertVex_L(int i, T value); //在图中插入一个顶点,其编号为i,值为value

void DeleteVex_L(int i); //删除图中第i个顶点

void InsertArc_L(int i, int j); //在图中插入一条边,其依附的两个顶点的编号为i和j

void DeleteArc_L(int i, int j); //在图中删除一条边,其依附的两个顶点的编号为i和j

void DFSTraverse_L(int v); //深度优先遍历图

void BFSTraverse_L(int v); //广度优先遍历图

private:

int vertexNum,arcNum; //图的顶点数和边数

//*****************************邻接矩阵************************************//

T vertex[MaxSize]; //存放图中顶点的数组

int arc[MaxSize][MaxSize]; //存放图中边的数组

//*****************************邻接表************************************//

VertexNode<T> adjlist[MaxSize];

};

#endif

2、图的实现函数,文件为“Graph.cpp”

#include<iostream>

#include <string> //引入标准库中的头文件

#include "Graph.h" //引入头文件

using namespace std;

//****************************邻接矩阵图操作**********************************//

/*

前置条件:图不存在

输入:无

功能:图的初始化

输出:无

后置条件:构造一个有值的图

*/

template <class T>

Graph<T>::Graph(int* a,T* v, int n )//构造图

{

int i,j;

vertexNum=n;//顶点数

for (i=0; i<MaxSize; i++)//初始化邻接矩阵

  for (j=0; j<MaxSize; j++)//定义边

    arc[i][j] = 10000;

for ( i=0; i<vertexNum; i++)

  vertex[i]=v[i];//存储顶点信息

for (i=0; i<vertexNum; i++)//给边赋置

  for (j=0; j<vertexNum; j++)

    arc[i][j]=*(a+i*n+j);

}

/*

前置条件:图已存在

输入:无

功能:输出图中所有顶点的数据信息

输出:图中所有顶点的数据信息

后置条件:图保持不变

*/

template <class T>

void Graph<T>::PutOutVexInfo()//取顶点

{

int i=0;//假设源点是第0个顶点,即顶点序号是0

if (i>vertexNum) throw "位置";//错误抛出异常

else

{

  for(i=0;i<vertexNum;i++)//输出图中所有的顶点

  {

    cout<<vertex[i]<<"\n";

  }

}

}

/* 前置条件:图已存在

输入:顶点v1,v2

功能:修改顶点v1、v2的路径

输出:修改后图中所有的路径

后置条件:图保持不变

*/

template <class T>

void Graph<T>::SetArc(int v1,int v2,int arclength)//修改路径

{ //假设源点是第0个顶点,即顶点序号是0

if ( v1>vertexNum|| v2>vertexNum) throw "位置";//错误抛出异常

else

{

arc[v1][v2]=arclength; //修改v1顶点到v2顶点的距离

arc[v2][v1]=arclength;

}

}

/*

前置条件:图已存在

输入:无

功能:输出图中所有的路径

输出:图中所有顶点的数据信息

后置条件:图保持不变

*/

template <class T>

void Graph<T>::PutOutArcInfo()//输出图中所有的路径

{

int i=0;//假设源点是第0个顶点,即顶点序号是0

int j=0;

if ( i>vertexNum|| j>vertexNum) throw "位置";//错误抛出异常

else

{

for(i=0;i<vertexNum;i++)

{//输出任意两点之间的路径

for(j=0;j<i;j++)

{

if(arc[i][j]<10000)//两点之间存在路径

//若两点间有路,则输出该两点间的路径

  cout<<"从"<<vertex[i]<<"到"<<vertex[j]<<"的路径长度为:"<<arc[i][j]<<"\n";

}

}

}

}

/*

前置条件:图已存在

输入:顶点name,位置i

功能:在图中i位置插入一个顶点name

输出:如果插入不成功,抛出异常

后置条件:如果插入成功,图中增加了一个顶点

*/

template <class T>

void Graph<T>::InsertVex(int num,T name)//在图中插入一个顶点,其编号为i,值为value

{ //假设源点是第0个顶点,即顶点序号是0

if ( num<0|| num>vertexNum) throw "位置";//如果num输入不正确抛出异常

int row;//行

int col;//列

int numv;//最后一个顶点所在的位置

numv = vertexNum-1;

if(num>-1)//num存在

  vertexNum++;//顶点数加1

for(int i=numv;i>num-1;i--)//i从最后一个顶点的下一个位置开始循环

  vertex[i]=vertex[i-1];//把从num位置的顶点到最后一个顶点均向后移一位

vertex[num]=name;//把要插入的顶点的值放在num位置上

for(row=numv;row>=0;row--)//把从num列到最后一列的元素均向下移一列

{

for(col=numv;col>=num;col--)

  arc[row][col+1]=arc[row][col];

arc[row][num]=10000;

}

for(row=numv;row>=num;row--)//把从num行到最后一行的元素均向下移一行

for(col=0;col<=numv+1;col++)

  arc[row+1][col]=arc[row][col];

for(col=0;col<vertexNum;col++)

  arc[num][col]=10000;//把num位置所在的行、列的值均置为无穷大

}

/*

前置条件:图已存在

输入:顶点pos

功能:在图中删除顶点pos

输出:如果删除不成功,抛出异常

后置条件:如果删除成功,图中减少了一个顶点,相应顶点所建立的边也消去

*/

template <class T>

void Graph<T>::DeleteVex(int pos)//删除第pos个顶点

{ //假设源点是第0个顶点,即顶点序号是0

if ( pos<0|| pos>MaxSize) throw "位置";//如果pos输入不正确抛出异常

int row;//行

int col;//列

int numv=vertexNum;//numv等于顶点数

if(pos>-1)//pos存在

{

for(int i=pos;i<numv-1;i++)

  vertex[i]=vertex[i+1];//把从pos到最后的每个点的位置依次向前移一位

vertexNum--;//顶点数减1

for(row=0;row<numv;row++)

{

for(col=pos;col<numv;col++)

  arc[row][col]=arc[row][col+1];//从pos列到最后一列的元素均向前移一列

arc[row][numv-1]=10000;//把pos所在的列上的值置为无穷大

}

for(row=pos;row<numv;row++)

  for(col=0;col<numv;col++)

    arc[row][col]=arc[row+1][col];//从pos行到最后一行的元素均向上移一行

}

}

/*

前置条件:图已存在

输入:顶点v ,endv

功能:假如endv存在,求v到endv的最短路径;假如不输入endv,则求v到任意顶点的最短路径

输出:所求得的最短路径及所经历的位置

后置条件:图保持不变

*/

template <class T>

void Graph<T>::Dijkstra(int v,int endv)//求最短路径,从v顶点到endv点的最短路径

{

if ( v>vertexNum) throw "位置";//v顶点或endv顶点输出不正确则抛出异常

int numv=vertexNum;//顶点数

int dist[MaxSize];//最短长度

int path[MaxSize];//当前找到的最短路径

int s[MaxSize];//存放源点和已生成的终点的集合

int max= 10000;//代表无穷大

int i,j,k,wm;

for(i=0;i<numv;i++)//按网的邻接矩阵确定各顶点最短路径的初值

{

dist[i]=arc[v][i];

if(i!=v&& dist[i]< max)//如果v、i之间有路

  path[i]=v;//当前找到的最短路径为v

else

  path[i]=-1;//否则v与i顶点不存在路径

s[i] = 0;//给s集合确定初值0

}

s[v]=1;dist[v]=0;//将顶点v本身排除在外

for(k =0;k<numv-1;k++)//求其他numv-1各顶点的最短路径

{

wm = max;j=v;//确定当前最短路径wm及顶点的序号j

for( i=0;i<numv;i++)

{

if(!s[i]&&dist[i]<wm)//如果v、i之间有路

{

j=i;

wm = dist[i];//把当前找到的路径确定为最大值

}

}

s[j]=1;

for(i =0;i<numv;i++)//更新未确定最短路径各顶点的当前最短路径

{

//如果v、i两点的距离加上i、j小于从v点到j点的距离

if(!s[i]&&dist[j]+arc[j][i]<dist[i])

{

  dist[i]=dist[j]+arc[j][i];path[i]=j;//dist[i]取最小值

}

}

}

if (endv < numv && endv >=0 )//endv点存在

{

string mmm="";//初始化字符串

int j =endv;

while(j > -1 )

{

string nnn = vertex[j];//依次把顶点存放在nnn字符串中

nnn+=mmm;

mmm = " "+nnn;

j = path[j];

}

//输出从v点到endv点的最短路径

cout<<"从 "<<vertex[v].c_str()<<" 到 "

<<vertex[endv].c_str()<<" 的最短路径长度:"

<<dist[endv]<<" 路径:"<<mmm.c_str()<<"\n";

}

else//endv点不存在

for(i=0;i<numv;i++)

{

string mmm="";//初始化字符串

int j =i;

while(j > -1 )

{

string nnn = vertex[j];//依次把顶点存放在nnn字符串中

nnn+=mmm;

mmm = " "+nnn;

j = path[j];

}

cout<<"从 "<<vertex[v].c_str()<<" 到 "

<<vertex[i].c_str()<<" 的最短路径长度:"<<dist[i]<<" 路径:"

<<mmm.c_str()<<"\n";//输出从v点到任意点的最短路径

}

}

/*

前置条件:图已存在

输入:顶点n、w

功能:在图中删除顶点n、w 依附的边

输出:如果删除不成功,抛出异常

后置条件:如果删除成功,图中减少了一条边

*/

template <class T>

void Graph<T>::DeleteArc(int n, int w)//删除i、j两顶点依附的边

{

if ( n>MaxSize|| w>MaxSize) throw "位置";//如果输入不正确抛出异常

arc[n][w]=arc[w][n]=10000;//删除w顶点和n顶点之间的路径

}

/* 前置条件:图已存在

输入:顶点i、j

功能:在图中插入顶点i、j及其所依附的边

输出:如果插入不成功,抛出异常

后置条件:如果插入成功,图中增加了一条边

*/

template <class T>

void Graph<T>::InsertArc(int i, int j,int n)//在图中插入一条边,其依附的两个顶点的编号为i和j

{

if ( i>MaxSize||j>MaxSize) throw "位置";//如果输入不正确抛出异常

arc[i][j]=n;

arc[j][i]=n;

//输出所插入的两个顶点之间的距离

cout<<"从"<<vertex[i]<<"到"<<vertex[j]<<"的路径长度为:"<<arc[i][j]<<"\n";

}

/* 前置条件:图已存在

输入:顶点i、j

功能:在图中插入顶点i、j及其所依附的边

输出:如果插入不成功,抛出异常

后置条件:如果插入成功,图中增加了一条边

*/

template <class T>

void Graph<T>::Floyd()

{

int i,j,k;

int dist[8][8];

string path[8][8];

for (i=0; i<vertexNum; i++)

for (j=0; j<vertexNum; j++)

{

dist[i][j]=arc[i][j];

if (dist[i][j]!=10000)

  path[i][j]=vertex[i]+vertex[j];

else path[i][j]="";

}

for (k=0; k<vertexNum; k++)

  for (i=0; i<vertexNum; i++)

    for (j=0; j<vertexNum; j++)

if (dist[i][k]+dist[k][j]<dist[i][j])

{

dist[i][j]=dist[i][k]+dist[k][j];

path[i][j]=path[i][k]+path[k][j];

}

for(i=0;i<8;i++)

  for(j=0;j<8;j++)

    cout<<"从 "<<vertex[i].c_str()<<" 到 "<<vertex[j].c_str()<<" 的最短路径长度:"<<dist[i][j]<<" 路径:"<<path[i][j]<<"\n";

    //输出从v点到任意点的最短路径

}

//****************************邻接表图操作************************************//

/*

*前置条件:图不存在

*输 入:无

*功 能:图的初始化

*输 出:无

*后置条件:得到一个有向图

*/

template <class T>

Graph<T>::Graph(T a[ ], int n, int e)

{

arcNum = e;//边数

vertexNum=n;//顶点数

int i,j;

for (i=0; i<vertexNum; i++)

{

VertexNode<T> tempvertex;

tempvertex.vertex = a[i];

tempvertex.firstedge = NULL;

adjlist[i] = tempvertex;

}

for (int k=0; k<arcNum; k++)//依次输入每一条边,并在相应边表中插入结点

{

cout<<"请输入边所依附的两个顶点的序号";

cin>>i>>j;//输入边所依附的两个顶点的序号

ArcNode *s=new ArcNode; s->adjvex=j; //生成一个边表结点s

s->next=adjlist[i].firstedge;//将结点s插入到结点i的边表的表头

adjlist[i].firstedge=s;

}

InsertArc_L(0,1);//插入边

InsertArc_L(0,2);

InsertArc_L(0,3);

InsertArc_L(1,3);

InsertArc_L(1,4);

InsertArc_L(2,0);

InsertArc_L(2,4);

InsertArc_L(3,1);

InsertArc_L(3,4);

InsertArc_L(4,2);

InsertArc_L(4,3);

}

/* 前置条件:图已存在

* 输 入:无

* 功 能:销毁图

* 输 出:无

* 后置条件:释放图所占用的存储空间

*/

template <class T>

Graph<T>::~Graph( )

{

for (int i=0; i<vertexNum; i++)

{

ArcNode * p=adjlist[i].firstedge;

while (p!=NULL)//循环删除

{

adjlist[i].firstedge=p->next;

delete p;//释放结点空间

p=adjlist[i].firstedge;

}

}

}

/*

*前置条件:图已存在

*输 入:顶点i

*功 能:输出图中顶点i的数据信息

*输 出:图中顶点i的数据信息

*后置条件:图保持不变

*/

template <class T>

T Graph<T>::GetVex_L(int i)

{

if ( i>vertexNum || i<0 ) throw "输入顶点的位置不正确"; //顶点i不存在则抛出异常

return adjlist[i].vertex;//返回第i个顶点的数据域

}

/*

*前置条件:图已存在

*输 入:顶点i

*功 能:将图中顶点i的数据域置为value

*输 出:无

*后置条件:图保持不变

*/

template <class T>

void Graph<T>::PutVex_L(int i, T value)

{

if ( i>vertexNum || i<0 ) throw "输入顶点的位置不正确"; //顶点i不存在则抛出异常

adjlist[i].vertex = value;//第i个顶点的数据域置为value

}

/*

*前置条件:图已存在

*输 入:顶点value,位置i

*功 能:在图中i位置插入一个顶点name

*输 出:如果插入不成功,抛出异常

*后置条件:如果插入成功,图中增加了一个顶点

*/

template <class T>

void Graph<T>::InsertVex_L(int i, T value)

{

if ( i>vertexNum || i<0 || i>MaxSize ) throw "输入顶点的位置不正确"; //顶点i不存在则抛出异常

vertexNum++;//顶点数加1

VertexNode<T> tempvertex;

tempvertex.vertex = value;

tempvertex.firstedge = NULL;

adjlist[i] = tempvertex;//第i个顶点的数据域置为value

}

/*

*前置条件:图已存在

*输 入:顶点i

*功 能:在图中删除顶点i

*输 出:如果删除不成功,抛出异常

*后置条件:如果删除成功,图中减少了一个顶点,相应顶点所建立的边也消去

*/

template <class T>

void Graph<T>::DeleteVex_L(int i)

{

if ( i<0 || i>MaxSize) throw "位置";//顶点输入错误则抛出异常

int k;

for ( k=0; k<vertexNum; k++)//删掉入度边

if(k!=i) DeleteArc(k, i);

ArcNode *s;//生成一个边表结点s

if( adjlist[i].firstedge != NULL)

{

ArcNode *s;

s=adjlist[i].firstedge->next;

while(s!=NULL)

{

ArcNode *p;

p = s;

adjlist[i].firstedge->next = s->next;

s=s->next;

delete p;//删除p结点

}

s=adjlist[i].firstedge;

adjlist[i].firstedge=NULL;

delete s;

}

for (k=i; k<vertexNum; k++)

{

  adjlist[k]=adjlist[k+1];//存储顶点信息

}

vertexNum--;//顶点数减1

for (k=0; k<vertexNum; k++)

if( adjlist[k].firstedge != NULL )

{

s=adjlist[k].firstedge;//将结点s插入到结点i的边表的表头

while(s!=NULL)

{

  if(s->adjvex > i)//搜索i结点

    s->adjvex--;

  s = s->next;

}

}

}

/*

*前置条件:图已存在

*输 入:顶点i、j

*功 能:在图中插入顶点i、j及其所依附的边

*输 出:如果插入不成功,抛出异常

*后置条件:如果插入成功,图中增加了一条边

*/

template <class T>

void Graph<T>::InsertArc_L(int i, int j)

{

if ( i>MaxSize || j>MaxSize) throw "位置";//顶点输入错误则抛出异常

ArcNode *s=new ArcNode; s->adjvex=j;//生成一个边表结点s

s->next=adjlist[i].firstedge;//将结点s插入到结点i的边表的表头

adjlist[i].firstedge=s;

}

/*

*前置条件:图已存在

*输 入:顶点i、j

*功 能:在图中删除顶点i、j 依附的边

*输 出:如果删除不成功,抛出异常

*后置条件:如果删除成功,图中减少了一条边

*/

template <class T>

void Graph<T>::DeleteArc_L(int i, int j)

{

if ( i>MaxSize|| j>MaxSize) throw "位置"; //顶点输入错误则抛出异常

ArcNode *s;

ArcNode *tempnode;

s = adjlist[i].firstedge;

tempnode = adjlist[i].firstedge;

while(s!=NULL && s->adjvex!=j)

{

tempnode = s;

s = s->next;

}

if(s!=NULL)

{

tempnode->next = s->next;

delete s;

}

}

/*

*前置条件:图已存在

*输 入:遍历的起始顶点v

*功 能:从顶点v出发深度优先遍历图

*输 出:图中顶点的一个线性排列

*后置条件:图保持不变

*/

template <class T>

void Graph<T>::DFSTraverse_L(int v)

{

if ( v>vertexNum) throw "位置";//顶点输入错误则抛出异常

ArcNode * p;

int j;

cout<<adjlist[v].vertex<<" ";

visited[v]=1;

p=adjlist[v].firstedge;

while (p)//依次搜索顶点v的邻接点j

{

j=p->adjvex;

if (visited[j]==0) DFSTraverse_L(j);

p=p->next;

}

}

/*

*前置条件:图已存在

*输 入:遍历的起始顶点v

*功 能:从顶点v出发广度优先遍历图

*输 出:图中顶点的一个线性排列

*后置条件:图保持不变

*/

template <class T>

void Graph<T>::BFSTraverse_L(int v)

{

if(v>vertexNum) throw "weizhi";

int  Q[9];

int front ,rear,j;

ArcNode *p=NULL;

front = -1;

rear = -1; //初始化顺序队列

cout << adjlist[v].vertex<<"  ";

visited[v] = 1;

Q[++rear] = v;

while (front != rear) //当队列非空时

{

v=  Q[++front] ;

p = adjlist[v].firstedge; //工作指针p指向顶点v的边表

while (p != NULL)

{

j = p->adjvex;

if (visited[j] == 0)

{

cout << adjlist[j].vertex<< "  ";

visited[j] = 1;

Q[++rear] = j;

}

p=p->next;

}

}

}

3、图的测试函数,文件为“GraphMain.cpp”

#include <iostream>

#include <string>//引入标准库中的头文件

#include "Graph.cpp"//引用 Graph.cpp 文件

using namespace std;

int main(int argc, char* argv[])

{

const int numv = 8;//顶点数

int choose=1;//控制

int which;//功能选择变量

string name;//插入顶点的值

int cost[numv][numv]={//按邻接矩阵确定顶点的权值

{10000,130,80,260,10000,10000,10000,10000},

{130,10000,10000,75,10000,265,10000,10000},

{80,10000,10000,10000,50,10000,10000,10000},

{260,75,10000,10000,120,85,400,10000},

{10000,10000,50,120,10000,10000,350,200},

{10000,265,10000,85,10000,10000,120,10000},

{10000,10000,10000,400,350,120,10000,150},

{10000,10000,10000,10000,200,10000,150,10000}

};//当前找到的最短路径

string vname[numv]={"一教","二教","三教","图书馆","新食堂","逸夫楼","学研大厦","校医院"}; //初始化各顶点

int* p;//定义指针p

string* q;//定义指针q

p = &cost[0][0];//p指针指向cost数组的起始位置

q = vname;//q指针指向vname数组

Graph<string> g(p, q, numv );//调用Graph程序

while ( choose==1 )//控制

{

cout << "-------功能选项---------" << "\n";

cout << "0、查看顶点信息请按0" << "\n";//输入你要进行的操作的序号

cout << "1、查看边的信息请按1" << "\n";

cout << "2、需要修改请按2" << "\n";

cout << "3、Dijkstra求最短路径请按3" << "\n";

cout << "4、删除某个顶点请按4" << "\n";

cout << "5、插入某个顶点请按5" << "\n";

cout << "6、删除某条边请按6" << "\n";

cout << "7、插入某条边请按7" << "\n";

cout << "8、退出请按8" << "\n";

cout << "-----------------------" << "\n";

cin >> which;

switch( which )//功能选择

{

case 0: //输出图的各顶点的值

try

{

  cout << "顶点信息如下:"<< "\n";

  g.PutOutVexInfo();

}

catch(char*)

{

  cout<<"输出不正确!"<<endl;

}

break;

case 1://输出图中的路径

int i;

int j;

cout<<"所有的边的信息为:"<<"\n";

try

{

  g.PutOutArcInfo();

}

catch(char*)

{

  cout<<"输出不正确!"<<endl;

}

break;

case 2://修改图中的边长

cout<<"change";

cin>>i>>j;

int length;

cout<<"length";

cin>>length;

try

{

  g.SetArc(i,j,length);

}

catch(char*)

{

  cout<<"输出顶点不正确!"<<endl;

}

break;

case 3://求最短路径

cout<<"请输入源顶点:"<<"\n";

int vv ;

cin>>vv;

cout<<"请输入结束顶点,若要全部显示请输入88:"<<"\n";

int vvt ;

cin>>vvt;

try

{

  g.Dijkstra(vv,vvt);

}

catch(char*)

{

  cout<<"输出顶点不正确!"<<endl;

}

break;

case 4://删除hh顶点

int hh ;

cout<<"请输入要删除的顶点"<<"\n";

cin>>hh;

try

{

  g.DeleteVex(hh);

}

catch(char*)

{

  cout<<"删除失败!"<<endl;

}

break;

case 5://在nn位置插入值为name的顶点

int nn ;

cout<<"请输入要插入的顶点的位置和名称"<<"\n";

cin>>nn>>name;

try

{

  g.InsertVex(nn,name);

}

catch(char*)

{

  cout<<"插入失败!"<<endl;

}

break;

case 6://删除pos1到pos2之间的距离

int pos1;

int pos2;

cout<<"请输入两顶点:"<<"\n";

cin>>pos1>>pos2;

try

{

  g.DeleteArc(pos1,pos2);

}

catch(char*)

{

  cout<<"插入失败!"<<endl;

}

break;

case 7://插入从pos1到pos2的路径

int m;

cout<<"请输入两顶点:"<<"\n";

cin>>pos1>>pos2;

cout<<"请输入路径:"<<"\n";

cin>>m;

try

{

  g.InsertArc(pos1,pos2,m);

}

catch(char*)

{

  cout<<"插入失败!"<<endl;

}

break;

case 8://退出

choose=0;

break;

}

}

return 0;

}

4、图的邻接表测试函数,文件为“GraphMain_L.cpp”

#include <iostream>

#include <string>

#include "graph.cpp"

using namespace std;

int visited[MaxSize];

void main( )

{

int which;

int j;

string name;

int choose=1;

string a[5] = {"石油大学(北京)","政法大学","化工大学","北京警察学院","国防大学"};

Graph<string> algraphTest( a, 5, 0); //构造图

while ( choose==1 )//控制

{

cout << "-------功能选项---------" << "\n";

cout << "0、输出顶点信息请按0" << endl;//输入所要进行的操作的序号

cout << "1、输出任意一个顶点信息请按1" << endl;

cout << "2、插入顶点请按2" << endl;

cout << "3、修改顶点请按3" << endl;

cout << "4、删除顶点请按4" << endl;

cout << "5、深度优先遍历请按5" << endl;

cout << "6、广度优先遍历请按6" << endl;

cout << "7、退出请按7" << endl;

cin >> which;

switch( which )//功能选择

{

case 0:

for(j=0;j<5;j++ )

cout<<algraphTest.GetVex_L(j)<<" ";//输出顶点

cout<<endl;

break;

case 1:

int i;

cout<<"请输入顶点:"<<endl;

cin>>i;

try

{

  cout<<algraphTest.GetVex_L(i)<<endl;//输出i顶点的数据域

}

catch(char* s)

{

  cout<<s<<endl;

}

break;

case 2://在图中的i位置插入一顶点值为name

cout<<"请输入顶点及名字:"<<endl;

cin>>i>>name;

try

{

  algraphTest.InsertVex_L(i, name);

}

catch(char* s)

{

  cout<<s<<endl;

}

break;

case 3://修改图中一顶点的值

cout<<"请输入顶点及名字:"<<endl;

cin>>i>>name;

try

{

  algraphTest.PutVex_L(i, name);

}

catch(char* s)

{

  cout<<s<<endl;

}

break;

case 4://删除图中一顶点的值

cout<<"请输入顶点:"<<endl;

cin>>i;

try

{

  algraphTest.DeleteVex_L(i);

}

catch(char* s)

{

  cout<<s<<endl;

}

break;

case 5://图的深度优先搜索

cout<<"请输入顶点:"<<endl;

cin>>i;

cout<<endl<<"从第"<<i<<"个顶点深度优先遍历图"<<endl;

try

{

  for (int ii=0; ii<MaxSize; ii++) visited[ii] = 0;

  algraphTest.DFSTraverse_L(i);

}

catch(char* s)

{

  cout<<s<<endl;

}

break;

case 6://图的广度优先搜索

cout<<"请输入顶点:"<<endl;

cin>>i;

cout<<endl<<"从第"<<i<<"个顶点广度优先遍历图"<<endl;

try

{

  for (int ii=0; ii<MaxSize; ii++) visited[ii] = 0;

  algraphTest.BFSTraverse_L(i);

}

catch(char*s)

{

  cout<<s<<endl;

}

break;

case 7://退出

choose=0;

break;

}

}

}

注意问题

1.注意理解各算法实现时所采用的存储结构。

2.注意区别正、逆邻接矩阵。

程序运行贴图:

广度优先遍历

 技术分享

 

 

心得和总结:

 这次的报告经由老师大大的点拨会了好多,而且课件上也有代码,方便点直接拿过来就可以了,但是我不想这么做,代码是我自己打的,虽然也借鉴了课件,但是基本还是以学知识为主,毕竟是吃饭的本事,不能这么草草了事,希望我能在以后也灵活运用这里的知识。

数据结构与算法 第四次实验报告 图

标签:需要   family   turn   blog   nbsp   功能   深度优先遍历   出图   而且   

原文地址:http://www.cnblogs.com/xukaiae86/p/6426293.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!