用c++写出将若干城市的信息存人一个带头结点的单链表,结点中的城市信息包括城市名、 城市的位置坐标。要求: (1)给定一个城市名,返回其位置坐标; (2)给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。
时间: 2024-10-09 09:02:33 浏览: 23
在 C++ 中,我们可以设计一个结构体表示城市信息,并创建一个单链表作为数据结构来存储这些城市。首先,我们需要定义一个名为 `City` 的结构体,包含城市名称和坐标:
```cpp
struct City {
string name;
double position[2]; // 二维坐标,通常用两个double表示 x, y
struct Node *next;
};
```
然后创建一个链表节点 `Node`:
```cpp
struct Node {
City city;
Node* next;
};
```
接下来,我们定义一个类 `CityList` 来管理这个链表,提供插入城市和查询功能:
```cpp
class CityList {
private:
Node* head;
public:
// 构造函数
CityList() : head(nullptr) {}
// 插入城市到链表
void insertCity(string name, double x, double y) {
Node* newNode = new Node();
newNode->city.name = name;
newNode->city.position[0] = x;
newNode->city.position[1] = y;
newNode->next = nullptr;
if (!head) {
head = newNode;
} else {
Node* current = head;
while (current->next != nullptr) {
current = current->next;
}
current->next = newNode;
}
}
// 根据城市名查找并返回相应坐标
vector<double> getPositionByName(string cityName) {
Node* current = head;
vector<double> position;
while (current != nullptr) {
if (current->city.name == cityName) {
position.push_back(current->city.position[0]);
position.push_back(current->city.position[1]);
break;
}
current = current->next;
}
return position;
}
// 根据坐标和距离范围返回城市列表
vector<string> getCitiesWithinDistance(double x, double y, double distance) {
vector<string> citiesInRange;
Node* current = head;
while (current != nullptr) {
if (hypot(current->city.position[0] - x, current->city.position[1] - y) <= distance) {
citiesInRange.push_back(current->city.name);
}
current = current->next;
}
return citiesInRange;
}
};
// 辅助函数:计算两点之间的欧氏距离
double hypot(double dx, double dy) {
return sqrt(dx * dx + dy * dy);
}
```
现在,你可以根据需要创建 `CityList` 对象并操作它了。例如:
```cpp
int main() {
CityList cityList;
cityList.insertCity("北京", 39.9, 116.4);
cityList.insertCity("上海", 31.2, 121.5);
vector<double> beijingPosition = cityList.getPositionByName("北京");
vector<string> nearbyCities = cityList.getCitiesWithinDistance(39.8, 117.0, 10); // 获取距离北京市中心10公里内的城市
// 打印结果
cout << "北京的坐标: (" << beijingPosition[0] << ", " << beijingPosition[1] << ")" << endl;
for (const auto& city : nearbyCities) {
cout << city << " ";
}
cout << endl;
return 0;
}
```
阅读全文