基于地理位置的城市信息管理:查找、插入、删除、更新等操作
基于地理位置的城市信息管理系统
本文将介绍如何使用C语言实现一个简单的城市信息管理系统,该系统能够根据城市经纬度坐标进行查找、插入、删除和更新操作,并将结果保存到文件。
代码实现
以下是使用C语言实现的代码示例:c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>
// 定义城市结构体typedef struct City { char name[50]; double x; double y; struct City *next;} City;
// 创建带头结点的单链表City* createLinkedList() { City head = (City)malloc(sizeof(City)); head->next = NULL; return head;}
// 插入城市信息void insertCity(City *head, char *name, double x, double y) { City newCity = (City)malloc(sizeof(City)); strcpy(newCity->name, name); newCity->x = x; newCity->y = y; newCity->next = head->next; head->next = newCity;}
// 根据城市名查找位置坐标void findCityByName(City *head, char *name) { City *current = head->next; while (current != NULL) { if (strcmp(current->name, name) == 0) { printf('城市名:%s,位置坐标:(%.2lf, %.2lf) ', current->name, current->x, current->y); return; } current = current->next; } printf('找不到城市:%s ', name);}
// 根据位置坐标和距离返回城市列表void findCitiesByDistance(City *head, double x, double y, double distance) { City *current = head->next; while (current != NULL) { double dx = current->x - x; double dy = current->y - y; double currentDistance = sqrt(dx * dx + dy * dy); if (currentDistance <= distance) { printf('城市名:%s,位置坐标:(%.2lf, %.2lf) ', current->name, current->x, current->y); } current = current->next; }}
// 删除指定城市void deleteCity(City *head, char *name) { City *previous = head; City *current = head->next; while (current != NULL) { if (strcmp(current->name, name) == 0) { previous->next = current->next; free(current); printf('删除城市:%s ', name); return; } previous = current; current = current->next; } printf('找不到城市:%s ', name);}
// 更新城市信息void updateCity(City *head, char *name, double x, double y) { City *current = head->next; while (current != NULL) { if (strcmp(current->name, name) == 0) { current->x = x; current->y = y; printf('更新城市:%s,位置坐标:(%.2lf, %.2lf) ', current->name, current->x, current->y); return; } current = current->next; } printf('找不到城市:%s ', name);}
// 保存城市信息到文件void saveCitiesToFile(City *head, char *filename) { FILE *file = fopen(filename, 'w'); if (file == NULL) { printf('无法打开文件:%s ', filename); return; }
City *current = head->next; while (current != NULL) { fprintf(file, '%s %.2lf %.2lf
', current->name, current->x, current->y); current = current->next; }
fclose(file); printf('城市信息已保存到文件:%s
', filename);}
// 加载城市信息从文件City* loadCitiesFromFile(char *filename) { FILE *file = fopen(filename, 'r'); if (file == NULL) { printf('无法打开文件:%s ', filename); return NULL; }
City *head = createLinkedList(); char name[50]; double x, y; while (fscanf(file, '%s %lf %lf', name, &x, &y) != EOF) { insertCity(head, name, x, y); }
fclose(file); printf('从文件:%s 加载城市信息成功
', filename); return head;}
// 释放链表内存void freeLinkedList(City *head) { City *current = head; while (current != NULL) { City *temp = current; current = current->next; free(temp); }}
int main() { City *head = createLinkedList();
// 插入城市信息 insertCity(head, '北京', 116.40, 39.90); insertCity(head, '上海', 121.47, 31.23); insertCity(head, '广州', 113.23, 23.16); insertCity(head, '深圳', 114.07, 22.62); insertCity(head, '武汉', 114.31, 30.52);
// 保存城市信息到文件 saveCitiesToFile(head, 'cities.txt');
// 加载城市信息从文件 City *loadedHead = loadCitiesFromFile('cities.txt');
// 根据城市名查找位置坐标 findCityByName(loadedHead, '上海');
// 根据位置坐标和距离返回城市列表 findCitiesByDistance(loadedHead, 120.00, 30.00, 200.00);
// 删除指定城市 deleteCity(loadedHead, '广州');
// 更新城市信息 updateCity(loadedHead, '武汉', 114.31, 30.52);
// 再次保存城市信息到文件 saveCitiesToFile(loadedHead, 'updated_cities.txt');
// 释放链表内存 freeLinkedList(loadedHead);
return 0;}
功能说明
这段代码实现了一个简单的城市信息管理系统,主要功能如下:
- 创建城市信息链表: 使用链表存储城市信息,方便进行插入、删除等操作。2. 插入城市信息: 将新的城市信息(城市名、经纬度坐标)插入到链表中。3. 根据城市名查找位置坐标: 输入城市名,返回该城市的经纬度坐标。4. 根据位置坐标和距离返回城市列表: 输入一个经纬度坐标和距离,返回与该坐标距离小于等于指定距离的所有城市信息。5. 删除指定城市: 从链表中删除指定城市的信息。6. 更新城市信息: 更新链表中指定城市的经纬度坐标。7. 保存城市信息到文件: 将链表中的城市信息保存到指定文件中。8. 加载城市信息从文件: 从指定文件中加载城市信息到链表中。
总结
本代码示例展示了如何使用C语言实现简单的地理位置信息管理系统。您可以根据实际需求对代码进行修改和扩展,例如添加更多功能、优化数据结构或改进用户界面等。
原文地址: https://www.cveoy.top/t/topic/pV1 著作权归作者所有。请勿转载和采集!