📄 导游.cpp
字号:
#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 + -