赞
踩
/*******************************************************************
P54 实习题一:将若干城市的信息存入一个带头结点的单链表,结点中的城市
信息包括城市名、城市的位置坐标。要求:
(1)给定一个城市名,返回其位置坐标;
(2)给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。
*******************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct
{
char CityName[10];
int x,y;
}CityInfo;
typedef struct node
{
CityInfo data;
struct node *next;
}Node, *LinkList;
//算法2.5 初始化带头结点的单链表
void InitList( LinkList *H)
{
*H = (LinkList)malloc(sizeof(Node));
(*H)->next = NULL;
}
//输出线性表的元素
void Print(LinkList H)
{
H = H->next;
while(H)
{
printf("城市:%s\t位置:(%d,%d)\n",H->data.CityName,H->data.x,H->data.y);
H = H->next;
}
printf("\n");
}
//算法2.10 带头结点的单链表插入
int InsList (LinkList L , int i, CityInfo e)
{//将新元素 e 插入在链表中第 i 个位置
Node *pre=L, *s;
int k=0;
while(pre!=NULL&&k<i-1)
{ pre = pre->next;
k=k+1;
}
if( k != i-1 ) //插入位置不合理返回0
return 0;
s = (Node *) malloc (sizeof (Node) ); //创建新结点
s->data = e;
s->next = pre->next; //链入
pre->next = s;
return 1;
}
LinkList SearchCity(LinkList L, char c)
{
while(L->next && L->next->data.CityName[0]!=c)
L = L->next;
return L->next;
}
void main()
{
LinkList L, p;
struct tm t;
char c = 'A', str[20];
CityInfo e;
int i, x, y, d, xz;
_getsystime(&t);
srand(t.tm_sec);
InitList(&L);
for(i=0; i<10; i++)
{
e.CityName[0] = c+i;
e.CityName[1] = '\0';
e.x = rand()%100 - 50;
e.y = rand()%100 - 50;
InsList(L, i+1, e);
}
while(1)
{
Print(L);
printf("选择以下操作:1、城市名查坐标, 2、坐标距离查城市, 0、退出:");
scanf("%d", &xz);
getchar();
switch(xz)
{
case 1:
printf("根据城市名找坐标,请输入城市名:");
gets(str);
p = SearchCity(L, str[0]);
if(p)
printf("城市:%s\t位置:(%d,%d)\n\n",p->data.CityName,p->data.x,p->data.y);
else
printf("没有该城市!\n\n");
break;
case 2:
printf("请输入坐标和距离:");
scanf("%d%d%d",&x,&y,&d);
p = L->next;
printf("距离坐标(%d,%d)在%d范围内的城市为:",x,y,d);
while(p)
{
if((p->data.x-x)*(p->data.x-x)+(p->data.y-y)*(p->data.y-y)<=d*d)
printf("%s\t",p->data.CityName);
p = p->next;
}
printf("\n");
break;
case 0:
exit(0);
}
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。