⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 校园导游图.cpp

📁 一个用最短距离法来实现的校园导游算法
💻 CPP
📖 第 1 页 / 共 3 页
字号:
template<class T> 
stacklist<T>::stacklist(const stacklist<T> & v)
:data(v.data){}

template<class T> 
void stacklist<T>::deleteallvalues()
{
	data.deleteallvalues();
}

template<class T> 
T stacklist<T>::pop()
{
	//弹出并返回表首元素
	assert(!isempty());

	   T result=data.firstelement();
	   //从表中移出元素
	   data.removefirst();
       return result;
	   
}

template<class T> 
T stacklist<T>::top()const
{
	assert(!isempty());
	  return (data.firstelement());
}

template<class T> 
int stacklist<T>::isempty()const
{
    return (data.isempty());
}

template<class T> 
void stacklist<T>::push(T val)
{
	data.add(val);
}

//***********************************************************************listiterator
template<class T>class listiterator:public iterator<T>
{
	public: 
		listiterator(list<T>& );
		virtual  int  init();       //初始化游标
  		virtual  int operator!();
  		virtual  T  operator()();
  		virtual  int operator++();  //只有该操作能改变游标指向
  		virtual  void operator=(T);
		void  removecurrent();      //删除当前结点
		void  addbefore(T);         //在当前结点前插入
		void  addafter(T);          //在当前结点后插入
	protected:
		link<T> * currentlink;      //遍历中的游标(指针)
		link<T> * previouslink;     //遍历中的前驱游标(指针)
		list<T>& thelist;           //引用一个表
};

//-----------------------------------------------------------------------
template<class T>listiterator<T>::listiterator(list<T>& alist):thelist(alist)
{
	init();
}

//------------------------------------------------------------------------
template<class T>int listiterator<T>::init()
{    
	previouslink=0;
	currentlink=thelist.ptrtofirstlink;
	return currentlink!=0;
}

//--------------------------------------------------------
template<class T>int listiterator<T>::operator!()
{
	if(currentlink!=0)
		return 1;
    if(previouslink!=0)
        return previouslink->ptrtonextlink!=0;
    return thelist.ptrtofirstlink!=0;
}

//------------------------------------------------------------------
template<class T>T listiterator<T>::operator()(){
	if (currentlink!=NULL) 	return  currentlink->value;
	else
if (previouslink!=NULL&&previouslink->ptrtonextlink!=NULL)
			return  previouslink->ptrtonextlink->value;
    else if (previouslink==NULL&&thelist.ptrtofirstlink!=NULL)
			return thelist.ptrtofirstlink->value;

assert(previouslink!=NULL&&previouslink->ptrtonextlink
!=NULL||previouslink==NULL&&thelist.ptrtofirstlink!=NULL);
//return 1;
}

//----------------------------------------------------------------------------
template<class T>int listiterator<T>::operator++()
{
	if(currentlink==0)
	{  
		if(previouslink==0)
            currentlink=thelist.ptrtofirstlink;
        else	
			currentlink=previouslink->ptrtonextlink;
	}
    else 
	{
		previouslink=currentlink;
        currentlink=currentlink->ptrtonextlink;
	}
    return currentlink!=0;
}

//---------------------------------------------------------------
template<class T> void listiterator<T>::operator=(T val){
	if (currentlink!=NULL)
	{
		currentlink->value=val; return;
	}
	else
        if (previouslink!=NULL&&previouslink->ptrtonextlink!=NULL)
          previouslink->ptrtonextlink->value=val;return;

			if (previouslink==NULL&&thelist.ptrtofirstlink!=NULL)
               thelist.ptrtofirstlink->value=val; return ;
	
   assert(previouslink!=NULL&&previouslink->ptrtonextlink
   !=NULL||previouslink==NULL&&thelist.ptrtofirstlink!=NULL);
}

//-------------------------------------------------------//删除当前结点
template<class T>void listiterator<T>::removecurrent()
{
	
  link<T> *p;
  if (currentlink!=NULL) {
	if (previouslink==NULL) 
		thelist.ptrtofirstlink=currentlink->ptrtonextlink;
	else previouslink->ptrtonextlink=currentlink->ptrtonextlink;
	delete currentlink;	currentlink=0; 
	return;
  }
  else 
	if (previouslink!=NULL&&previouslink->ptrtonextlink!=NULL){
		p=previouslink->ptrtonextlink;
		previouslink->ptrtonextlink=p->ptrtonextlink;
		delete p; 	return ;
  	}
  	else 
		if (previouslink==NULL&&thelist.ptrtofirstlink!=NULL){
			p=thelist.ptrtofirstlink;
			thelist.ptrtofirstlink=p->ptrtonextlink;
			delete p;
			return ;
  		}
        assert(previousLink!=NULL&&previousLink->ptrToNextLink!=NULL
        ||previousLink==NULL&&theList.ptrToFirstLink!=NULL);
}

//-----------------------------------------------------------
template<class T>void listiterator<T>::addbefore(T val)
{  
	if(previouslink)
       previouslink=previouslink->insert(val);
    else
	{  
	   thelist.list<T>::add(val);
	   previouslink=thelist.ptrtofirstlink;
	}
}

//-----------------------------------------------------------------
template<class T>
void listiterator<T>::addafter(T val){
	//当前结点非空,在当前结点后插入
	if (currentlink!=NULL) 
		currentlink->insert(val);
	else if (previouslink!=NULL)
		   	//当前结点空,但前驱非空
		 if (previouslink->ptrtonextlink!=NULL)
			 //前的后继非空,在前驱的后继结点后插入
			previouslink->ptrtonextlink->insert(val);
	     else 	previouslink->insert(val);
	else if  (thelist.ptrtofirstlink)//表非空,在第一个结点后插入
		     thelist.ptrtofirstlink-> insert(val);
	     else  thelist.add(val);
						//表空,作为第一个结点插入
}

//*********************************************************排序表

template<class T>class orderedlist:public list<T>
{public:
void add(T value);
};


template<class T>void orderedlist<T>::add(T value)
{
	if(ptrtofirstlink==0||value<firstelement())
	{this->list<T>::add(value);
	return;
	}
	listiterator<T>itr(*this);
	for(itr.init();!itr;++itr)
		if(value<itr())
		{itr.addbefore(value);
		return;
		}
		itr.addbefore(value);
}
//*******************************************************************************  typedef
typedef struct {
	int VerCode;
	string VerName;
	string InsInfo;
	double x,y;
}VerType;

//******************************************************************************vertex
template<class T>class vertex
{
public:
   vertex();
   vertex(T init);
   void addarc(vertex<T>&);
   T value;
   list<vertex<T>&> arcs;
//   setlist<vertex<T>&>arcs;
};

template<class T>vertex<T>::vertex()
{
    arcs.deleteallvalues();
}

template<class T>vertex<T>::vertex(T init):value(init){}

//******************************************************************warshall
void warshall(double g[9][9])
{
	int i,j,m;
	for(m=0;m<9;m++)
		for(i=0;i<9;i++)
			for(j=0;j<9;j++)
				g[i][j]=g[i][j]||g[i][m]&&g[m][j];
}

//****************************************************************floyd
void floyd(double g[9][9])
{
	int i,j,m;
	double	newlen;
	for(m=0;m<9;m++)
		for(i=0;i<9;i++)
			for(j=0;j<9;j++){
				newlen=g[i][m]+g[m][j];
				if(newlen<g[i][j])
					g[i][j]=newlen;
			}
}
//****************************************************************floyd1
void floyd1(double g[9][9],unsigned p[9][9])
{
	int i,j,m;
    double newlen;
	for(i=0;i<9;i++)
		for(j=0;j<9;j++)
            p[i][j]=g[i][j]<20?i:-1;
		for(m=0;m<9;m++)
        	for(i=0;i<9;i++)
				for(j=0;j<9;j++){
				newlen=g[i][m]+g[m][j];
				if(newlen<g[i][j]){
					g[i][j]=newlen;
				    p[i][j]=p[m][j];
				}
			}
}

//*****************************************************************main()

void main(){
    char fn[10];
	unsigned n,i,j;
	cout<<"请输入文件名(默认为g2.dat):";
	cin>>fn;
	ifstream fin(fn);                 //文件读入
	if(!fin)
		cout<<"File open Error!"<<endl;
	fin>>n;
//--------------------------------------------------------	
//用二位数组实现原来路径矩阵:	
double g[9][9]={
		{0,     5,     5,     1000,    1000,    7.8,   1000,  1000,   8.1},
		{5,     0,     7.1,   1000 ,   1000 ,   6,     1000,  1000,   1000},
		{5,     7.1,   0,     7.1,     2.2,     5.1,   1000,  000,    4.5},
		{1000,  1000,  7.1,   0,       1000,    4,     8,     1000 ,  1000},
		{1000,  1000,  2.2,   1000,    0,       6.1,   3.6,   1000,   3},
		{7.8,   6,     5.1,   4,       6.1,     0,     1000,  1000,   1000},
		{10,    1000,  1000,  8,       3.6,     1000,  0,     2.2,    3.2},
		{1000,  1000,  1000,  1000,    1000,    1000,  2.2,   0,      2.2},
		{8.1,   1000,  4.5,   1000 ,   3,       1000,  3.2,   2.2,    0}
	};  
	


unsigned p[9][9]={
{0,     0 ,    0 ,   -1 ,   -1  ,   0 ,   -1,    -1 ,    0},
{1,    1,     1,    -1,    -1,     1,    -1 ,   -1,    -1},
{2 ,    2 ,    2 ,    2,     2 ,    2,    -1  ,  -1 ,    2},
{-1 ,   -1,     3 ,    3,    -1 ,    3,     3 ,   -1,    -1},
{-1 ,   -1,     4 ,   -1 ,    4 ,    4 ,    4 ,   -1,     4},
{ 5 ,    5,     5 ,    5,     5 ,    5,    -1 ,   -1,    -1},
{ 6 ,   -1,    -1,     6 ,    6 ,   -1 ,    6 ,    6,     6},
{-1 ,   -1 ,   -1 ,   -1 ,   -1,    -1 ,    7 ,    7 ,    7},
{8  ,  -1 ,    8  ,  -1 ,    8  ,  -1 ,    8  ,   8   ,  8}
};   

//--------------------------------------------------------	
  
	VerType name[1000];
	for(i=0;i<n;i++){
		fin>>name[i].VerCode;
		fin>>name[i].VerName;
		fin>>name[i].x;
		fin>>name[i].y;
		fin>>name[i].InsInfo;
		}

	for(i=0;i<n;i++){
		for(j=0;j<n;j++)
		fin>>p[i][j];
		}

//---------------------------------------------------------
	cout<<"原来的相邻矩阵g:"<<endl;
	   for(i=0;i<9;i++){
		for(j=0;j<9;j++)
		cout<<g[i][j]<<"     ";cout<<endl;
		
		}
	cout<<"原来的路径矩阵p:"<<endl;
	   for(i=0;i<9;i++){
		for(j=0;j<9;j++)
		cout<<p[i][j]<<"     ";cout<<endl;
		}

	floyd1(g,p);

	cout<<"连通的相邻矩阵g:"<<endl;
	  for(i=0;i<9;i++){
		for(j=0;j<9;j++)
		cout<<g[i][j]<<"    ";cout<<endl;
		
		}

	  cout<<"连通的路径矩阵p:"<<endl;
	   for(i=0;i<9;i++){
		for(j=0;j<9;j++)
		cout<<p[i][j]<<"    ";cout<<endl;
		
		}
//-------------------------------------------------------------------------------
	cout<<"*校园导游查询系统*"<<endl;
		cout<<"地址编号: 0 --------- 校门(文化路入口)"<<endl;
		cout<<"地址编号: 1 --------- 行政楼(行政报告大楼)"<<endl;
		cout<<"地址编号: 2 --------- 学博楼(第一教学大楼)"<<endl;
		cout<<"地址编号: 3 --------- 学渊楼(第二教学大楼)"<<endl;
		cout<<"地址编号: 4 --------- 学思楼(现代教育技术中心)"<<endl;
		cout<<"地址编号: 5 --------- 图书馆(图书馆及计算中心、网络中心)"<<endl;
		cout<<"地址编号: 6 --------- 美食城(财院食堂)"<<endl;
		cout<<"地址编号: 7 --------- 学生宿舍(学生宿舍1-4号楼)"<<endl;
		cout<<"地址编号: 8 --------- 运动场(风雨球场)"<<endl;
//-------------------------------------------------------------------------------

	unsigned start,end;
	char yo;
	cout<<"请输入起点与终点地址编号: "<<endl;
	do{
		cout<<"请输入起点地点编号:"; cin>>start;
		cout<<"请输入终点地点编号:"; cin>>end;
		if(start==end){
			cout<<"地点编号: "<<name[start].VerCode<<endl;
			cout<<"地点名称: "<<name[start].VerName<<endl;
			cout<<"说明: "<<name[start].InsInfo<<endl;
		}
		else{
			unsigned a[9];
		    cout<<endl<<"路线:"<<endl<<name[start].VerName<<"->";
			for(i=1;i<9;i++)
			{
				a[0]=p[start][end];
			    a[i]=p[start][a[i-1]];
			}
		    for(int i=8;i>=0;i--)
			{
			    if(a[i]!=start)
			    cout<<name[a[i]].VerName<<"->";

			}
	        cout<<name[end].VerName;
		}
        cout<<endl<<"从"<<name[start].VerName<<"到"<<name[end].VerName<<"的最短路径是: "
	    <<g[start][end]<<endl;
//-------------------------------------------------------------------------------

		
	cout<<endl<<"是否继续查询?(y/n):";cin>>yo;
	}while(yo=='y');
	cout<<endl;
	cout<<"谢谢您的使用!欢迎下次再来我校,再为你服务!拜拜!"<<endl;
}


































		/*		else{//不同则查询最短路径
			//.................
			//输出从起点到终点经过的所有景点
			cout<<"路线:"<<name[start].VerName<<"->"<<name[p[start][end]].VerName
				<<"->"<<name[end].VerName;
			cout<<"从"<<name[start].VerName<<"到"<<name[end].VerName<<"的最短路径是: "<<g[start][end]<<endl;
	}


else{
			cout<<"路线:"<<name[start].VerName<<"->";
				unsigned t=p[start][end],t1=end;
					end=p[start][end];
					if(end!=start)
//						cout<<name[p[start][end]].VerName<<"->";

             cout<<name[p[start][end]].VerName<<"->"<<name[t].VerName<<"->"<<name[t1].VerName;


			cout<<"从"<<name[start].VerName<<"到"<<name[end].VerName<<"的最短路径是: "<<g[start][end]<<endl;
		}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -