数据结构课程设计实验1城市链表.docx

上传人:b****7 文档编号:26631732 上传时间:2023-06-20 格式:DOCX 页数:26 大小:137.05KB
下载 相关 举报
数据结构课程设计实验1城市链表.docx_第1页
第1页 / 共26页
数据结构课程设计实验1城市链表.docx_第2页
第2页 / 共26页
数据结构课程设计实验1城市链表.docx_第3页
第3页 / 共26页
数据结构课程设计实验1城市链表.docx_第4页
第4页 / 共26页
数据结构课程设计实验1城市链表.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

数据结构课程设计实验1城市链表.docx

《数据结构课程设计实验1城市链表.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计实验1城市链表.docx(26页珍藏版)》请在冰豆网上搜索。

数据结构课程设计实验1城市链表.docx

数据结构课程设计实验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);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1