数据结构城市链表Word下载.docx
《数据结构城市链表Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构城市链表Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
3.概要设计
1)为了实现上述程序功能,需要定义单链表的抽象数据类型:
ADTLinkList{
数据对象:
D={ai|ai∈IntegerSet,i=0,1,2,…,n,n≥0}
数据关系:
R={<
ai,ai+1>
|ai,ai+1∈D}
基本操作:
CityCreateList()
操作结果:
构造一个城市链表L,录入五个城市信息.
search()
初始条件:
城市链表已存在
操作结果:
查找是否有与输入值一致的城市名,
若存在,返回城市的位置坐标;
Insert()
将新的城市信息插入到链表中
Delete()
初始条件:
删除链表需要删除的城市信息
distance()
输出给定的一个距离范围内的所有城市信息
alter()
修改链表中的城市信息
print()
打印出城市链表中的所有城市信息
begin()
在屏幕上显示操作功能号
2)本程序包含8个函数:
①主函数main()
②创建城市链表函数CityCreateList()
③显示操作功能函数voidbegin()
④显示单链表城市信息函数voidprint()
⑤插入一个城市函数voidInsert()
⑥删除一个城市信息函数voidDelete()
⑦查找城市坐标函数voidsearch()
⑧修改城市链表函数voidalter()
⑧查找一个固定距离范围内的城市voiddistance()
各函数间关系如下:
4.详细设计
#include<
stdio.h>
malloc.h>
math.h>
#include<
stdlib.h>
string.h>
typedefintstatus;
typedefstructdata{
charCname;
floatx;
floaty;
}data;
typedefstructCityNode{
datadata;
structCityNode*next;
}CityNode,*City;
CityL;
CityCreateList(){
//创建城市链表
inti;
Cityp;
L=(City)malloc(sizeof(CityNode));
L->
next=NULL;
printf("
请输入5个城市的数据域:
\n"
);
for(i=0;
i<
5;
i++){
p=(City)malloc(sizeof(CityNode));
scanf("
%c%f%f"
&
p->
data.Cname,&
data.x,&
data.y);
getchar();
p->
next=L->
next;
L->
next=p;
}
returnL;
}
voidsearch(){
//查找城市坐标
charname;
p=L;
请输入需要查找的城市名:
scanf("
%c"
name);
该城市的坐标为:
while(p){
if(p->
data.Cname==name)
%f,%f"
p->
data.x,p->
p=p->
voidInsert(){
//插入新的城市
Cityp=L->
Citys=(City)malloc(sizeof(CityNode));
请输入要插入的城市名及它的坐标"
%c,%f,%f"
s->
s->
next=p->
p->
next=s;
新城市%c插入成功\n"
s->
data.Cname);
voidDelete(){
//删除城市
Cityq,p=L->
intj=0;
charz;
printf("
请输入要删除的城市名:
scanf("
z);
while(p->
data.Cname!
=z){
q=p;
q->
free(p);
删除成功!
voiddistance(){
//距离范围内的城市
floats,d;
floatx1,y1,x2,y2;
Cityp;
p=L->
请输入中心坐标x1,y1:
x1,&
y1);
请输入与中心城市的距离范围d:
%f"
d);
while(p)
{x2=p->
data.x;
y2=p->
data.y;
s=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
if(s<
=d){
与(%f,%f)的中心城市的距离小于等于%f的城市有:
x1,y1,d);
data.Cname,x2,y2);
p=p->
voidalter(){
//修改城市节点
chara,b;
floatm,n;
intk=0;
Cityp=L;
请输入旧的城市名:
"
a);
while(p->
=a)
{
请输入新的城市名:
%c"
b);
请输入新的城市坐标:
m,&
n);
data.Cname=b;
data.x=m;
data.y=n;
voidprint(){
//输出城市链表
Citya;
charname[10];
floatx[10];
floaty[10];
a=L->
i=0;
while(a)
name[i]=a->
data.Cname;
x[i]=a->
y[i]=a->
a=a->
printf("
%c(%f,%f)\n"
name[i],x[i],y[i]);
i++;
voidbegin()
{
do
--------------------------------------------\n"
请选择需要操作的功能:
\n"
1->
输出城市链表信息\n"
2->
查找\n"
3->
插入\n"
4->
删除\n"
5->
修改\n"
6->
与坐标P距离小于D的城市\n"
0->
退出程序\n"
请输入您选择的功能号:
%d"
i);
getchar();
if(i>
0)
switch(i)
{
case1:
print();
break;
case2:
search();
case3:
Insert();
case4:
Delete();
case5:
alter();
case6:
distance();
case0:
}
if(i<
printf("
您输入的数值不正确,请重新输入!
}while(i!
=0);
voidmain(){
CreateList();
begin();
5.调试分析
a.是如何解决的以及对设计与实现的回顾讨论和分析;
调试过程中遇到的问题有在写调用函数是函数的形参的类型与实参的类型不一致我
经常在很多地方符号丢失
改进设想;
直接将数值在调用的函数里定义、输入及输出避免在主函数里传实参值,这样就不易出错。
b.经验和体会
写函数时对指针的应用有些混乱
总的来说还是对以前的C语言知识有些遗忘,基础不够扎实导致所发的时间太多了。
6.使用说明
程序名为Globals,运行环境为VC,每一步都有提示信息提示下一步的实现
功能及它的操作输入,当输入错误时有错误提示信息。
7.测试结果
1)输入数据打印出所有的城市信息
2)输入城市名查找出相应的位置坐标
3)将一个新的城市信息插入到链表中并打印出改动后的链表中的所有城市信息
4)删除一个城市信息并打印出改动后的链表中的所有城市信息
5)修改一个旧的城市信息输入新的城市名及坐标,改动后的链表中的所有城市信息
6)查找距离城市