请帮我用数据结构c++实现城市之间有三种交通工具:汽车、火车或飞机,提供对全国城市交通图和汽车时刻表、列车时刻表及飞机航班表进行编辑的功能
时间: 2024-03-21 10:41:09 浏览: 13
好的,以下是一个简单的实现示例,使用邻接表来描述城市之间的交通图,使用红黑树来存储汽车、火车和飞机的时刻表:
```c++
#include <iostream>
#include <string>
#include <unordered_map>
#include <map>
#include <vector>
using namespace std;
// 定义城市信息结构体
struct CityInfo {
string name; // 城市名称
double longitude; // 经度
double latitude; // 纬度
CityInfo(string n, double lon, double lat) : name(n), longitude(lon), latitude(lat) {}
};
// 定义交通工具枚举类型
enum TrafficType { CAR, TRAIN, PLANE };
// 定义时刻表记录结构体
struct Schedule {
string startCity; // 出发城市
string endCity; // 到达城市
TrafficType traffic; // 交通工具
int startTime; // 出发时间
int endTime; // 到达时间
Schedule(string s, string e, TrafficType t, int st, int et) : startCity(s), endCity(e), traffic(t), startTime(st), endTime(et) {}
};
// 定义城市节点结构体,用于邻接表中存储城市信息
struct CityNode {
CityInfo info; // 城市信息
vector<Schedule> schedules; // 时刻表
CityNode(string n, double lon, double lat) : info(n, lon, lat) {}
};
// 定义邻接表类型,键为城市名称,值为城市节点结构体
typedef unordered_map<string, CityNode> CityGraph;
// 定义时间表类型,键为交通工具类型,值为红黑树,存储对应的时刻表记录
typedef map<TrafficType, map<int, Schedule>> ScheduleMap;
// 添加时刻表记录函数
void addSchedule(ScheduleMap& scheduleMap) {
string startCity, endCity;
int startTime, endTime;
TrafficType traffic;
cout << "请输入出发城市:";
cin >> startCity;
cout << "请输入到达城市:";
cin >> endCity;
cout << "请输入交通工具(1.汽车 2.火车 3.飞机):";
int trafficType;
cin >> trafficType;
traffic = static_cast<TrafficType>(trafficType - 1); // 将输入的交通工具类型转换为枚举值
cout << "请输入出发时间(格式:HHMM):";
cin >> startTime;
cout << "请输入到达时间(格式:HHMM):";
cin >> endTime;
Schedule schedule(startCity, endCity, traffic, startTime, endTime);
scheduleMap[traffic][startTime] = schedule; // 将时刻表记录存入红黑树中
cout << "时刻表记录已添加。" << endl;
}
// 删除时刻表记录函数
void deleteSchedule(ScheduleMap& scheduleMap) {
TrafficType traffic;
int time;
cout << "请输入要删除的时刻表记录的交通工具(1.汽车 2.火车 3.飞机):";
int trafficType;
cin >> trafficType;
traffic = static_cast<TrafficType>(trafficType - 1); // 将输入的交通工具类型转换为枚举值
cout << "请输入要删除的时刻表记录的出发时间(格式:HHMM):";
cin >> time;
if (scheduleMap[traffic].count(time)) { // 检查该时刻表记录是否存在
scheduleMap[traffic].erase(time); // 从红黑树中删除该时刻表记录
cout << "时刻表记录已删除。" << endl;
} else {
cout << "该时刻表记录不存在,请重新输入。" << endl;
deleteSchedule(scheduleMap); // 递归调用自身,重新获取交通工具和出发时间
}
}
int main() {
CityGraph cityGraph;
ScheduleMap scheduleMap;
// 添加一些初始城市信息和时刻表记录
CityNode beijing("北京", 116.4074, 39.9042);
Schedule beijingToShanghai("北京", "上海", TRAIN, 800, 1300);
beijing.schedules.push_back(beijingToShanghai);
cityGraph[beijing.info.name] = beijing;
scheduleMap[beijingToShanghai.traffic][beijingToShanghai.startTime] = beijingToShanghai;
CityNode shanghai("上海", 121.4737, 31.2304);
Schedule shanghaiToBeijing("上海", "北京", TRAIN, 700, 1200);
shanghai.schedules.push_back(shanghaiToBeijing);
cityGraph[shanghai.info.name] = shanghai;
scheduleMap[shanghaiToBeijing.traffic][shanghaiToBeijing.startTime] = shanghaiToBeijing;
while (true) {
cout << "请选择操作:1.添加时刻表记录 2.删除时刻表记录 3.退出" << endl;
int choice;
cin >> choice;
switch (choice) {
case 1:
addSchedule(scheduleMap);
break;
case 2:
deleteSchedule(scheduleMap);
break;
case 3:
return 0;
default:
cout << "请输入正确的操作编号。" << endl;
break;
}
}
}
```
以上示例中,程序会不断循环,每次等待用户输入操作编号,然后根据用户选择调用相应的函数进行处理。其中,`addSchedule` 函数用于添加时刻表记录,将用户输入的时刻表记录存入红黑树中;`deleteSchedule` 函数用于删除时刻表记录,从红黑树中删除用户输入的时刻表记录。