您的位置:首页 > 理论基础 > 数据结构算法

数据结构模板

2017-05-14 22:48 197 查看
#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;

  }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: