数据结构模板

#include <iostream>
#include <string>
#include <fstream>
#include <algorithm>
using namespace std;
int sizer;
typedef struct
{
   int data;
   int t;
   int fisrt;
}Node;
typedef struct
{
   string name;
   int a[101];
}Position;
void initdata(Position *P)    //从文件读入学校各地点间的信息
{
    ifstream f1("a.in");
    int i=1,j;
    f1>>sizer;
    for(i=1;i<=sizer;i++)
        f1>>P[i].name;
    for(i=1;i<=sizer;i++)
        for(j=1;j<=sizer;j++)
            f1>>P[i].a[j];
}
void savedata(Position *P)//保存信息
{
    string b;
    int i,j;
    ofstream fout("a.in");
    fout<<sizer<<endl;
    for(i=1;i<=sizer;i++)
    {
       if(i==0) fout<<endl;
        fout<<P[i].name<<' ';
    }
    fout<<endl;
    for(i=1;i<=sizer;i++)
    {
     for(j=1;j<=sizer;j++)
          fout<<P[i].a[j]<<' ';
     fout<<endl;
    }
    fout.close();
}
//下面建立主菜单界面
int Menu()
{
    int command;
    cout<<"————————————————————————————————————————";
    cout<<"————————————————————————————————————————";
    cout<<"||                                                                            ||";
    cout<<"||               .............................................                ||";
    cout<<"||              ...............................................               ||";
    cout<<"||              ..            欢迎使用校园导航系统           ..               ||";
    cout<<"||                                                                            ||";
    cout<<"||              .. 作者:15级软件工程专业一班         李一波 ..               ||";
    cout<<"||              ...............................................               ||";
    cout<<"||               ............................................                ||";
    cout<<"||                                                                            ||";
    cout<<"||                    系统说明:您可以实现如下功能:                           ||";
    cout<<"||                                                                            ||";
    cout<<"||                            0 退 出 系统                                   ||";
    cout<<"||                                                                            ||";
    cout<<"||                            1 管 理 员 系统                                ||";
    cout<<"||                                                                            ||";
    cout<<"||                            2 普 通 用 户 系统                             ||";
    cout<<"||                                                                            ||";
    cout<<"————————————————————————————————————————";
    cout<<"————————————————————————————————————————"<<endl;
    cout<<"请选择你要进行的操作..."<<endl;
    while(cin>>command,command<0||command>2)
    {
        cout<<"    输入错误!!!"<<endl;
        cout<<"    请重新输入:";  
    }
    return command;
}
int display_1()//管理员界面
{
    int command;
    cout<<"————————————————————————————————————————";
    cout<<"————————————————————————————————————————";
    cout<<"||                                                                            ||";
    cout<<"||               .............................................                ||";
    cout<<"||              ...............................................               ||";
    cout<<"||              ..            欢迎使用校园导航系统           ..               ||";
    cout<<"||                                                                            ||";
    cout<<"||              .. 作者:15级软件工程专业一班         李一波 ..               ||";
    cout<<"||              ...............................................               ||";
    cout<<"||               .............................................                ||";
    cout<<"||                                                                            ||";
    cout<<"||                    管理员系统说明:本系统可实现如下功能:                   ||";
    cout<<"||                           0 返  回  主  菜  单                             ||";
    cout<<"||                           1 查  看  俯  瞰  图                             ||";
    cout<<"||                           2 录  入  路  径                                 ||";
    cout<<"||                           3 添  加  路  径                                 ||";
    cout<<"||                           4 删  除  路  径                                 ||";
    cout<<"||                           5 修  改  路  径                                 ||";
    cout<<"||                           6 显  示  路  径                                 ||";
    cout<<"||                           7 查 询 两 点 间 最 短 路径                     ||";
    cout<<"||                                                                            ||";
    cout<<"————————————————————————————————————————";
    cout<<"————————————————————————————————————————"<<endl;
    cout<<"请选择您要进行的操作..."<<endl;
    while(cin>>command,command<0||command>7)
    {
        cout<<"    输入错误!!!"<<endl;
        cout<<"    请重新输入:";
    }
    return command;
}
int display_2()//普通用户界面
{
    int command;
    cout<<"————————————————————————————————————————";
    cout<<"————————————————————————————————————————";
    cout<<"||                                                                            ||";
    cout<<"||               .............................................                ||";
    cout<<"||              ...............................................               ||";
    cout<<"||              ..            欢迎使用校园导航系统           ..               ||";
    cout<<"||                                                                            ||";
    cout<<"||              .. 作者:09级计算机科学与技术专业一班 尹智勇 ..               ||";
    cout<<"||              ...............................................               ||";
    cout<<"||               .............................................                ||";
    cout<<"||                                                                            ||";
    cout<<"||                  普通用户系统说明:您可以实现如下功能:                     ||";
    cout<<"||                                                                            ||";
    cout<<"||                            0 返 回 主 菜单                                ||";
    cout<<"||                                                                            ||";
    cout<<"||                            1 查 看 简 易 地图                             ||";
    cout<<"||                                                                            ||";
    cout<<"||                            2 两 点 最 短 路径                             ||";
    cout<<"||                                                                            ||";
    cout<<"————————————————————————————————————————";
    cout<<"————————————————————————————————————————"<<endl;
    cout<<"请选择您要进行的操作..."<<endl;
    while(cin>>command,command<0||command>2)
    {
        cout<<"    输入错误!!!"<<endl;
        cout<<"    请重新输入:";
    }
    return command;
}
void look_up_the_map()        //浏览平面图
{
    char ch;
    ifstream input("map.in");
    while(input>>ch)
    {
        if(ch=='.') cout<<' ';
        else if(ch=='*') cout<<endl;
        else cout<<ch;
    }
    cout<<endl;
    input.close();
    cout<<"  返 回 上 级 菜 单 请 按 回 车 键:";
    getchar();getchar();
}
void fill_the_data(Position *P)          //重新录入路径
{
   int k,i,j;
   cout<<"请输入该次录入的地点数量:"<<endl;
   cin>>k;
   sizer=k;
   for(i=1;i<=k;i++)
   {
      cout<<" 请录入第"<<i<<"个地点名:";
      cin>>P[i].name;
      cout<<endl;
   }
   cout<<"请以邻接矩阵的形式输入地点两两之间的距离,第i行第j列代表i地点与j地点之间的距离:"<<endl;
   for(i=1;i<=k;i++)
   for(j=1;j<=k;j++)
    cin>>P[i].a[j];
   savedata(P);
   cout<<"         录 入 成 功!!!"<<endl;
   cout<<"  返 回 上 级 菜 单 请 按 回 车 键:";
   getchar();getchar();
}
void add_the_data(Position *P)          添加函数
{
    int i;
    initdata(P);
    if(sizer==0)  {cout<<endl;cout<<"  暂时还没有录入信息,请按回车键返回!"<<endl;getchar();getchar();}
    else
    {
        cout<<"请输入你需要增加的地点名:"<<endl;
        cin>>P[sizer+1].name;
        cout<<"请按顺序输入该地点与其他地点之间的距离"<<endl;
        for(i=1;i<=sizer;i++)
        {
            cout<<"请输入该点到"<<P[i].name<<"的距离:"<<endl;
            cin>>P[sizer+1].a[i];
            P[i].a[sizer+1]=P[sizer+1].a[i];
        }
        sizer++;
        P[i].a[sizer]=0;
        savedata(P);
        cout<<"         添 加 成 功!!!"<<endl;
    }
    cout<<"  返 回 上 级 菜 单 请 按 回 车 键:";
    getchar();getchar();
}
void delete_the_data(Position *P)   //删除函数
{
    string name;
    int i,j,k;
    initdata(P);
    if(sizer==0)  {cout<<endl;cout<<"  暂时还没有录入信息,请按回车键返回!"<<endl;getchar();getchar();}
    else
    {
        cout<<"请输入你要删除的地点名:"<<endl;
        cin>>name;
        for(i=1;i<=sizer;i++)
        if(P[i].name==name) break;
        if(i>sizer)
            cout<<"     输 入 错 误,该 学 校 地 图 信 息 中 没 有 该 地 点!";
        else
        {
            for(j=i;j<sizer;j++)
            P[j]=P[j+1]; 
            sizer--;
            for(k=1;k<=sizer;k++)
                for(j=i;j<=sizer;j++)
                {      
                    P[k].a[j]=P[k].a[j+1];
                } 
        savedata(P);
        cout<<"         删 除 成 功!!!"<<endl;
        }
    }
    cout<<"  返 回 上 级 菜 单 请 按 回 车 键:";
    getchar();getchar();
}
void change_the_data(Position *P)            //修改函数
{
    string name;
    int i,j,command;
    initdata(P);
    if(sizer==0)  {cout<<endl;cout<<"  暂时还没有录入信息,请按回车键返回!"<<endl;getchar();getchar();}
    else
    {
        cout<<"      1.修改某点到其他各点间距离"<<endl<<endl;
        cout<<"      2.修改地点名"<<endl<<endl;
        while(cin>>command,command<1||command>2)
        {
            cout<<"输入错误!!!"<<endl;
            cout<<"请重新输入:";
        }
        if(command==1)
        {
            cout<<"请输入你要修改路径的地点名:";
            cin>>name;
            cout<<endl;
            for(i=1;i<=sizer;i++)
                if(P[i].name==name)
                    break;
            if(i>sizer) cout<<"     输 入 错 误,该 学 校 地 图 信 息 中 没 有 该 地 点!";
            else
            {
                cout<<"请重新输入该点到其它点之间的距离:";
                for(j=1;j<=sizer;j++)
                {
                    cin>>P[i].a[j];
                    P[j].a[i]=P[i].a[j];
                }
                savedata(P);
                cout<<"         修 改 成 功!!!"<<endl;
            }
        }
        else
        {
            cout<<"请输入你要修改的地点名:";cin>>name;
            cout<<endl;
            for(i=1;i<=sizer;i++)
                if(P[i].name==name) break;
                    if(i>sizer) cout<<"     输 入 错 误,该 学 校 地 图 信 息 中 没 有 该 地 点!";
                else
                {
                    cout<<"请重新输入该地点名:";
                    cin>>P[i].name;
                    savedata(P);
                    cout<<"         修 改 成 功!!!"<<endl;
                }
        }
    }
    cout<<"  返 回 上 级 菜 单 请 按 回 车 键:";
    getchar();
    getchar();
}
void print_the_data(Position *P)            //显示校园各地点信息
{
    int i,j;
    initdata(P);
    if(sizer==0)  {cout<<endl;cout<<"  暂时还没有录入信息,请按回车键返回!"<<endl;getchar();getchar();}
    else
    {
        cout<<"已录入地点数量:"<<sizer<<" 个"<<endl;
        cout<<"所有地点名如下:";
        for(i=1;i<=sizer;i++)
        {
            if(i==0)
                cout<<endl;
            cout<<P[i].name<<' ';
        }
        cout<<endl;
        for(i=1;i<=sizer;i++)
        {
        for(j=1;j<=sizer;j++)
        cout<<P[i].a[j]<<' ';
        cout<<endl;
        }
     }
     cout<<"  返 回 上 级 菜 单 请 按 回 车 键:";
     getchar();getchar();
}
void f(int n,int i,Position *P,Node *c )        //递归输出最佳路径
{
    if(i==n)
    {
        cout<<P[i].name<<"  ";
        return ;
    }
    f(n,c[i].fisrt,P,c);
    cout<<P[i].name<<"  ";
}
int fun(Node c[])                      //寻找最小值
{
    int min=9999,i,k=-1;
    for(i=1;i<sizer;i++)
    if(c[i].t==1 &&c[i].data<min)
    {
        min=c[i].data;
        k=i;
    }
    return k;
}
void compute_distance(Position *P)   //求最短路径
{
    initdata(P);
    string name1,name2;
    int i,j,n,max=9999,k;
    Node c[101];
    for(i=1;i<=sizer;i++)
    {
        c[i].data=max;
        c[i].t=1;
     }
    cout<<"请输入你要查询的起始位置:";cin>>name1;
    cout<<endl;
    cout<<"请输入你要查询的终点位置:";cin>>name2;
    for(i=1;i<=sizer;i++)
    if(P[i].name==name1) {n=i; c[i].t=0;c[i].fisrt=n;break;}
    if(i>sizer)  cout<<"     输 入 错 误,该 学 校 地 图 信 息 中 没 有 该 地 点!";
    else
    {
        for(j=1;j<=sizer;j++)
            if(P[i].a[j]!=0)
            {
                c[j].data=P[i].a[j];
                c[j].fisrt=i;
            }
        int pp=0;
        while(1)
        {
            k=fun(c);
            if(k==-1)  break;
            c[k].t=0;
            for(i=1;i<=sizer;i++)
            if(P[k].a[i]!=0 && (P[k].a[i]+c[k].data<c[i].data) )
            {
                c[i].data=P[k].a[i]+c[k].data;
                c[i].fisrt=k;
            }
    }
    for(i=1;i<=sizer;i++)
      if(P[i].name==name2)
      {
         cout<<name1<<"到"<<name2<<"最短路径依次经过的地点为: ";
         f(n,i,P,c);
         cout<<endl;
         cout<<"路径距离为:";
         if(c[i].data==9999)
         cout<<'0'<<endl;
         else
            cout<<c[i].data<<endl;
         break;
     }
  }
  cout<<"  返 回 上 级 菜 单 请 按 回 车 键:";
  getchar();
  getchar();
}
void main()
{
  int command,t1,t2;
  string zh,mm;
  Position *P=new Position[101];
  system("color 2b");
  while(1)
  {
    command=Menu();
    if(command==1)
    {
       while(1)
       {
          cout<<"请输入账号:"<<endl;cin>>zh;
          cout<<"请输入密码:"<<endl;cin>>mm;
          if(zh=="0"&&mm=="0") break;
          else cout<<"账号或密码错误,请重新输入..."<<endl;
       }
       system("cls");
       t1=0;
       while(t1==0)
       {
          command=display_1();
          switch(command)
          {
            case 0:t1=1;break;
            case 1:look_up_the_map();system("cls");break;
            case 2:fill_the_data(P);system("cls");break;
            case 3:add_the_data(P);system("cls");break;
            case 4:delete_the_data(P);system("cls");break;
            case 5:change_the_data(P);system("cls");break;
            case 6:print_the_data(P);system("cls");break;
            case 7:compute_distance(P);system("cls");break;
          }
       }
   
    }
    else if(command==2)
    {
        while(1)
        {
            cout<<"请输入账号:"<<endl;cin>>zh;
            cout<<"请输入密码:"<<endl;cin>>mm;
            if(zh=="0"&&mm=="0") break;
            else cout<<"账号或密码错误,请重新输入..."<<endl;
        }
        system("cls");
        t2=0;
        while(t2==0)
        {
            command=display_2();
            switch(command)
            {
                case 0:t2=1;break;
                case 1:look_up_the_map();system("cls");break;
                case 2:compute_distance(P);system("cls");break;
            }
        }
    }
    else
        break;
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值