數據結構與算法 第四次實驗報告 圖

數據結構與算法node

第四次實驗報告ios

 

 

 

姓名:許愷算法

學號:2014011329數組

班級:計算機14-1數據結構

 

 

 

 

 

 

 

 

中國石油大學(北京)計算機科學與技術系函數

 

 

 

 

 

一、圖的定義,文件爲"Graph.h"測試

#ifndef GRAPH_H//定義頭文件spa

#define GRAPH_H指針

#include<string>//引入標準庫中的頭文件blog

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

功能:修改頂點v一、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" << "\n";

cout << "二、須要修改請按2" << "\n";

cout << "三、Dijkstra求最短路徑請按3" << "\n";

cout << "四、刪除某個頂點請按4" << "\n";

cout << "五、插入某個頂點請按5" << "\n";

cout << "六、刪除某條邊請按6" << "\n";

cout << "七、插入某條邊請按7" << "\n";

cout << "八、退出請按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" << endl;

cout << "二、插入頂點請按2" << endl;

cout << "三、修改頂點請按3" << endl;

cout << "四、刪除頂點請按4" << endl;

cout << "五、深度優先遍歷請按5" << endl;

cout << "六、廣度優先遍歷請按6" << endl;

cout << "七、退出請按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.注意區別正、逆鄰接矩陣。

程序運行貼圖:

廣度優先遍歷

 

 

 

心得和總結:

 此次的報告經由老師大大的點撥會了好多,並且課件上也有代碼,方便點直接拿過來就能夠了,可是我不想這麼作,代碼是我本身打的,雖然也借鑑了課件,可是基本仍是以學知識爲主,畢竟是吃飯的本事,不能這麼草草了事,但願我能在之後也靈活運用這裏的知識。

相關文章
相關標籤/搜索