数据结构课程设计实验1城市链表.docx
- 文档编号:26631732
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:26
- 大小:137.05KB
数据结构课程设计实验1城市链表.docx
《数据结构课程设计实验1城市链表.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计实验1城市链表.docx(26页珍藏版)》请在冰豆网上搜索。
数据结构课程设计实验1城市链表
数据结构课程设计实验报告
实验一链表部分选题为:
2.4.3—城市链表
1、需求分析
(1)创建一个带有头结点的单链表。
(2)结点中应包含城市名和城市的位置坐标。
(3)对城市链表能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。
(4)能够对每次操作后的链表动态显示。
2、概要设计
为了实现以上功能,可以从以下3个方面着手设计。
(1)主界面设计
为了实现城市链表相关操作功能的管理,设计一个含有多个菜单项的主控菜单子程序以系统的各项子功能,方便用户使用本程序。
本系统主控菜单运行界面如下所示。
(2)存储结构设计
本系统主要采用链表结构类型来表示存储在“城市链表”中的信息。
其中链表结点由4个分量组成:
城市名name、城市的横坐标posx、城市的纵坐标posy、指向下一个结点的指针next。
(3)系统功能设计
本程序设计了9个功能子菜单,其描述如下:
1建立城市链表。
由函数creatLink()实现。
该功能实现城市结点的输入以及连接。
2插入链表记录。
由函数insert()实现。
该功能实现按坐标由小到大的顺序将结点插入到链表中。
3查询链表记录。
由searchName()函数和searchPos()函数实现。
其中searchName()实现按照城市名查询的操作,searchPos()实现按照城市坐标查询的操作。
4删除链表记录。
由delName()函数和delPos()函数实现。
其中delName()函数实现按照城市名删除的操作,delPos()函数实现按照城市坐标删除的操作。
5显示链表记录。
由printList()函数实现。
该功能实现格式化的链表输出操作,可以显示修改后的链表状态。
6更新链表信息。
由update()函数实现。
该功能实现按照城市名更新城市的坐标信息。
7返回城市坐标。
由getPos()函数实现。
该功能实现给定一个已存储的城市,返回其坐标信息的操作。
8查看与坐标P距离小于等于D的城市。
由getCity()函数实现。
该功能实现返回与给定坐标P距离小于等于D的城市名称。
9退出链表系统。
由exit(0)实现。
3、模块设计
(1)模块设计
本程序包含两个模块:
主程序模块和链表操作模块。
其调用关系如下图所示:
(2)系统子程序及功能设计
本系统共设置3个子程序,各程序的函数名及功能说明如下:
①LinklistcreatLink()//创建一个城市链表,返回头结点地址
②printList(LinklistL)//打印头结点地址为L的城市链表
③intsearchName(LinklistL,charname[20])//以城市名查找
④intsearchPos(LinklistL,intpx,intpy)//以城市坐标查找
⑤intinsert(LinklistL,Linklistcity)//插入
⑥intdelName(LinklistL,charname[20])//利用城市名称删除
⑦intdelPos(LinklistL,intpx,intpy)//利用坐标删除
⑧intupdate(LinklistL,charname[20])//更新
⑨intgetPos(LinklistL,charname[20])//给定一个城市名,返回城市坐标
⑩intgetCity(LinklistL,intpx,intpy,intd)//给定一个城市坐标P,返回距离小于等于d的城市
⑪voidmain()//主函数,实现链表各项操作的选择
(3)函数主要调用关系图
本系统3个子程序之间的主要调用关系如图所示。
4、详细设计
(1)数据类型定义
typedefstructLNode{//城市结点
charname[20];
intposx;//横坐标
intposy;//纵坐标
structLNode*next;
}LNode,*Linklist;
(2)系统主要子程序详细设计
①建立城市链表
LinklistcreatLink()//创建一个城市链表,返回头结点地址
{
LinklistL=(Linklist)malloc(LEN);//头结点
L->next=NULL;
Linklistp;
charname[20];
intpx;
intpy;
charend[4]="end";
printf("请输入城市名称、横坐标和纵坐标,建立城市链表,以'end'为输入结束标志\n");
printf("请输入城市名称:
");
scanf("%s",name);
while(strcmp(name,end))
{
printf("请输入横坐标x:
");
scanf("%d",&px);
printf("请输入纵坐标y:
");
scanf("%d",&py);
p=(Linklist)malloc(LEN);//新结点
strcpy(p->name,name);
p->posx=px;
p->posy=py;
insert(L,p);//插入新结点
printf("请输入城市名称:
");
scanf("%s",name);
}
return(L);
}
②插入链表记录
intinsert(LinklistL,Linklistcity){//插入
Linklistp=L->next;
Linklistp_prior=L;
while(p!
=NULL&&city->posx>=p->posx)
{
if(p->posx==city->posx&&p->posy==city->posy)
{
printf("重复输入!
\n");return0;
}
p=p->next;
}//确定city插入的位置
while(p_prior->next!
=p)
{
p_prior=p_prior->next;
}
if(p==NULL)
{
p=p_prior;
city->next=NULL;
p->next=city;
}
else//若为空表,插到头结点之后
{
p=p_prior;
city->next=p->next;
p->next=city;
}
return1;
}
③按名称删除链表记录
intdelName(LinklistL,charname[20]){//利用城市名称删除
intflag=0;
intseat=1;
Linklistp=L;
if(p->next==NULL)
printf("该链表中没有元素,删除失败\n");
else
{
while(p->next!
=NULL)
{
if(!
strcmp(p->next->name,name))
{
flag=1;
printf("城市%s被删除\n",name);
Linklistq=p->next;
p->next=q->next;
free(q);
}
else{p=p->next;}
}
}
returnflag;
}
5、测试分析
(1)实验中遇到的问题以及对设计与实现的回顾讨论和分析
1城市链表在开始的建立时,由于头结点指针的判断错误,导致链表头结点中存有信息,而在后面的插入和删除操作中并未考虑到,导致链表记录出错,指针错位。
2在链表的删除过程中,由于删除的时判断的结点,故应找到起前驱指针,一开始并未考虑到这些,在无法删除的时候才想起来改进方法,后来设置了一个prior指针,专门找到对应结点的前驱,方便删除操作。
3课题拓展训练为为城市加入其他信息,如人口数等。
考虑到此项添加仅是在数据定义中再加入一个数据项,为了方便实验进行与演示,就没有进行扩展。
如需实现,可在Lnode的定义中,加入intnum等语句。
4链表建立初期,个人的想法是按照新增结点插入按顺序插入到链表中,删除时可以按照城市名称和城市坐标进行删除。
在具体的实现过程中,使用了菜单选择的方法,方便用户使用系统。
(2)算法的时空分析
算法使用动态分配空间的方式执行,故其执行时间与链表记录个数有关,如果有n个城市结点,其时间复杂度为O(n)。
(3)经验和体会
通过本次实验,对于链表部分的相关功能,如插入、删除、排序等相关算法进一步熟悉了。
能够利用所学知识,解决相关问题,并能够正确解决实验过程中出现的差错。
(4)测试功能展示
1城市链表的建立
在主菜单下,用户输入1并回车,然后按照提示建立城市链表,运行结果如下所示:
2插入链表记录
3查询链表记录:
4删除链表记录
5显示链表记录
6更新链表信息
7返回城市坐标
8查看与坐标P距离小于等于D的城市
6、源程序清单
#include
#include
#include
#include
#defineLENsizeof(LNode)
typedefstructLNode{
charname[20];
intposx;//横坐标
intposy;//纵坐标
structLNode*next;
}LNode,*Linklist;
//用于城市结点
intinsert(LinklistL,Linklistcity);
LinklistcreatLink()//创建一个城市链表,返回头结点地址
{
LinklistL=(Linklist)malloc(LEN);//头结点
L->next=NULL;
Linklistp;
charname[20];
intpx;
intpy;
charend[4]="end";
printf("请输入城市名称、横坐标和纵坐标,建立城市链表,以'end'为输入结束标志\n");
printf("请输入城市名称:
");
scanf("%s",name);
while(strcmp(name,end))
{
printf("请输入横坐标x:
");
scanf("%d",&px);
printf("请输入纵坐标y:
");
scanf("%d",&py);
p=(Linklist)malloc(LEN);//新结点
strcpy(p->name,name);
p->posx=px;
p->posy=py;
insert(L,p);//插入新结点
printf("请输入城市名称:
");
scanf("%s",name);
}
return(L);
}
voidprintList(LinklistL)
{//打印头结点地址为L的城市链表
printf("\n------------------------\n");
printf("城市\t坐标\n");
printf("-------------------------\n");
Linklistp=L->next;
intn=1;
if(L->next==NULL)printf("该链表中没有元素\n");
else
while(p!
=NULL)
{
printf("%s",p->name);
printf("\t(%d,%d)\n",p->posx,p->posy);
p=p->next;
}
printf("-------------------------\n");
return;
}
intsearchName(LinklistL,charname[20]){//以城市名查找
intflag=0;
Linklistp=L->next;
if(L->next==NULL)printf("该链表中没有元素,查找失败\n");
else
{
while(p!
=NULL){
if(!
strcmp(p->name,name))
{
flag=1;
printf("您要查找的是%s城市\n",p->name);
printf("该城市坐标为(%d,%d)\n",p->posx,p->posy);
}
p=p->next;
}
}
returnflag;
}
intsearchPos(LinklistL,intpx,intpy){//以城市坐标查找
intflag=0;
Linklistp=L->next;
if(L->next==NULL)printf("该链表中没有元素,查找失败\n");
else
{
while(p!
=NULL){
if(p->posx==px&&p->posy==py)
{
flag=1;
printf("您要查找城市坐标为(%d,%d)\n",p->posx,p->posy);
printf("该城市是%s\n",p->name);
}
p=p->next;
}
}
returnflag;
}
intinsert(LinklistL,Linklistcity){//插入
Linklistp=L->next;
Linklistp_prior=L;
while(p!
=NULL&&city->posx>=p->posx)
{
if(p->posx==city->posx&&p->posy==city->posy)
{
printf("重复输入!
\n");return0;
}
p=p->next;
}//确定city插入的位置
while(p_prior->next!
=p)
{
p_prior=p_prior->next;
}
if(p==NULL)
{
p=p_prior;
city->next=NULL;
p->next=city;
}
else//若为空表,插到头结点之后
{
p=p_prior;
city->next=p->next;
p->next=city;
}
return1;
}
intdelName(LinklistL,charname[20]){//利用城市名称删除
intflag=0;
intseat=1;
Linklistp=L;
if(p->next==NULL)
printf("该链表中没有元素,删除失败\n");
else
{
while(p->next!
=NULL)
{
if(!
strcmp(p->next->name,name))
{
flag=1;
printf("城市%s被删除\n",name);
Linklistq=p->next;
p->next=q->next;
free(q);
}
else{p=p->next;}
}
}
returnflag;
}
intdelPos(LinklistL,intpx,intpy){//利用坐标删除
intflag=0;
Linklistp=L;
if(p->next==NULL)
printf("该链表中没有元素,删除失败\n");
else
{
while(p->next!
=NULL)
{
if(p->next->posx==px&&p->next->posy==py)
{
Linklistq=p->next;
p->next=q->next;
free(q);
flag=1;
printf("坐标为(%d,%d)的城市被删除\n",px,py);
}
else{p=p->next;}
}
}
returnflag;
}
intupdate(LinklistL,charname[20]){//更新
intflag=0;
Linklistp=L->next;
if(L->next==NULL||L==NULL)printf("该链表中没有元素,更新失败\n");
else
{
while(p!
=NULL){
if(!
strcmp(p->name,name))
{
flag=1;
printf("您要更新的是%s城市\n",p->name);
printf("请输入横坐标x:
");
scanf("%d",&p->posx);
printf("请输入纵坐标y:
");
scanf("%d",&p->posy);
}
p=p->next;
}
}
returnflag;
}
intgetPos(LinklistL,charname[20]){//给定一个城市名,返回城市坐标
intflag=0;
Linklistp=L->next;
if(L->next==NULL||L==NULL)printf("该链表中没有元素,返回坐标失败\n");
else
{
while(p!
=NULL){
if(!
strcmp(p->name,name))
{
flag=1;
printf("您要查看的是%s城市\n",p->name);
printf("该城市坐标为:
(%d,%d)\n",p->posx,p->posy);
}
p=p->next;
}
}
returnflag;
}
intgetCity(LinklistL,intpx,intpy,intd){//给定一个城市坐标P,返回距离小于等于d的城市
intflag=0;
doubledistance;
Linklistp=L->next;
if(L->next==NULL||L==NULL)printf("该链表中没有元素,返回坐标失败\n");
else
{
while(p!
=NULL){
distance=sqrt((p->posx-px)^2+(p->posy-py)^2);
if(distance<=d)
{
flag=1;
printf("该城市为:
%s",p->name);
}
p=p->next;
}
}
printf("\n");
returnflag;
}
voidmain()
{
LinklistL=NULL;
printf("\n**************欢迎使用城市链表系统***************\n");
printf("*1建立城市链表*\n");
printf("*2插入链表记录*\n");
printf("*3查询链表记录*\n");
printf("*4删除链表记录*\n");
printf("*5显示链表记录*\n");
printf("*6更新链表信息*\n");
printf("*7返回城市坐标*\n");
printf("*8查看与坐标P距离小于等于D的城市*\n");
printf("*9退出链表系统*\n");
printf("*************欢迎使用城市链表系统****************\n");
intmain_flag=0;
intflag;
intmenu;
printf("请选择1-9:
");
scanf("%d",&menu);
while(menu)
{
switch(menu)
{
case1:
//建立城市链表
{
L=creatLink();
printf("建立城市链表:
");
printList(L);
main_flag=1;
break;
}
case2:
//插入链表记录
{
if(main_flag==1)
{
charname[20];
intpx,py;
printf("请输入城市名称:
");
scanf("%s",name);
printf("请输入横坐标x:
");
scanf("%d",&px);
printf("请输入纵坐标y:
");
scanf("%d",&py);
Linklistp=(Linklist)malloc(LEN);//新结点
strcpy(p->name,name);
p->posx=px;
p->posy=py;
insert(L,p);//有序的插入新结点
printf("插入后的城市链表为:
");
printList(L);
}
elseprintf("\nERROR:
链表还没有建立,请先建立链表\n");
break;
}
case3:
//查询链表记录
{
intway;
charname[20];
intpx,py;
if(L!
=NULL)
{
if(main_flag)
{
printf("选择查找方式:
1.按城市名2.按城市坐标\t选择:
");
scanf("%d",&way);
if(way==1)
{
printf("\n请输入城市名:
");
scanf("%s",name);
flag=searchName(L,name);
if(flag==0)printf("无此城市记录,查找失败!
\n");
}
elseif(way==2)
{
printf("请输入横坐标x:
");
scanf("%d",&px);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 实验 城市