题目
将若干城市的信息存入一个带头结点的单链表,结点中的城市信息包括城市名、城市的位置坐标。要求:(1)给定一个城市名,返回其位置坐标;(2)给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。本题只考察链表信息,城市名可使用单字符。
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct Node {
char name;
int x;
int y;
struct Node *next;
} Node, *LinkList;
void initLink(LinkList *link);
void input(LinkList link);
void print(LinkList link);
void searchByName(LinkList link, char name);
void findAllCity(LinkList link, int x, int y, int distance);
int main(int argc, char *argv[]) {
LinkList link;
char name;
int x, y, distance;
initLink(&link);
input(link);
print(link);
printf("请输入您要查询的城市名:\n");
getchar();
scanf("%c", &name);
searchByName(link, name);
printf("请输入您要查询的城市坐标及限定距离,格式为[X坐标 Y坐标 限定距离]:\n");
scanf("%d %d %d", &x, &y, &distance);
findAllCity(link, x, y, distance);
return 0;
}
/**
* 初始化链表
*/
void initLink(LinkList *link) {
*link = (Node *)malloc(sizeof(Node));
(*link)->next = NULL;
}
/**
* 打印输出链表
*/
void print(LinkList link) {
Node *p = link->next;
while (p) {
printf("城市名:%c\tX坐标:%d\tY坐标:%d\n", p->name, p->x, p->y);
p = p->next;
}
}
/**
* 首次输入链表内数据
*/
void input(LinkList link) {
Node *node;
int time = 0;
printf("请输入要输入的数据个数:\n");
scanf("%d", &time);
printf("请以[城市名 X坐标 Y坐标]的格式输入数据:\n");
for (int i = 0; i < time; i++) {
getchar();
node = (Node *)malloc(sizeof(Node));
scanf("%c %d %d", &node->name, &node->x, &node->y);
link->next = node;
link = node;
}
link->next = NULL;
}
/**
* 给定一个城市名,返回其位置坐标
* link: 链表
* name:城市名
*/
void searchByName(LinkList link, char name) {
Node *node = link->next;
while (node) {
if (name == node->name) {
printf("X坐标:%d\tY坐标:%d\n", node->x, node->y);
break;
}
node = node->next;
}
}
/**
* 给定一个位置A坐标,距离D,返回所有与A的距离小于distance的城市名
* link: 链表
* x:x坐标
* y:y坐标
* distance:距离
*/
void findAllCity(LinkList link, int x, int y, int distance) {
Node *node = link->next;
while (node) {
if (sqrt(pow(x - node->x, 2) + pow(y - node->y, 2)) <= distance ) {
printf("城市:%c\n", node->name);
}
node = node->next;
}
}