当前位置:   article > 正文

【数据结构入门实验C语言版】城市链表

城市链表

实验内容描述:

2 .城市链表(设计性实验)
问题描述
将若干城市的信息存入一个带头结点的单向链表。结点中的城市信息包括城市名、城市的位置坐
标。要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。
基本要求
(1) 给定一个城市名,返回其位置坐标。
(2) 给定一个位置坐标 P 和一个距离 D ,返回所有与 P 的距离小于等于 D 的城市。
测试数据
由读者依据软件工程的测试技术自己确定。注意测试边界数据

简述:

此次实验实际上就是要用到上一篇写的单链表,但实际上比那个简单,因为要求的操作很少,在此仅说一下一些需要注意的问题:

第一个是结构体内容的变化,这里的数据应该包括浮点类型的xyz三坐标,还应该包括字符类型的城市名字,在这里我用了一个char指针去实现

第二个是字符数组是可以装汉字的,只不过,一个汉字相当于原来的两个字符

第三个是在往里面输入城市名字的时候,必须先给字符指针用malloc分配内存

其它基本上没什么问题,跟普通单链表差不多

下面是代码and测试图:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. #include<string.h>
  5. #define TRUE 1
  6. #define FALSE 0
  7. #define OK 2
  8. #define ERROR 0
  9. typedef char CityName;
  10. typedef int Status;
  11. typedef struct Cityinfo{
  12. CityName *name;
  13. double x;
  14. double y;
  15. double z;
  16. struct Cityinfo *next;
  17. }CityInfo,*CityPtr;
  18. CityPtr CreatList(void);//创造城市链表
  19. void FindCity(CityPtr);//查找城市
  20. Status InsertCity(CityPtr);// 插入城市
  21. Status DeleteCity(CityPtr);//删除城市
  22. void CheckCity(CityPtr);//遍历城市
  23. void ReturnCity(CityPtr,double,double,double,double);//寻找距离xyz小于distance的所有城市
  24. int main()
  25. {
  26. CityPtr L;
  27. L=CreatList();
  28. CheckCity(L);
  29. FindCity(L);
  30. InsertCity(L);
  31. CheckCity(L);
  32. DeleteCity(L);
  33. CheckCity(L);
  34. printf("下面开始寻找离坐标xyz的距离小于distance的所有城市:\n");
  35. printf("请分别输入x y z distance:");
  36. double x,y,z;
  37. double distance;
  38. scanf("%lf%lf%lf%lf",&x,&y,&z,&distance);
  39. ReturnCity(L,x,y,z,distance);
  40. return 0;
  41. }
  42. CityPtr CreatList(void)
  43. {
  44. CityPtr L=(CityPtr)malloc(sizeof(CityInfo));
  45. L->next=NULL;
  46. CityPtr p,Tail;
  47. Tail=L;
  48. int n,i;
  49. CityName *s;
  50. printf("请输入您想创建的城市个数:");
  51. scanf("%d",&n);
  52. for(i=1;i<=n;i++)
  53. {
  54. p=(CityPtr)malloc(sizeof(CityInfo));
  55. printf("请输入第%d个城市的名称:",i);
  56. s=(CityName*)malloc(sizeof(CityName)*20);
  57. scanf("%s",s);
  58. p->name=s;
  59. printf("请分别输入第%d个城市的x坐标,y坐标,z坐标:",i);
  60. scanf("%lf%lf%lf",&p->x,&p->y,&p->z);
  61. Tail->next=p;
  62. Tail=p;
  63. Tail->next=NULL;
  64. }
  65. return L;
  66. }
  67. void CheckCity(CityPtr L)
  68. {
  69. CityPtr p=L->next;
  70. int cnt=0;
  71. while(p)
  72. {
  73. cnt++;
  74. printf("第%d个城市的名字为%s,x坐标为%lf,y坐标为%lf,z坐标为%lf\n",cnt,p->name,p->x,p->y,p->z);
  75. p=p->next;
  76. }
  77. }
  78. void FindCity(CityPtr L)
  79. {
  80. int choose;
  81. double x,y,z;
  82. CityName *s;
  83. s=(CityName*)malloc(sizeof(CityName)*20);
  84. int cnt=0;
  85. CityPtr p=L->next;
  86. printf("选择查找城市的方式,输入1为利用名称查找,输入2为利用坐标查找:");
  87. scanf("%d",&choose);
  88. switch(choose)
  89. {
  90. case 1:
  91. printf("请输入你要查找的城市的名字:");
  92. scanf("%s",s);
  93. while(p)
  94. {
  95. cnt++;
  96. if(!(strcmp(s,p->name)))
  97. {
  98. printf("成功找到!,该城市在链表第%d个位置\n",cnt);
  99. return;
  100. }
  101. p=p->next;
  102. }
  103. printf("没有查找到相关城市\n");
  104. return;
  105. case 2:
  106. printf("清分别输入你要查找的城市的x,y,z坐标:");
  107. scanf("%lf%lf%lf",&x,&y,&z);
  108. while(p)
  109. {
  110. cnt++;
  111. if((x==p->x)&&(y==p->y)&&(z==p->z))
  112. {
  113. printf("成功找到!,该城市在链表第%d个位置\n",cnt);
  114. return;
  115. }
  116. p=p->next;
  117. }
  118. printf("没有查找到相关城市\n");
  119. return;
  120. default:
  121. printf("输入的内容有误!!\n");
  122. break;
  123. }
  124. return;
  125. }
  126. Status InsertCity(CityPtr L)
  127. {
  128. CityPtr p;
  129. CityName *s;
  130. s=(CityName*)malloc(sizeof(CityName)*20);
  131. p=(CityPtr)malloc(sizeof(CityInfo));
  132. printf("输入你想插入的城市的名字:");
  133. scanf("%s",s);
  134. p->name=s;
  135. double x,y,z;
  136. printf("清分别输入你要添加的城市的x,y,z坐标:");
  137. scanf("%lf%lf%lf",&x,&y,&z);
  138. p->x=x;
  139. p->y=y;
  140. p->z=z;
  141. printf("你要插到第几个城市的前面?输入数字以表示:");
  142. int i;
  143. scanf("%d",&i);
  144. CityPtr q=L;
  145. while(--i)
  146. {
  147. q=q->next;
  148. }
  149. p->next=q->next;
  150. q->next=p;
  151. return OK;
  152. }
  153. Status DeleteCity(CityPtr L)
  154. {
  155. CityPtr p=L;
  156. CityName *s;
  157. CityPtr q;
  158. s=(CityName*)malloc(sizeof(CityName)*20);
  159. printf("输入你想删除的城市的名字:");
  160. scanf("%s",s);
  161. while(p->next)
  162. {
  163. if(!(strcmp(s,p->next->name)))
  164. {
  165. q=p->next;
  166. p->next=q->next;
  167. free(q);
  168. printf("删除成功!\n");
  169. return OK;
  170. }
  171. p=p->next;
  172. }
  173. printf("删除失败,没有发现对应的城市!\n");
  174. return ERROR;
  175. }
  176. void ReturnCity(CityPtr L,double x,double y,double z,double distance)
  177. {
  178. CityPtr p=L->next;
  179. while(p)
  180. {
  181. if((p->x-x)*(p->x-x)+(p->y-y)*(p->y-y)+(p->z-z)*(p->z-z)<distance*distance)
  182. printf("%s\n",p->name);
  183. p=p->next;
  184. }
  185. }

测试图:

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/775456
推荐阅读
相关标签
  

闽ICP备14008679号