城市链表
1.问题描述:城市链表
将若干城市的信息,存入一个带头结点的单链表。结点中的城市信息
包括城市名和城市的位置坐标。
2. 基本要求:能够通过利用城市名和位置坐标进行有关查找、插入、
删除、更新等操作。
3. 算法思想
(1)创建一个城市链表,能够输入若干城市的信息,结点中城市信
息包括城市名和城市的位置坐标。
(2)创建一个查询函数,能够通过利用城市名查询位置坐标
(3)创建一个查询函数,能够通过位置坐标距离中心坐标的距离查
询城市名
(4)创建一个选择函数,来选择查询方式
(5)创建一个插入函数,能够插入新的城市信息
(6)创建一个删除函数,能够删除城市信息
(7)创建一个更新函数,能够更新城市信息
(8)在主函数中调用这些函数,通过 switch 来选择不同的函数满足
不同的要求
(9)执行完毕,退出程序
4. 模块划分
(1)void init(Citynode *Lhead)//初始化链表
(2)void creatlist(Citynode *Lhead)//创建城市链表
(3)void search1(Citynode *Lhead)//通过城市名查找城市坐标
(4)void search2(Citynode *Lhead)//通过与中心坐标的距离查询
城市信息
(5)void choose(Citynode *Lhead)//选择查询方式
(6)void insert(Citynode *Lhead)//插入新的城市
(7)void delet(Citynode *Lhead)//删除城市信息
(8)void update(Citynode *Lhead)//更新城市信息
(9)void print(Citynode *Lhead)//输出城市列表
(10)int main()//设置选择页面,调用不同的函数
5. 数据结构
所定义具体问题的基本类型:typedef int datatype;
typedef struct data{
char csname[30];
float a;
float b;
}data;
基本抽象数据类型:typedef struct Citynode{
data xx;
struct Citynode* next;
}Citynode,City;
6. 源程序
#include
#include
#include
#include
typedef int datatype;
typedef struct data{
char csname[30];
float a;
float b;
}data;
typedef struct Citynode{
data xx;
struct Citynode* next;
}Citynode,City;
void init(Citynode *Lhead)
{
}
Lhead->next=NULL;
void creatlist(Citynode *Lhead)//创建城市链表
{
int n;
printf("请输入要创建的链表的城市个数:");
scanf("%d",&n);
int i;
for(i=0;inext)
{
printf("请输入您要搜索的城市名称\n");
scanf("%s",sname);
while(p->next!=NULL&&strcmp(p->next->xx.csname,sname))
{
}
p=p->next;
if(p->next==NULL)
{
}
printf("您要查找的城市不存在");
return ;
printf("城市坐标为:(%f,%f)\n",p->next->xx.a,p->next->xx.b);
}
else
{
}
}
printf("链表未建立,请先建立链表");
void search2(Citynode *Lhead)//按坐标查询
{
char m;
float a1,b1;
Citynode *p=Lhead;
float distance;
if(p->next)
{
printf("请输入中心坐标 a,b\n");
scanf("%f%c%f",&a1,&m,&b1);
printf("请输入距离:");
scanf("%f",&distance);
printf("距中心坐标(%f,%f)的城市距离为",a1,b1);
printf("%f 的城市有:\n",distance);
p=p->next;
while(p!=NULL)
{
float
t=(a1-p->xx.a)*(a1-p->xx.a)+(b1-p->xx.b)*(b1-p->xx.b);
while(t<=distance*distance)
{printf("%s\t",p->xx.csname);
printf("(%.f,%.f)\n",p->xx.a,p->xx.b);break;}
p=p->next;}
}
else
{
}
}
printf("链表未建立,请先建立链表\n");
void choose(Citynode *Lhead)//选择查询方式进行查询,返回的是所要
查询的信息
{
Citynode *p=Lhead;
int s;
printf("___________________________\n");
printf("查询菜单\n");
printf("________________________\n");
printf("1.按名称查询\n");
printf("2.按坐标查询\n");
printf("3.返回上级菜单");
printf("___________________________\n");
scanf("%d",&s);
switch(s)
case 1:search1(p);break;
case 2:search2(p);break;
case 3:break;
default:printf("输入错误,请重新输入\n");break;
{
}
}
void insert(Citynode *Lhead)//插入新的城市,返回的是插入后的新链
表
{
Citynode * newnode;
char m;
newnode=(Citynode*)malloc(sizeof(Citynode));
if(newnode==NULL)
{
printf("内存分配失败\n");
return ;
}
printf("请输入城市名:\t");
scanf("%s",newnode->xx.csname);
printf("请输入城市坐标 a,b:\t");
scanf("%f%c%f",&newnode->xx.a,&m,&newnode->xx.b);
while(Lhead->next!=NULL)
Lhead=Lhead->next;
newnode->next=Lhead->next;
Lhead->next=newnode;
}
void delet(Citynode *Lhead)//删除城市信息,返回的是删除后的新链
表
{
}
char delname[30];
printf("请输入要删除的城市名称:\n");
scanf("%s",delname);
while(strcmp(Lhead->next->xx.csname,delname))
Lhead=Lhead->next;
Lhead->next=Lhead->next->next;