.城市链表:
将若干城市的信息,存入一个带头结点的单链表。结点中的城市信息包括:城市名,城市的位置坐标。要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。并且实现1)给定一个城市名,返回其位置坐标;2)给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。
一.要解决的问题
我第二个是选的是城市链表问题,此内容的大致问题是,将若干城市的信息,存到一个带头结点的单链表中,城市的信息包括了城市名,和城市的坐标,然后利用城市名和坐标和位置坐标进行有关查找、插入、删除、更新等操作。并且实现1)给定一个城市名,返回其位置坐标;2)给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市,那么问题就来了,我这一共要解决的问题有几个如下:
- 如何储存城市的信息
- 如何将城市的信息将它们相连起来
- 如何通过给定的城市名经行查找,插入,删除。
- 如何给定一个城市名,返回其坐标位置
- 如何给定一个坐标位置和一个距离,返回所有与P的距离小于等于D的城市呢?
二.算法基本思想描述:
那么接下来就说说我的算法的基本的思想的描述,首先我先通过定义一个城市的结构体,用来储存城市的信息,结构体中包含了城市名,坐标的初始化,通过函数Chucun();从键盘中输入城市的信息,当然城市的个数是自己定义的,方便后期的制作,因为城市不止一个,因此我还定义了一个储存城市个数的结构体数组Chengshi cheng[10];通过这两个函数就基本把城市信息给建立起来了,城市信息的查找我是通过strcmp(p->mingcheng,cheng1)该函数来通过字符串的比对当键盘输入的城市比对成功后就输出你要找的城市信息,并跳出,否则接着循环,而距离的判断是通过键盘新输入的坐标,与以保存好的城市坐标循环求出并判断两个城市的距离,当符合键盘给定的距离之后就将该城市的信息输出,删除城市的信息也是如此通过strcmp(p->mingcheng,delcity)判断,如果符合删除条件的话,就把该城市的信息除去,城市的插入环节
三、设计
1. 数据结构的设计
(1)城市信息的储存结构设计
用城市的结构体来储存城市的信息,利用char *mingcheng;来表示表示城市名,float X,Y;用来储存城市的信息的坐标,
//定义一个城市的结构体
struct Chengshi{
char *mingcheng;
float X,Y;
};
2. 算法的设计
(1)该程序包含了6个子函数集,
void Chucun(); //定义从键盘中输入城市信息
struct Chengshi cheng[10]; //储存城市名的数组结构
void chazhao(); //查找函数
struct Chengshi *p =cheng; //定义开始的数组值
void julihead(); //距离的判断函数
void delete1(); //城市信息的删除
void chahead(); //城市信息的插入函数
(2)城市距离查找算法
1. 如图形象的看出,如果红点为键盘要查找的与其城市的距离的话,那么就用两点一线的距离来判断该城市是否符合,而两个点的距离可用两个城市的坐标来求取,
sum=(fabs(x-(p->X)))*(fabs(x-(p->X)))+(fabs(y-(p->Y)))*(fabs(y-(p->Y)))
fabs(x-(p->X):为两点城市X坐标的差的绝对值,因为两点的距离,我是用三角形定理来求取的,因此通过该函数来求到两点的距离之后,便可以进行判断了。
2.信息储存算法设计
键盘输入该输入的城市信息,并先储存在事先定义好的数组结构中,接下来再输出现有的城市信息,把数组结构体的储存信息调到最后一位,方便新的城市信息输入。
四、代码
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<malloc.h>
#include<conio.h>
#include <math.h>
//定义一个城市的结构体
struct Chengshi{
char *mingcheng;
float X,Y;
};
void Chucun(); //定义从键盘中输入城市信息
int sl;
struct Chengshi cheng[10]; //储存城市名的数组结构
void chazhao(); //查找函数
struct Chengshi *p =cheng; //定义开始的数组值
void julihead();
void delete1();
void chahead();
int main(){
int xun;
int i;
printf("键盘输入创建城市信息\n");
printf("请输入几座城市;\n");
scanf("%d",&sl);
for( i=1;i<=sl;i++){
p->mingcheng=(char *)malloc(128);
printf("输入第%d 个城市名\n",i);
scanf("%s",(p->mingcheng)) ;
printf("请输入城市X坐标\n");
scanf("%f",&(p->X));
printf("请输入城市Y坐标\n");
scanf("%f",&(p->Y));
p++;
}
while(1)
{
printf("-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/\n");
printf("请你选择城市管理的相关操作:\n");
printf("1.显示你已输入的城市信息\n");
printf("2.查找城市信息\n");
printf("3.城市距离的查找\n");
printf("4.城市信息的删除\n");
printf("5.城市信息的插入\n");
printf("6.退出\n");
printf("请输入:\n");
scanf("%d",&xun);
switch(xun)
{
case 1:
Chucun();
break;
case 2:
chazhao();
break;
case 3:
julihead();
break;
case 4:
delete1();
break;
case 5:
chahead();
break;
case 6:
return 0;
break;
}
}
return 0;
}
void Chucun(){ //储存城市名的数组结构
p =cheng;
int j;
printf("*************%d\n",sl);
printf("以下是城市的信息:\n");
for(j=1;j<=sl;j++){
printf("城市名;%s X坐标为: %f Y坐标为:%f \n",p->mingcheng,p->X,p->Y);
p++;
}
}
void chazhao()
{
char cheng1[20];
int b=0;
p =cheng;
int h=0;
printf("欢迎来到城市查找:\n");
printf("请你输入该城市的名称: ");
scanf("%s",cheng1);
while(p->mingcheng !=NULL)
{
if(!(strcmp(p->mingcheng,cheng1))) //判断键盘输入的函数是否符合
{
printf("你要找的城市坐标为:X %f Y %f",p->X,p->Y);
h=1;
break;
}
p++;
}
if(h==0){
printf("你输入错误\n");
}
printf("\n");
}
void julihead()
{
float x,y;
p =cheng;
float sum,man;
float ju;
int i;
printf("欢迎来到位置距离判断操作:\n");
printf("请你给定个坐标我:\n");
printf("横坐标 x: ");
scanf("%f",&x);
printf("纵坐标 y: ");
scanf("%f",&y);
printf("\n");
printf("给个距离我:\n");
scanf("%f",&ju);
printf("%d ",ju);
printf("\n");
for(i=0;i<sl;i++){
sum=(fabs(x-(p->X)))*(fabs(x-(p->X))) + (fabs(y-(p->Y)))*(fabs(y-(p->Y)));
man=sqrt(sum);
if(man<ju){
printf("离城市距离为%f ",man);
printf("城市名;%s X坐标为: %f Y坐标为:%f \n",p->mingcheng,p->X,p->Y);
}else{
printf("对不起这个距离内没有相关的城市\n");
}
p++;
}
}
void delete1()
{
p =cheng;
int i=0;
int j;
char delcity[10];
printf("请你输入要删除的城市名:\n");
scanf("%s",&delcity);
while( sl !=i)
{
i++;
if(strcmp(p->mingcheng,delcity))
{
p++;
}
if(!strcmp(p->mingcheng,delcity))
{
p->mingcheng = NULL;
p->X = 0;
p->Y = 0;
break;
}
}
p =cheng;
printf("以下是新的城市的信息:\n");
for(j=1;j<=sl;j++){
printf("城市名;%s X坐标为: %f Y坐标为:%f \n",p->mingcheng,p->X,p->Y);
p++;
}
}
void chahead()
{
int j;
printf("欢迎来到城市的信息填入环节:\n");
p =cheng;
printf("以下是现有的城市信息:\n");
for( j=1;j<=sl;j++){
printf("城市名;%s X坐标为: %f Y坐标为:%f \n",p->mingcheng,p->X,p->Y);
p++;
}
sl++; //这里每添加一个城市,都要加1,为了后面循环查找
printf("\n 那么接下来就请你输入城市名:\n");
p->mingcheng=(char *)malloc(128);
scanf("%s",(p->mingcheng));
printf("请输入你的X坐标:\n");
scanf("%f",&(p->X));
printf("请输入你的Y坐标:\n");
scanf("%f",&(p->Y));
printf("城市名;%s X坐标为: %f Y坐标为:%f \n",p->mingcheng,p->X,p->Y);
p =cheng;
printf("城市信息填入后的信息:\n");
for(j=1;j<=sl+1;j++){
printf("城市名;%s X坐标为: %f Y坐标为:%f \n",p->mingcheng,p->X,p->Y);
p++;
}
printf("你已成功插入城市:\n");
}
五、测试数据及测试结果(截屏):
心得体会
这个实验比较基础,我刚开始的时候是感觉无从下手,然后我便从百度去开发,先了解别人的思路是如何实现的,然好在自己去探索怎么写,刚开始编程的时候遇到的问题也很多,上面的三个例子只是其中之一,还有一些忘了截图备注,这也是比较可惜的,所有以后无论是程序,还是编译环境的安装,遇到的问题都要积极的记录下来,可以把问题与解决的办法发布到博客上,帮助了别人也帮助了自己,好了先说一下该程序的总体功能吧,总体功能基本已经满足了题目的要求,当然还有很大的不足,因为是自己一步一步写出来的,因此解决某些问题的时候会比较得心应手,程序一定要自己亲自去动手才能成长起来,以为的去复制百度,去修修改改一些边幅的东西,感觉也没有必要,因为程序不仅能精炼我们的代码量,对于我们的思维的拓宽也是有很大的帮助,因为每个人看代码的思维都是有所不同的。