城市链表实验报告Word文档格式.docx
《城市链表实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《城市链表实验报告Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
(一)城市链表:
(1)创建城市链表;
(2)给定一个城市名,返回其位置坐标;
(3)给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。
(4)在已有的城市链表中插入一个新的城市;
(5)更新城市信息;
(6)删除某个城市信息。
3,1,7,2,6,8,4
输出6,1,4,7,2,3,5。
五、附录
城市链表:
5.1问题分析
该实验要求对链表实现创建,遍历,插入,删除,查询等操作,故使用单链表。
5.2设计方案
该程序大致分为以下几个模块:
1.创建城市链表模块,即在空链表中插入新元素。
故创建城市链表中包涵插入模块。
2.返回位置坐标模块。
3.计算距离模块
4.插入模块。
5.更新城市信息模块
6.删除信息模块。
5.3算法
5.3.1根据中心城市坐标,返回在距离内的所有城市:
voidFindCityDistance(citylist*L){
//根据距离输出城市
……//输入信息与距离
L=L->
next;
while(L!
=NULL){
if(((L->
x-x1)*(L->
x-x1)+(L->
y-y1)*(L->
y-y1)<
=dis*dis)&
&
(((L->
y-y1))!
=0)){
printf("
城市名称%s\n"
L->
Name);
城市坐标%.2lf,%.2lf\n"
x,L->
y);
}
}
}
该算法主要用到了勾股定理,考虑到不需要实际数值,只需要大小比较,所以只用
横坐标差的平方+纵坐标差的平方<
=距离的平方判定。
因中心城市本身也在判定范围之内,所以添加了判定条件横纵坐标差的和不能为零。
5.3.2
主程序中循环条件判定:
for(;
;
){
printf("
请选择您的操作\n"
);
1.创建城市链表\n"
2.根据名字查询城市\n"
3.插入\n"
4.删除\n"
5.更新城市信息\n"
6.根据离中心坐标距离查看城市\n"
7.退出系统\n"
scanf("
%d"
&
choice);
switch(choice){
……//case语句
case7:
break;
if(choice==7)
break;
若用户选择了退出系统选项,则首先跳出switch在跳出for循环结束程序。
是
5.4流程图
5.5程序源代码
typedefstructcitylist{
charName[20];
doublex,y;
citylist*next;
}citylist,*L;
voidInitList_SqCity(citylist*L){
//初始化节点
L->
next=NULL;
voidInsert_sqCity(citylist*L){
//在链表中插入元素
citylist*newNode;
newNode=(citylist*)malloc(sizeof(citylist));
if(!
newNode)
存储分配失败"
printf("
请输入城市名\n"
scanf("
%s"
newNode->
请输城市坐标xy\n"
%lf%lf"
(newNode->
x),&
y));
while(L->
next!
=NULL){
L=L->
}//如果非空,L指针的位置向后移
newNode->
next=L->
next=newNode;
voidCreate_sqCity(citylist*L){
//创建链表charch[100];
inti;
输入END退出,输入其余值继续\n"
//当输入END时,在任意输入,则退出此操作
ch);
for(;
strcmp(ch,"
END"
)!
=0;
){
Insert_sqCity(L);
voidGet_sqCityCoord(citylist*L){
//输入城市信息返回坐标
charch[10];
输入要查询的城市"
next!
=NULL&
strcmp(L->
next->
Name,ch)){
if(L->
next==NULL)
城市不存在"
else{
%.2lf,%.2lf\n"
voidDelete_sqCity(citylist*L){
//删除城市信息,按名称/坐标
=NULL&
//删除位置不合理
next=L->
删除城市成功"
//根据距离输出城市
输入中心城市坐标"
doublex1,y1;
x1,&
y1);
输入距离"
doubledis;
%lf"
dis);
if(((L->
voidUpdate_sqCity(citylist*L){
//更新城市信息
请输入您要更新的城市名\n"
scanf("
while(strcmp(L->
城市不存在\n"
请输入城市新信息:
\n"
请输入城市新名\n"
请输入城市新坐标\n"
(L->
}
intmain(){
citylist*L;
L=(citylist*)malloc(sizeof(citylist));
InitList_SqCity(L);
for(;
-----------------------------------\n"
intchoice;
case1:
Create_sqCity(L);
getchar();
case2:
Get_sqCityCoord(L);
case3:
Insert_sqCity(L);
case4:
Delete_sqCity(L);
case5:
Update_sqCity(L);
case6:
FindCityDistance(L);
case7:
5.6仿真结果
2.查询城市信息
3添加城市
4删除城市
5更新城市
6根据距离输出城市
5.7调试心得
5.7.1错误分析:
实验中出现的第一个问题是声明变量,从键盘中读入数据是显示变量未初始化,调试后发现是scanf的问题,以后的实验中应注意scanf中读入信息后是存到了地址里。
5.7.2算法复杂度的分析:
所有程序除了InitList_SqCity复杂度为O
(1),其余均为O(n)。
5.7.3收获
对数据结构这门课地应用有了一定地了解,知道对线性表插入、删除等操作的实现,加深对课本地理解。
附录
约瑟夫环:
5.1问题分析
该实验要求循环连续查找信息,并删除节点,故使用单项循环链表。
5.2设计方案
1.建立单循环链表
2.产生Joseph环
3.输出顺序表
5.3算法
5.3.1构成单链表
voidCreat_JoephLink(intnum){
Node*head,*q,*L;
L=(Node*)mall