链表练习题3-城市查找问题

题目

        将若干城市的信息存入一个带头结点的单链表,结点中的城市信息包括城市名、城市的位置坐标。要求:(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;
	}
}

 

转载于:https://my.oschina.net/niithub/blog/3019431

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值