城市信息实习题

博客介绍将若干城市信息存入带头结点单链表,结点含城市名与位置坐标。并实现两个功能,一是给定城市名返回其位置坐标,二是给定位置坐标P和距离D,返回所有与P距离小于等于D的城市。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将若干城市的信息存入一个带头结点的单链表,结点中的城市信息包括城市名、城市的位置坐标。要求:
(1)给定一个城市名,返回其位置坐标;
(2)给定一个位置坐标P和一个距离D,返回所有与P距离小于等于D的城市。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 20

typedef struct city {
 char name[MAXSIZE];
 float x;
 float y;
 struct city *next;
} City;

int Menu()
{
 int choice;
 printf("************************/n");
 printf("*       练习 2.1       */n");
 printf("************************/n");
 printf("     1.新建/n");
 printf("     2.根据城市名查找/n");
 printf("     3.根据离中心坐标距离查找/n");
 printf("     4.退出/n");
 printf("============================/n");
 printf("请选择:");
 scanf("%d", &choice);
 return choice;
}

float Distance(float x,float y,float x0,float y0)
{
 float dis;
 dis=(x-x0)*(x-x0)+(y-y0)*(y-y0);
 return dis;
}

City *Creat()
{
 City *L, *r, *s;
 r=L=(City *)malloc(sizeof(City));
 while (strcmp(r->name,".")!=0)
 {
  s=(City *)malloc(sizeof(City));
  if (s==NULL)
  {
   puts("错误:内存不足!");
   break;
  } else {
   printf("城市名(输入“.”结束):");
   scanf("%s", s->name);
   printf("坐标x,y:"); scanf("%f,%f",&s->x,&s->y);
   r->next=s;
   r=s;
  }
 }
 r->next=NULL;
 return L;
}

City *Locate(City *L, char *name)
{
 City *p=L;
 while ((p!=NULL) && (strcmp(p->name,name)!=0))
  p=p->next;
 return p;
}

GetCity(City *L, float x,float y,float d)
{
 City *p=L->next;
 while (p!=NULL)
 {
  if (Distance(p->x,p->y,x,y)<d*d)
   printf("城市名:%s/t/t坐标:(%.2f,%.2f)/n",p->name,p->x,p->y);
  p=p->next;
 }



main()
{
 int ch=0, i, c;
 float d, x, y;
 char name[MAXSIZE];
 City *L,*p;
 while (ch!=4)
 {
  ch=Menu();
  switch (ch)
  {
  case 1:
   L=Creat();
   break;
  case 2:
   printf("请输入要查找的城市名:"); scanf("%s",name);
   p=Locate(L,name);
   if (p!=NULL)
    printf("城市名:%s/t/t坐标:(%.2f,%.2f)",p->name,p->x,p->y);
   break;
  case 3:
   printf("请输入中心坐标:"); scanf("%f,%f",&x,&y);
   printf("请输入距离:"); scanf("%f",&d);
   GetCity(L,x,y,d);
   break;
  case 4:
   printf("结束程序。/n");
   return 0;
   break;
  default:
   printf("输入错误!请重新输入!/n/n");break;
  }
  printf("单击空格键继续.../n");
  while ((c=getch())!=' ');
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值