数据结构课程设计报告Word下载.docx
- 文档编号:4419686
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:33
- 大小:237.77KB
数据结构课程设计报告Word下载.docx
《数据结构课程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告Word下载.docx(33页珍藏版)》请在冰点文库上搜索。
设计三个链表,分别为A(可以租借),R(已借),I(修理中)。
链表的操作有初始化通用过InitList()实现,链表的插入有函数linkInsert(),链表的排序通过插入排序,建立一个新的排序链表,由于三个链表的排序关键字不同,所以设计了Run_Sort()(按行驶路程排序,链表A)、Time_Sort()(按返回时间排序,链表I,R)函数实现,对三个链表进行排序。
使用Newday()函数模拟时间过去一天,返回时间减1。
为了使导入数据方便,数据的导入方式为文件导入,三种状态的车辆信息分别放在afr.txt(可以租借),rd.txt(已借),ir.txt(修理中)里面,打开程序后遍自动导入。
同时可以在这三个文件里经行修改管理。
引入新车:
在链表A的第一个结点前添加新节点。
租借:
将链表A的第一个结点删除,按返还时间排序后添加到链表R中。
收费:
被租借的车按一定的计算方法求的费用。
修理:
在链表A中,判断是否行驶路程超过一定值,如超过,则删除结点,添加到链表I的尾部。
基本功能包括:
1.添加新车2.租借3.修理4.查询车辆
5.显示所有车辆状态6.显示财务状况7.新的一天
结构关系:
enum{AFR,RD,IR}CarKind;
//{可以租借,已借,修理中}
头文件:
InitList(LinkList&
L)//构造一个空的带头结点的链表
ListInsert(LinkListL,inti,ElemTypee)//L为带头结点的单链表的头指针,本算法
//在链表中第i个结点之前插入新的元素e
Run_Sort(LinkListL,ElemTypee)//按路程查找e所排的位置序列,并返回序列
Time_Sort(LinkListL,ElemTypee)//按返回时间查找e所排的位置序列,并返回序列
ListDelete(LinkListL,ElemType&
e)//删除以L为头指针(带头结点)的单链表中第1个结点,并赋值给e
Display(LinkListL)//打印链表信息
Write_to_File(LinkListL,char*str)//将链表写入到名为str的文件中
Read_from_File(LinkListL,char*str,CarKindk)//从名为str的文件中读取链表
主文件:
AddNewCar(LinkListL)//添加新车,在A中添加新节点
RentCar(LinkListA,LinkListR)//租车,从A中删除,添加到R
Repair(LinkListA,LinkListI)//修理,从A中删除,添加到I
Search(LinkListA,LinkListR,LinkListI)//在三个链表中查找
DisplayAll(LinkListA,LinkListR,LinkListI)//一次打印三个链表的信息
Financial(LinkListA,LinkListR,LinkListI)//财务状况函数
NewDay(LinkListA,LinkListR,LinkListI)//函数目的在于将期限减一,模拟过去一天。
如果时间为0,则将其从已借或修理中删除。
添加到可借链表中。
三、软件结构图及流程图
软件结构图:
流程图:
四、测试与分析
输入:
5
输出:
状态标识号行驶路程收益返回时间
01000
02000
0380000
0490000
1520202
1620202
1730203
1840204
29200351
210500802
211100203
212200354
1135
013000
2110
已借车辆:
1190014010
35
013000
1190014010
2380005
2490005
48
6
标志号收入
130
20
520
620
720
820
1140
935
1080
1120
1235
30
40
7
5
09200350
1520201
1620201
1730202
1840203
119001409
210500801
211100202
212200353
2380004
2490004
0
五、源程序
LinkList.h
#include<
iostream.h>
fstream.h>
stdio.h>
stdlib.h>
malloc.h>
#include<
iomanip.h>
typedefintStatus;
typedefenum{AFR,RD,IR}CarKind;
#defineOK1
#defineERROR0
#defineOVERFLOW1
#definenull0
typedefstruct
{
CarKindkind;
//汽车状态
intlicense_number;
//汽车标识号
intdistance_run;
//行驶路程
floatincome;
//此车的总收入费
inttime;
//租借时间,以天为单位
}ElemType;
typedefstructLNode
ElemTypedata;
//数据域
structLNode*link;
//指针域
}LNode,*LinkList;
StatusInitList(LinkList&
L)
{
L=(LinkList)malloc(sizeof(ElemType));
if(!
exit(OVERFLOW);
L->
link=null;
returnOK;
}
StatusListInsert(LinkListL,inti,ElemTypee)
LinkListp,s;
intj=0;
p=L;
while(p&
&
j<
i-1)
{
p=p->
link;
++j;
}
p||j>
i-1)//i大于表长或者小于1
{
cout<
<
"
节点位置错误"
endl;
returnERROR;
}
s=(LinkList)malloc(sizeof(LNode));
s->
data=e;
link=p->
p->
link=s;
//插入
}
StatusRun_Sort(LinkListL,ElemTypee)
LinkListp;
intj=1;
p=L->
while(p)
if(p->
data.distance_run>
e.distance_run)
returnj;
returnj;
StatusTime_Sort(LinkListL,ElemTypee)
data.time>
=e.time)
j++;
StatusListDelete(LinkListL,ElemType&
e)
LinkListp,q;
if(!
(p->
link))
q=p->
link=q->
e=q->
data;
free(q);
voidDisplay(LinkListL)
p=L->
setw(10)<
data.kind
data.license_number
data.distance_run
data.income
data.time<
p=p->
voidWrite_to_File(LinkListL,char*str)
ofstreamoutf(str);
while(p)
outf<
<
data.time;
p=p->
outf.close();
voidRead_from_File(LinkListL,char*str,CarKindk)
ElemTypep;
inti=1;
ifstreaminf(str);
while(inf)
inf>
>
setw(10)>
p.license_number
>
p.distance_run
p.income
p.time;
p.kind=k;
ListInsert(L,i,p);
i++;
inf.close();
CarRent.cpp
#include"
linklist.h"
charafr[]="
AFR.txt"
;
charrd[]="
RD.txt"
charir[]="
IR.txt"
voidAddNewCar(LinkListL)//添加新车
LinkLists;
CarKindk=AFR;
intI;
cout<
输入汽车编号:
cin>
I;
//应当设计判断是否冲突
data.kind=k;
data.distance_run=0;
data.income=0;
data.license_number=I;
data.time=0;
link=L->
link=s;
//因为链表中是按行驶路程排序,新车的行驶路程为0,所以加在第一个
voidRentCar(LinkListA,LinkListR)
intnumber=0,day=0;
floatthis_income;
p=A->
目前可租借车辆有:
p->
data.license_number<
号车"
行驶路程为:
data.distance_run<
选择需要租借的编号:
number;
for(;
p=p->
link)
link->
data.license_number==number)
{
s=p->
p->
link=p->
//从链表A中删除,将该节点复制给s
cout<
输入需要租借的天数:
cin>
day;
s->
data.kind=RD;
data.distance_run+=day*90;
//按每天90㎞算
if(day*90<
100)
this_income=20;
else
this_income=20+(day*90-100)*0.15;
data.income+=this_income;
data.time=day;
data.kind<
data.license_number<
setw(10)
<
data.distance_run<
<
//将其添加到已借连接表中
ListInsert(R,Time_Sort(R,s->
data),s->
data);
已借车辆为:
Display(R);
//Write_to_File(A,afr);
//Write_to_File(R,rd);
return;
}
number<
号车不存在或者目前不能租借!
voidRepair(LinkListA,LinkListI)//目前设计的是手动修理,可在NewDay()函数中设计自动完成修理
LinkLista,s,i;
a=A->
i=I;
while(a->
link&
(a->
500))//设计达到500㎞就送修
a=a->
//行驶路程是从小到大,所以一找到大于500㎞
s=a->
//的车辆,就把A链表断开,成为两部分
a->
link=null;
//一部分是小于500的(a),另一部分是大于500的(s)//又I链表中是以修理返回时间排序的,且修理时间都初始化为5天
while(i->
link)//因此s排在I链表的最后
i=i->
i->
while(s)
s->
data.time=5;
//每次修理5天
data.kind=IR;
s=s->
//Write_to_File(A,afr);
//Write_to_File(I,ir);
voidSearch(LinkListA,LinkListR,LinkListI)
intnumber;
输入车辆编号:
//三个链表中一次查找
状态"
标识号"
行驶路程"
收益"
返回时间"
return;
p=p->
p=R->
p=I->
if(p->
无此车信息"
voidDisplayAll(LinkListA,LinkListR,LinkListI)
Display(A);
Display(R);
Display(I);
voidFinancial(LinkListA,LinkListR,LinkListI)//财务状况函数
{//可添加固有成本,可变成本等数据丰富函数
floatsum=0;
收入"
sum+=p->
data.income;
d
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告