数据结构实习题-单链表的应用

/*******************************************************************
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);
  }
 }
}

猜你喜欢

转载自blog.csdn.net/fanxp66/article/details/6919093