城市链表实验报告文档格式.docx
- 文档编号:20845110
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:14
- 大小:112.61KB
城市链表实验报告文档格式.docx
《城市链表实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《城市链表实验报告文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
(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*)malloc(sizeof(Node));
//申请第一个数的节点
head=L;
L->
num=1;
printf("
输入第一个人的值:
"
//输入第一个人的值
value));
inti;
for(i=2;
i<
=num;
i++){
q=(Node*)malloc(sizeof(Node));
next=q;
L=q;
输入第%d个人的值:
i);
//输入每个人的值
num=i;
next=head;
L=head;
//构成单向循环链表
5、3、2查找并删除节点
StatusDelete_Node(Node*L){
for(j=1;
j<
j++){
for(i=1;
m;
i++){//i做循环变量
L=L->
m=L->
value;
//将当前值设为m值
%d"
num);
//输出当前节点信息
//删除当前节点
num=L->
num;
value=L->
q=L->
free(q);
5、4源程序代码
typedefstructNode{
intvalue;
Node*next;
intnum;
}Node;
intm;
intj;
输入初始值m的大小"
m);
结果就是:
输入人数:
/*输入测试人的数量*/
Creat_JoephLink(num);
5、5运行结果
5、6调试心得
5、6、1错误分析
查找到第m个节点删除时出错,显示有未处理的异常,就是因为节点赋值的时候有问题。
5、6、2收获
从开始构建循环链表然后实现约瑟夫环功能的过程中,中途也遇见一些问题,但都逐一克服,整个过程进展不就是很顺利,都就是不停的调试,实验之后,我还对数据结构这门课有了一定的认识。
在解决一个具体问题时,常常需要从具体问题中抽象出一个模型,也就就是抽象数据类型,然后设计一个解决这个模型的算法。
再通过其算法编出程序,进行调试、调整直至得到最终解答。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 城市 实验 报告