數據結構與算法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.注意區別正、逆鄰接矩陣。
程序運行貼圖:
廣度優先遍歷
心得和總結:
此次的報告經由老師大大的點撥會了好多,並且課件上也有代碼,方便點直接拿過來就能夠了,可是我不想這麼作,代碼是我本身打的,雖然也借鑑了課件,可是基本仍是以學知識爲主,畢竟是吃飯的本事,不能這麼草草了事,但願我能在之後也靈活運用這裏的知識。