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

📄 导游.cpp

📁 数据结构课设做的
💻 CPP
📖 第 1 页 / 共 3 页
字号:

#include  "stdlib.h"
#include  "stdio.h"
#include  "iostream.h"
#include  "string.h"
#include  "ctype.h"
#include  "fstream.h"
#include  "iomanip.h"

bool visited[100];//注意:存储结构中的零号单元都没有使用,编号都从1开始
int path[100]; //暂存遍历过程中的路径



struct data//景点的基本信息
{
  char sign;
  char Name[10];
};



typedef  struct  Vision
{
	int Position; //该边所指的顶点的位置
	int adj;    //该边权值大小
	struct  Vision *NextV;//指向下一条边的指针
}Vision;


typedef struct Vnode
{
	struct data title;//图中结点类型
    char Intro[1000];
	Vision  *firstarc;//指向第一条依附于该结点的边的指针

}Vnode, AdjList[100];


typedef struct 
{
	AdjList vert;//存储图中结点的数组
    int vexnum;//当前图中结点总个数
	
}Algraph;

/*********************************************************************************************************************/
int  locate(Algraph  J, char u)//定位pass
{
	int i;
    if(J.vert==NULL)
	{
		cout<<"nothing"<<endl;
		exit(0);
	}
	for(i=1;i<=J.vexnum;i++)
	{
		if(J.vert[i].title.sign==u)
			return i;
	}
	if(i>J.vexnum)
	{
		
	    return -1;
	}
	
}
/**************************************************************************************************************/
void Open(fstream &fp1,fstream &fp2)//打开两个文件
{
    fp1.open("AInfo.dat",ios::in|ios::out|ios::binary);
    if(fp1.fail())
	{
		cout<<"打开Afile文件出错"<<endl;
		exit(0);
	}
	fp2.open("vInfo.txt",ios::in|ios::out);
    if(fp2.fail())
	{
		cout<<"打开vInfo文件出错"<<endl;
		exit(0);
	}
	
}
void OOpen(fstream &fp1,fstream &fp2)//打开两个文件
{
    fp1.open("AInfo.dat",ios::in|ios::binary|ios::out|ios::trunc);
    if(fp1.fail())
	{
		cout<<"打开Afile文件出错"<<endl;
		exit(0);
	}
	fp2.open("vInfo.txt",ios::in|ios::out|ios::trunc);
    if(fp2.fail())
	{
		cout<<"打开vInfo文件出错"<<endl;
		exit(0);
	}

}
/*********************************************************************************************************************/
void Create(Algraph &J)//初始化时用的建图pass(还需要加上输入出错时的处理未完成)
{ 
	int n,t;
	char v;
	Vision *p ,*q;
	fstream Afile,vfile;
	OOpen(Afile,vfile);
    cout<<"请输入需要建立的结点数"<<endl;
	cin>>J.vexnum;
	cin.ignore();
	
    cout<<"请输入各结点的标志,名称,及简介"<<endl;
	for(int w=1;w<=J.vexnum;w++)
	{
        cout<<"下面是第"<<w<<"个景点的信息"<<endl;
		cout<<"输入标志"<<endl;
		cin>>J.vert[w].title.sign;
		cin.ignore();
		cout<<"输入名称"<<endl;
		cin.getline(J.vert[w].title.Name,10,'\n');
	    cout<<"输入简介"<<endl;
		cin.getline(J.vert[w].Intro,1000,'@');
	}
	for(int i=1;i<=J.vexnum;i++)
	{
	    cout<<"请输入与"<<J.vert[i].title.sign<<"相邻的结点个数"<<endl;
		cin>>n;
		if(n==0)
		{
			J.vert[i].firstarc=NULL;
		}
		else
		{
	       cout<<"请输入与"<<J.vert[i].title.sign<<"结点相邻的结点和两者之间的边权值"<<endl;
           cin.ignore();
		   cin.get(v);
		   cin.ignore();
		   cin>>t;

           J.vert[i].firstarc=new Vision;
	       J.vert[i].firstarc->NextV=NULL;
		
	       J.vert[i].firstarc->Position=locate(J,v);
		   vfile<<"*";
		   vfile<<locate(J,v);
		   vfile<<"#";
           J.vert[i].firstarc->adj=t;
		   vfile<<t;
		   
		   vfile<<"$";
		  

	       q=J.vert[i].firstarc;
		
	       for (int j=1;j<n;j++)
		   {
		      cout<<"请输入与"<<J.vert[i].title.sign<<"结点相邻的结点和两者之间的边权值"<<endl;
              cin.ignore();
			  cin.get(v);
			  cin.ignore();
			  cin>>t;

		      p=(Vision *)malloc(sizeof(Vision));
		      p->NextV=NULL;
		
		      p->Position=locate(J,v);
			  vfile<<"*";
			  vfile<<locate(J,v);
		      vfile<<"#";
			  p->adj=t;
			  vfile<<t;
		     
		      vfile<<"$";
	          q->NextV=p;
		      q=p;
		      
		   }
		   vfile<<"&\n";
		}
		system("pause");
		system("cls");
		
	}
	
	Afile.write((char*)&J,sizeof(J));
	
	Afile.close();
	vfile.close();
	cout<<"close file "<<endl;
	
}
/*********************************************************************************************************************/
Algraph Revert(Algraph &J)//恢复原图结构pass
{
	fstream Afile,vfile;
	int c,g,y;
	char h[5];
	char T[5];
	int Y[5]={1,10,100,1000,10000};
    Vision *p,*q;
    Afile.open("AInfo.dat",ios::in|ios::binary);
    if(Afile.fail())
	{
		cout<<"打开Afile文件出错"<<endl;
		exit(0);
	}
	Afile.read((char*)&J,sizeof(J));
    vfile.open("vInfo.txt",ios::in);
    if(vfile.fail())
	{
		cout<<"打开vInfo文件出错"<<endl;
		exit(0);
	}
	
	    for(int i=1;i<=J.vexnum;i++)
		{
		    char abey[100];
		    vfile.getline(abey,99,'\n');
			int j=0;
			int sign=1;
		    while(abey[j]!='&')
			{
               if(abey[j]=='*')
			   {
                    if(sign==1)
					{
				        c=0;
				        y=0;
				        while(abey[j+1]!='#')
						{
				          h[y]=abey[j+1];
                          y=y+1;
					      j=j+1;
						}
				        for(int x=0,s=y-1;x<y,s>=0;x++,s--)
						{
                          g=(int)h[x];
					      g=g-48;
					      c=c+g*Y[s];
						}
				         J.vert[i].firstarc=new Vision;
						 J.vert[i].firstarc ->NextV=NULL;
				         p=J.vert[i].firstarc;
	                     p->Position=c; 
						 sign=2;
			             j=j+1;
						
					    
					}
				    if(sign==2&&J.vert[i].firstarc->NextV!=NULL)
					{
					     
						c=0;
				        y=0;
				        while(abey[j+1]!='#')
						{
				          h[y]=abey[j+1];
                          y=y+1;
					      j=j+1;
						}
				        for(int x=0,s=y-1;x<y,s>=0;x++,s--)
						{
                          g=(int)h[x];
					      g=g-48;
					      c=c+g*Y[s];
						}
						p->Position=c; 
				        j=j+1;
					     
					}
			   }
			   if(abey[j]=='#')
			   {
				   int t=0;
				   y=0;
				   while(abey[j+1]!='$')
				   {
				     h[y]=abey[j+1];
                     y=y+1;
					 j=j+1;
				   }
				   for(int x=0,s=y-1;x<y,s>=0;x++,s--)
				   {
                       g=(int)h[x];
					   g=g-48;
					   t=t+g*Y[s];
				   }
				   p->adj=t;
				   j=j+1;
				   
			   }
			   if(abey[j]=='$')
			   {
				   if(abey[j+1]!='&')
				   {
					   q=new Vision;
				       q->NextV=NULL;
				       p->NextV=q;
				       p=q;
				       j=j+1;
				   }
				   if(abey[j+1]=='&')
				   {
					   j=j+1;
				   }
				  
			   }
			}
			
		}
		
	
  vfile.close();
  Afile.close(); 

  return J;
 
}
/********************************************************************************************************************/
int  locfind(Algraph &J, int c,int x)//定位查找边权值pass
{
	Vision *p;
	
    if(J.vert[c].firstarc==NULL)
	{
		return -1;
	}
	else
	{
		p=J.vert[c].firstarc;
		while(p!=NULL)
		{
			if(p->Position==x)
			{
				return p->adj;
				break;
			}
			else
			{
				p=p->NextV;
			}
		}
		if(p==NULL)
		{
			return -1;
		  
		}

	}
}
/**********************************************************************************************/
void CreateMatirx(Algraph &J,int Route[100][100] )//创建与邻接表对应的邻接矩阵
{
    Vision *p;
    fstream Afile,vfile;
    Open(Afile,vfile);
    Revert(J);
	for(int i=1;i<=J.vexnum;i++)
	{
		p=J.vert[i].firstarc;
	    while(p!=NULL)
		{
            Route[i][p->Position]=p->adj;
			p=p->NextV;
		}
		int j=1;
		int n=1;
	    while(j<=J.vexnum)
		{
			while(n==1)
			{
			if(i==j)
			{
				Route[i][j]=0;
				j++;
				break;
			}
			if(Route[i][j]>=0 && Route[i][j]<=100)
			{
				j++;
			    break;
			}
			if(Route[i][j]<0 || Route[i][j]>100)
			{
				Route[i][j]=25699;
			    j++;
				break;
			}
			}
			n=1;
		}

	}

	Afile.close();
	vfile.close();
	
}
/************************************************************************************/

void CCreateMatirx(Algraph &J,int Route[100][100] )//创建与邻接表对应的邻接矩阵
{
    Vision *p;
    fstream Afile,vfile;
    Open(Afile,vfile);
    Revert(J);
	for(int i=1;i<=J.vexnum;i++)
	{
		p=J.vert[i].firstarc;
	    while(p!=NULL)
		{
            Route[i][p->Position]=1;
			p=p->NextV;
		}
		int j=1;
		int n=1;
	    while(j<=J.vexnum)
		{
			while(n==1)
			{
			if(i==j)
			{
				Route[i][j]=0;
				j++;
				break;
			}
			if(Route[i][j]>=0 && Route[i][j]<=100)
			{
				j++;
			    break;
			}
			if(Route[i][j]<0 || Route[i][j]>100)
			{
				Route[i][j]=25699;
			    j++;
				break;
			}
			}
			n=1;
		}

	}

	Afile.close();
	vfile.close();
	
}

/****************************************************************************************************************/
void show(Algraph &J)
{
	   for(int i=1;i<=J.vexnum;i++)
	   {
		if(strcmp(J.vert[i].title.Name,"Noname")==0)
		{
			cout<<"\t"<<setw(7)<<J.vert[i].title.sign<<setw(7)<<"\t?未知景点"<<endl;
		}
		else
		{
		    cout<<"\t"<<setw(7)<<J.vert[i].title.sign<<setw(7)<<"\t"<<J.vert[i].title.Name<<endl;
		}
	  }
}
/****************************************************************************************************************/
void Lookup(Algraph &J)//查找景点pass
{
    char ch;
	Revert(J);
    cout<<endl<<endl<<"\t下面将显示该学校的景点名称,请按编号选择想要查询的景点"<<endl;
	show(J);
    
	cout<<endl<<"\t\t输入你的选择"<<endl<<"\t\t\t\t";
	
	cin>>ch;
	system("cls");
    for(int j=1;j<=J.vexnum;j++)
	{
		if(ch==J.vert[j].title.sign)
		{
			cout<<endl<<endl<<"\t\t名称:\t"<<J.vert[j].title.Name<<endl;
			cout<<endl<<"\t\t简介:\t"<<J.vert[j].Intro<<endl;
			break;
		}
	}
	int w=1;
	while(j>J.vexnum)
	{    
		system("CLS");
		cout<<endl<<endl<<endl<<"选择错误,请再次选择"<<endl;
	
		if(w==3)
		{
			system("cls");
			cout<<endl<<endl<<endl<<endl<<"\t\t\t为什么总是输入错误,退出了!!"<<endl;
			break;
		}
        cout<<endl<<endl<<"\t下面将显示该学校的景点名称,请按编号选择想要查询的景点"<<endl;
        show(J);
		cout<<endl<<"\t\t输入你的选择"<<endl<<"\t\t\t\t";
	    cin>>ch;
		system("cls");
		for(int s=1;s<=J.vexnum;s++)
		{ 
			if(ch==J.vert[j].title.sign)
			{
				  cout<<endl<<endl<<"\t\t名称:\t"<<J.vert[j].title.Name<<endl;
			      cout<<endl<<"\t\t简介:\t"<<J.vert[j].Intro<<endl;
			      j=J.vexnum;
			      break;
			}
			
		}
		w++;
		j=j;
	}
	
}

/****************************************************************************************************************/

void Refur(Algraph &J)//刷新文件pass
{
	fstream Afile,vfile;
    OOpen(Afile,vfile);
	
	Afile.write((char*)&J,sizeof(J));

	for(int i=1;i<=J.vexnum;i++)
	{
		Vision *p;
		p=J.vert[i].firstarc;
		
		while(p!=NULL)
		{  
		   vfile<<"*";
		   vfile<<p->Position;
		   vfile<<"#";
           vfile<<p->adj;

⌨️ 快捷键说明

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