数据结构实验报告.docx
- 文档编号:5395642
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:27
- 大小:125.51KB
数据结构实验报告.docx
《数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告.docx(27页珍藏版)》请在冰豆网上搜索。
数据结构实验报告
实验目的:
1、学会将信息存入带头结点的单链表中。
2、能够对节点中的信息进行查找、插入、删除和更新等操作。
3、学会对单链表的信息进行灵活运用,能够结合到实际运用中。
实验内容:
【问题描述】:
将若干城市的信息,存入一个带头结点的单链表。
结点中的城市信息包括:
城市名,城市的位置坐标。
要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。
【基本要求】
(1)给定一个城市名,返回其位置坐标;
(2)给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。
【测试数据】
由学生依据软件工程的测试技术自己确定。
注意测试边界数据。
实验步骤:
(一)需求分析
1、本演示程序中,需要建立一个新的城市链表,链表建成后根据计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中的运算命令和输入相应的数据并输出结果;
2、程序执行的命令包括:
1)建立城市链表;2)查找城市;3)添加城市;4)删除城市;5)城市更新;6)输出链表;7)城市搜索;8)退出链表。
3、测试数据:
城市名:
wuhan坐标:
(23,12)人口:
939面积:
352
城市名:
beijing坐标:
(73,32)人口:
637面积:
673
城市名:
shanghai坐标:
(43,22)人口:
876面积:
342
(二)概要设计
1、数据类型定义:
单链表的存储结构
typedefstructLNode
{ElemTypedata;
structLNode*next;
}LNode,*LinkList;
typedefstruct
{
charname[20];
intx;
inty;
floatpopulation;
floatarea;
}LinkList;
创建链表:
LinkListCreate()
销毁链表:
voiddestroyLinkList(LinkList&L)
插入城市:
Insert(LinkListL,LinkListElem)
打印城市链表:
PrintL(LinkListL)
打印城市信息:
PrintP(LinkListP)
按城市名查找:
LinkListSearchName(LinkListL,charname[])
按城市位置查找:
LinkListSearchPosition(LinkListL,intX,intY)
按城市名删除:
LinkListDelName(LinkListL,charname[])
按城市位置删除:
LinkListDelPosition(LinkListL,intX,intY)
按城市名更新:
LinkListChangeName(LinkListL,charname[])
按城市位置更新:
LinkListChangePosition(LinkListL,intX,intY)
城市搜索:
Search(LinkListL,intX,intY,floatr)
2、本程序还有8个模块:
主程序模块:
voidmain(){
switch()
case1:
建立城市链表模块;
case2:
查找城市模块;
case3:
添加城市模块;
case4:
删除城市模块;
case5:
城市更新模块;
case6:
输出链表模块;
case7:
城市搜索模块;
case0:
退出;
}
各模块关系如下
主函数
建立城市链表
查找城市
添加城市
城市更新
输出链表
城市搜索
退出程序
删除城市
(三)详细设计
1、定义元素的类型、结点类型和指针类型
typedefstructLNode
{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;//结点类型,指针类型
StatusLinkListCreate(LinkList&L,ElemTypee)
{//分配由L指向的元素为e、后继为空的结点时,则创建链表
//若分配失败,则销毁链表L
L=(LinkList)malloc(sizeof(LNode));
if(!
L){destroyLinkList(L);}
L->data=e;L->next=NULL;
}
voiddestroyLinkList(LinkList&L)
{//空间分配失败后,对链表L进行销毁
LinkListP;
P=L->next;
L->next=P->next;deleteP;
P=L->next;L=NULL;
}
2、根据单链表的基本操作的特点,实现链表元素的查找、增加、删除。
typedefstruct
{
charCityName[20];//城市的名称
intx;//横坐标
inty;//纵坐标
floatpopulation;//人口
floatarea;//面积
}LinkList;
LinkListSearchName(LinkListL,charCityName[])
{//实现链表元素的查找,若查找到元素CityName则返回P链表
//若未找到则返回NULL
for(LinkListP=L->next;P->next!
=NULL;P=P->next)
if(!
strcmp(P->CityName,CityName))returnP;
elsereturnNULL;
}
voidInsert(LinkListL,LinkListCity)
{实现链表元素的增加,在链表的末尾增加City所指向的结点
LinkListP=L;
while(P->next!
=NULL)
{
P=P->next;
}
P->next=City;//City指向*P的后继,P指向最后一个元素的结点
City->next=NULL;
}
LinkListDelName(LinkListL,charCityName[])
{//实现链表元素的删除,首先找到要删除的元素CityName的指针,然后进行删除
//完成删除操作后返回链表L
LinkListP=L->next,Q=L;
for(;P->next!
=NULL;P=P->next,Q=Q->next)
if(!
strcmp(P->CityName,CityName))
{
Q->next=P->next;//Q的后继指向P的后继元素的结点
returnL;
}
if(!
strcmp(P->CityName,CityName))
{
Q->next=NULL;//Q的后继指向空结点
returnL;
}
elsereturnL;
}
voidPrintL(LinkListL)
{//对链表元素的输出
P=L->next;
while(P->next!
=NULL)
{
printf(“”,);//输出已输入的信息
P=P->next;
}
}
3、主函数及其函数的算法
voidmain()
{//主函数
LinkListP;LinkListL=NULL;//链表的初始化
scanf("%d",&a);
while(a!
=0)
{//解释执行操作命令a
switch(a)
{
case1:
{//链表的创建,输入城市信息
L=Create(L,e);
break;
}
case2:
{//输入查找方式,查找所要查找的城市的信息
scanf();//输入查找方式
if(b==1)
{
P=SearchName(L,CityName);//根据城市名查找
PrintP(P);//打印城市信息
}
else
{
P=SearchPosition(L,X,Y);//根据城市位置查找
PrintP(P);//打印城市信息
}
break;
}
case3:
{//输入要添加的城市的信息
LinkListP=(LinkList)malloc(sizeof(LNode));
scanf();//输入城市的信息
Insert(L,P);//插入到链表城市信息中
PrintP(P);//打印城市链表信息
}
case4:
{//删除已存在的城市的信息
if()//选择删除方式
{
scanf();//输入删除的方式
L=DelName();//按照城市名删除
}
elseif(b==2)
{
scanf();//输入删除的方式
L=DelPosition(L,X,Y);//按照城市位置删除
}
break;
}
case5:
{//对城市信息的更新
if()//选择更新的方式
{
scanf();//输入更新方式
L=ChangeName(L,CityName);//根据城市名更新
}
else
{
scanf();//输入更新方式
L=ChangePosition(L,X,Y);//根据城市位置更新
}
break;
}
case6:
{
PrintL(L);//打印城市信息
break;
}
case7:
{//搜索城市并输出该城市的信息
scanf();//输入城市的位置和要搜索的范围
Search(L,X,Y,r);//搜索城市
break;
}
}
}
}
各模块函数之间的调用关系:
建立城市链表模块:
main
Create
NULL
destroyLinkList
否
Insert
查找城市模块:
main
SearchName
SearchPosition
PrintP
1
2
添加城市模块:
main
Insert
PrintP
删除城市模块:
main
DelName
DelPosition
1
2
城市更新模块:
main
ChangeName
ChangePosition
1
2
输出链表模块:
main
PrintL
城市搜索模块:
main
Search
(四)调试分析
1、刚开始进行调试的时候,程序出现了许多小错误不能运行,然后开始去找出错误,发现源代码分布不合理而且没有条理性,在找错误过程花费了比较多的时间,然后一边改错一边进行调整源代码的顺序,使其看起来更具有层次感,易于分析。
2、程序运行时的用户界面简洁,层次清楚明了。
模块的划分比较合理,操作简单,能够较好地实现实验要求。
在实验过程中仍然发现了一些需要注意的问题,在使用添加城市功能时,必须要在建立好城市链表的前提下。
3、算法的时空分析,由于程序运用的单链表采用了数组,对链表的长度会有所限制,存储空间就得根据实际情况来进行适当的改变和进行另外空间的申请。
各操作的算法比较简单,时间复杂度很小,程序运行效率较高。
4、创建城市链表时,输入城市信息较为繁琐,每个城市信息输入完后,若还想输入其它城市信息,则继续输入,否则输入end退出,所以在输入信息时需注意输入步骤,以免发生输入混乱。
(五)用户手册
1、本程序的运行环境为DOS操作系统,本程序执行文件为“城市链表.exe”。
2、进入演示程序后就可以看到用户使用界面
在“输入操作”后面输入0—7之内的数字就可以进入到相应的操作模块(注意:
在每一次输入完信息后要以回车键结束)
3、在一些模块当中要按照模块当中设定的要求输入,里面会有相应的引导。
4、接受命令后即执行相应的运算和显示相应的结果。
(六)测试结果
建立城市链表的菜单选项:
选择建立城市链表后,输入城市的信息,最后输入“end”结束建立链表:
创建完城市链表信息后,对城市进行查找,有两种方式可以选择:
按城市名和城市的位置查找:
选择添加城市,输入新添加城市的信息:
对已建立的城市链表信息进行删除,可以选择两种方式:
按城市名和城市位置删除:
对已建立链表的城市信息进行更新:
打印建立的城市链表信息:
搜索城市一定范围内的城市信息:
(九)附录:
源程序清单
#include
#include
#include
#include
//*****************************************************
TypedefstructLNode//结点类型,指针类型
{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
//*****************************************************
typedefstruct
{
CharCityName[20];//城市名
intx;//横坐标
inty;//纵坐标
floatpopulation;//人口
floatarea;//面积
}LinkList;
//*****************************************************
voiddestroyLinkList(LinkList&L)
{
LinkListP;
P=L->next;
while(P)
{
L->next=P->next;
deleteP;
P=L->next;
}
deleteL;
L=NULL;
}
//*****************************************************
voidInsert(LinkListL,LinkListCity)//插入城市
{
LinkListP=L;
while(P->next!
=NULL)
{
P=P->next;
}
P->next=City;
City->next=NULL;
}
//*****************************************************
StatusLinkListCreate(LinkList&L,ElemTypee)//创建链表
{
LinkListP=NULL;charCityName[20];
printf("输入城市名为end时表示建立结束!
\n");
L=(LinkList)malloc(sizeof(LNode));//为链表L分配空间
if(!
L){destroyLinkList(L);}
L->data=e;L->next=NULL;
P=L;
printf("输入城市名:
");
scanf("%s",CityName);
while(strcmp(CityName,"end"))//利用城市名输入是否为“end”,判断是否终止城市信息输入
{
P=(LinkList)malloc(sizeof(LNode));
P->next=NULL;
strcpy(P->CityName,CityName);
printf("输入城市的横坐标X:
");
scanf("%d",&P->x);
printf("输入城市的纵坐标Y:
");
scanf("%d",&P->y);
printf("输入城市的人口:
");
scanf("%f",&P->population);
printf("输入城市的面积:
");
scanf("%f",&P->area);
Insert(L,P);
printf("输入城市名:
");
scanf("%s",CityName);
}
returnL;
}
//*****************************************************
voidPrintL(LinkListL)//打印城市链表
{
printf("_______________________________________________________________________\n");
printf("城市位置(X,Y)人口(万)面积(KM2)\n");
printf("_______________________________________________________________________\n");
LinkListP=L->next;
while(P->next!
=NULL)
{
printf("%-8s(%-4d,%-4d)%6.2f%6.2f\n",P->CityName,P->x,P->y,P->population,P->area);
P=P->next;
}
printf("%-8s(%-4d,%-4d)%6.2f%6.2f\n",P->CityName,P->x,P->y,P->population,P->area);
printf("_______________________________________________________________________\n");
}
//*****************************************************
voidPrintP(LinkListP)//打印城市信息
{
printf("_______________________________________________________________________\n");
printf("城市位置(X,Y)人口(万)面积(KM2)\n");
printf("_______________________________________________________________________\n");
printf("%-8s(%-4d,%-4d)%6.2f%6.2f\n",P->CityName,P->x,P->y,P->population,P->area);
printf("_______________________________________________________________________\n");
}
//*****************************************************
LinkListSearchName(LinkListL,charCityName[])//按城市名查找
{
LinkListP=L->next:
for(;P->next!
=NULL;P=P->next)//搜索链表城市直到为空
if(!
strcmp(P->CityName,CityName))returnP;//利用指针指向城市名判断是否为所要查找城市
elsereturnNULL;
}
//*****************************************************
LinkListSearchPosition(LinkListL,intX,intY)//按城市位置查找
{
LinkListP=L->next;
for(;P->next!
=NULL;P=P->next)//搜索链表城市直到为空
if((P->x==X)&&(P->y==Y))returnP;//利用链表指针判断是否为所要查找城市
elsereturnNULL;
}
//*****************************************************
LinkListDelName(LinkListL,charname[])//按城市名删除
{
LinkListP=L->next,Q=L;
for(;P->next!
=NULL;P=P->next,Q=Q->next)
if(!
strcmp(P->CityName,CityName))//利用指针指向城市名判断是否为所要查找城市
{
Q->next=P->next;//删除城市
returnL;
}
elsereturnL;
}
//*****************************************************
LinkListDelPosition(LinkListL,intX,intY)//按城市位置删除
{
LinkListP=L->next,Q=L;
for(;P->next!
=NULL;P=P->next,Q=Q->next)//利用链表指针判断是否为所要查找城市
if((P->x==X)&&(P->y==Y))
{
Q->next=P->next;//删除城市
returnL;
}
elsereturnL;
}
//*****************************************************
LinkListChangeName(LinkListL,charCityName[])//按城市名更新
{
inta;
LinkListL;
P=SearchName(L,CityName);
printf("输入改变目标(1.人口2.面积):
");
scanf("%d",&a);
if(a==1)
{
printf("输入现在人口:
");
scanf("%f",&P->population);
PrintP(P);
returnL;
}
else
{
printf("输入现在面积:
");
scanf("%f",&P->area);
PrintP(P);
returnL;
}
}
//*****************************************************
LinkListChangePosition(LinkListL,intX,intY)//按城市位置更新
{
inta;
Link
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)