数据结构报告.docx
- 文档编号:7986733
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:30
- 大小:1.95MB
数据结构报告.docx
《数据结构报告.docx》由会员分享,可在线阅读,更多相关《数据结构报告.docx(30页珍藏版)》请在冰豆网上搜索。
数据结构报告
数据结构课程设计报告
目录
实验1……………………………………………………………1
1.需求分析………………………………………………………1
2.设计思想………………………………………………………1
3.设计表示………………………………………………………5
4.详细设计………………………………………………………5
5.调试分析………………………………………………………11
6.用户手册………………………………………………………11
7.测试数据及测试结果…………………………………………12
实验4……………………………………………………15
1.需求分析………………………………………………………15
2.设计思想………………………………………………………15
3.设计表示………………………………………………………19
4.详细设计………………………………………………………20
5.调试分析………………………………………………………23
6.用户手册………………………………………………………23
7.测试数据及测试结果…………………………………………24
8.心得体会………………………………………………………25
题号1题目:
航空订票系统
1.需求分析
试设计一个航空订票系统,基本要求如下:
每条航空所涉及的信息有:
航班号,航班机型,起飞机场,降落机场,日期(星期几),起飞时间,降落时间,飞行时长,价格,乘员定额,余票量,订票的客户名单(包括姓名,订票量,舱位等级(头等舱、公务舱、经济舱)以及等候替补的客户名单(包括姓名、所需数量)。
采用链式存储结构。
系统能实现的操作和功能如下:
(1)航班信息管理
(2)查询航线,按以下几种方式查询
按航班号查询
按起点站查询
按终点站查询
按日期查询
每种查询方式中,查询后输出如下信息:
航班号,航班机型,起飞机场,降落机场,日(星期几),起飞时间,降落时间,飞行时长,价格,余票量。
(3)承办订票业务:
根据客户提出的要求(航班号,订票数额)查询该航班票额情况,若有余票,则为客户办理订票手续,输出座位号;若已满员或余票少于订票额,则需重新询问客户要求,若需要,可登记排队候补。
(4)承办退票业务:
根据客户提出的情况(日期,航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其它排队候补的客户。
2.设计
2.1设计思想
(1)数据结构设计
航线可用链表记录,采用全局变量,减少参数的传递
定义航线类型:
ADTLairline{
数据对象:
D={ai|ai∈航线链表集,i=1,2,3……,n,n>=0}
数据关系:
R1={
客户资料
为了便于插入、删除和修改,其采用单链表存储结构,每个数据元素包括姓名、已订票数量、舱位等级三个数据项
基本操作:
Lairlinesearch_line()//按航班号查找航班
Lairlinesearch_start()//按起点站查找航班
Lairlinesearch_end()//按终点站查找航班
Lairlinesearch_day()//按日期查找航班
voidmore()//设计者信息
voidguide()//主菜单界面
voidinsert_line()//插入新航班
voidprint_customer(airline*p)//显示航班客户信息
voidbook()//订票系统
voidwaited(airline*p)//排队订票系统
voidrefund()//退票系统
voidsearch()//航班查询系统
voidInitLine()//初始化航线信息
voidprintline()//显示所有航班信息
}ADTLairline
主程序
voidmain()
{
初始化;
do{
接受命令;
处理命令(调用相应函数);
}while(“命令”!
=“退出”);
}
调用关系
(2)算法设计
航班信息
查找单链表的链尾,在链尾插入一个“航班信息”的新结点。
查询
提供四种查方式:
按航班号、起点站、终点站、日期查询,顺着单链表查找,如果与航班号(航线)一致,输出相关信息,否则,查询不成功。
订票
查找乘客要订的航班的终点站,判断此航班是否有空位,有则输入乘客有关信息,订票成功,否则失败。
退票
输入要退票的乘客姓名以及预订票数,查找乘客资料的链表中是否有这位乘客,有则删去此结点,并在空位加上1,同时为候补顾客订票,无则退票失败。
附:
航线客户的存储设计
typedefstructcustomer{//客户信息
charname[10];//客户姓名
intnum;//订票量
intlevel;//舱位等级
customer*next;
}customer,*Lcustomer;
typedefstructairline{//航线信息
charend_addr[20];//降落机场
charstart_addr[20];//起飞机场
charline_num[5];//航班号
charflytime[20];//起飞时间
charendtime[20];//降落时间
charday[20];//日期(星期)
inthour;//飞行时长
intt_price;//头等舱价格
intg_price;//公务舱价格
intj_price;//经济舱价格
inttotal;//总票数
intleft;//剩余票数
customer*booked;//已定客户信息
customer*wait;//排队等候订票信息
airline*next;
}airline,*Lairline;
链表的各种操作
Lairlinesearch_line()//按航班号查找航班
Lairlinesearch_start()//按起点站查找航班
Lairlinesearch_end()//按终点站查找航班
Lairlinesearch_day()//按日期查找航班
voidmore()//设计者信息
voidguide()//主菜单界面
voidinsert_line()//插入新航班
voidprint_customer(airline*p)//显示航班客户信息
voidbook()//订票系统
voidwaited(airline*p)//排队订票系统
voidrefund()//退票系统
voidsearch()//航班查询系统
voidInitLine()//初始化航线信息
voidprintline()//显示所有航班信息
2.2设计表示
(1)函数调用关系图
(2)函数接口规格说明
typedefstructcustomer//客户信息结构体
typedefstructairline//航线结构体
vvoidbook()//订票系统
voidprint_customer(airline*p)//显示航班客户信息
voidwaited(airline*p)//排队订票系统
voidrefund()//退票系统
voidsearch()//航班查询系统
2.3详细设计
(1)查询模块
提供四种查方式:
按航班号、起点站、终点站和日期查询。
都是通过strcmp函数比较输入项与航班信息是否相等,若相等则查询成功。
voidsearch()//航班查询系统
{
inti,x;
intflag=0;
airline*p;
PR("请输入查询航班的方式:
\n");
PR("航班号1\n");
PR("飞行日期2\n");
PR("起飞机场3\n");
PR("降落机场4\n");
SC("%d",&i);
for(;!
flag;)
switch(i){
case1:
p=search_line();flag=1;break;
case2:
p=search_day();flag=1;break;
case3:
p=search_start();flag=1;break;
case4:
p=search_end();flag=1;break;
default:
PR("操作错误,请重新输入\n");break;
}
if(p)
{
PR("是否订票(确定请按1)");
SC("%d",&i);
if(i==1)
book();
elsemenu();
}
else
{PR("对不起,没有该航班\n");
menu();}
}
例如:
Lairlinesearch_line()//按航班号查找航班
{
chara[5];
airline*p;
intx=0;
p=L->next;
PR("请输入航班号");
SC("%s",a);
PR("起飞机场降落机场航班号起飞时间降落时间飞行日期飞行时间头等舱价公务舱价经济舱价总票数余票量\n");
for(;p;p=p->next)
if(!
strcmp(a,p->line_num))
PR("%s%10s%12s%10s%10s%8s\t%8d\t%8d%8d\t%d%8d%8d\n",p->start_addr,p->end_addr,p->line_num,p->flytime,p->endtime,p->day,p->hour,
p->t_price,p->g_price,p->j_price,p->total,p->left);
x=1;
}
if(x)
p=L->next;
returnp;
}
(2)订票模块
根据客户提供信息,选择查询方法
voidbook()//订票系统
{
inti;
intflag=0;
airline*p;
customer*cst,*c;
PR("请输入查询航班的方式:
\n");
PR("按航班号查询:
1\n");
PR("按起点站查询:
2\n");
PR("按终点站查询:
3\n");
PR("按日期查询:
4\n");
for(;!
flag;)
{
SC("%d",&i);
switch(i)
{
case1:
p=search_line();flag=1;break;
case2:
p=search_start();flag=1;break;
case3:
p=search_end();flag=1;break;
case4:
p=search_day();flag=1;break;
default:
PR("操作错误,请重新输入\n");break;
}
}
if(p)
{
cst=(customer*)malloc(sizeof(customer));
PR("请输入订票数量:
");
SC("%d",&cst->num);
PR("请输入舱位等级(1/2/3)\n");
PR("1头等舱,2公务舱,3经济舱\n");
SC("%d",&cst->level);
PR("请输入您的名字");
SC("%s",cst->name);
if(cst->num<=p->left)
{
cst->next=p->booked;
p->booked=cst;
p->left=p->left-cst->num;
PR("订票成功,座位号为%d~%d\n",p->total-p->left-cst->num+1,p->total-p->left);
}
else
{
PR("余票不足,是否排队等候?
\n是
(1)\n否(0)\n");
SC("%d",&flag);
if(flag)
{
if(!
p->wait)
{
cst->next=p->wait;
p->wait=cst;
}
else
{
c=p->wait;
for(;c->next;c=c->next);
cst->next=c->next;
c->next=cst;
}
}
}
}
else
PR("没有该航班\n");
menu();
}
voidwaited(airline*p)//排队订票系统
{
intflag;
customer*q,*q0,*h;
if(!
p->wait)return;
q=(customer*)malloc(sizeof(customer));
q->level=0;
q->num=123;
strcpy(q->name,"00000");
q->next=p->wait;
h=q;
for(;p->left>0&&q->next;)
{
if(q->next->num
{
PR("%s,您正在排队定%d张票,现有票,是否定\n是
(1)\n否(0)\n",q->next->name,q->next->num);
SC("%d",&flag);
if(flag)
{
q0=q->next;
q->next=q->next->next;
q0->next=p->booked;
p->booked=q0;
p->left=p->left-q0->num;
PR("排队订票成功\n\n");
}
else
q=q->next;
}
else
q=q->next;
}
p->wait=h->next;
}
(3)退票模块
调用查询函数,根据客户提供的航线进行搜索根据客户提供的姓名到订票客户名单域进行查询,若有则可退票。
voidrefund()//退票系统
{
intflag;
chara[20];
airline*p;
customer*c,*c1;
p=search_line();
c=p->booked;
if(!
p->line_num)
{
PR("没有该航班\n");
menu();
return;
}
PR("请输入您的姓名");
SC("%s",a);
if(!
p->booked->name)
{
PR("对不起,没有找到您的信息\n\n");
menu();
return;
}
if(!
strcmp(a,p->booked->name))
{
PR("退票信息\n姓名/起飞机场/降落/票数\n%s/%s/%s/%d\n",p->booked->name,p->start_addr,p->end_addr,p->booked->num);
PR("确认要退票?
()\n是
(1)\n否(0)\n");
scanf("%d",&flag);
if(flag)
{
p->booked=p->booked->next;
p->left=p->left+c->num;
free(c);
PR("退票成功\n\n");
waited(p);
menu();
}
}
else
{
for(;c->next;c=c->next)
if(!
strcmp(a,c->next->name))
break;
if(!
c->next)
{
PR("对不起,没有找到您的信息\n\n");
menu();
return;
}
else
{
PR("退票信息\n姓名/起飞机场/降落机场/票数\n%s/%s/%s/%d\n",c->next->name,p->start_addr,p->end_addr,c->next->num);
PR("确认要退票?
()\n是
(1)\n否(0)\n");
scanf("%d",&flag);
if(flag)
{
c1=c->next;
c->next=c->next->next;
p->left=p->left+c1->num;
free(c1);
PR("退票成功\n\n");
waited(p);
menu();}
}
}
}
(4)显示所有航班信息
voidprintline()//显示所有航班信息
{
intflag;
airline*p;
p=L->next;
PR("起飞机场降落机场航班号起飞时间降落时间飞行日期飞行时间头等舱价公务舱价经济舱价总票数余票量\n");
for(;p;p=p->next)
{
PR("%s%10s%12s%10s%10s%8s\t%8d\t%8d%8d\t%d%8d%8d\n",p->start_addr,p->end_addr,p->line_num,p->flytime,p->endtime,p->day,p->hour,
p->t_price,p->g_price,p->j_price,p->total,p->left);
}
PR("按1进入订票系统,按0返回主菜单\n");
SC("%d",&flag);
if(flag)
book();
elsemenu();
}
3.调试分析
(1)在编程过程中,起先使用的是局部变量,每次调用函数都需要进行参数的传递,很麻烦,而且还容易出现错误;后意识到航线的链表只有一条,很多函数都需要对其数据进行修改,故航线信息采用了全局变量,方便数据的修改,减少了参数的传递。
(2)因为排队订票的客户信息列表没有设置头结点,在退票后询问排队订票客户是否订票时,出现了操作错误,在没有头结点的情况下判断等操作很麻烦,故在函数里询问排队客户是否订票时,为排队订票的客户信息列表增加了头结点,方便操作。
(3)在开始的时候,排队订票客户信息使用的是队列进行数据存储,但测试的时候,发现当第一名排队订票客户不满足需求时询,往后依次询问客户时,队列完全没用,而且还需进行尾节点的各项操作,故弃用队列存储结构。
(4)刚开始订票或退票的时候不能将剩余的票数加上和减去。
后来经过详细的检查与对照课本知识点找出了相应的错误点,经过修改加入票数加减语句,再经过与保存函数的配合后实现了题目要求的功能。
(5)由于本程序涉及的知识单链表的查找,插入和删除,故时间复杂度为O(n),辅助空间为O
(1)。
4.用户手册
(1)本程序用VC6.0编码,在windows系统实现
(2)进入系统后显示如下界面,按照提示选择操作
(2)输入后按回车键确认
5.测试数据及测试结果
1.查找航班
1)按航班号查询
2)按起点站查询
3)按终点站查询
4)按日期查询
2.订票系统
3.退票系统
题号4题目:
文本编辑器
1.需求分析
利用计算机进行文字加工,实现对文本文件的输入、显示、查找、替换、插入、删除、撤销等功能。
2.设计
2.1设计思想
(1)数据结构设计
本程序是对输入的文字进行操作,故使用的数据结构为单链表操作。
根据第一部分的问题分析有该链表操作有3部分:
Pre
Temp
Next
另有全局变量*head,作为文章的头指针。
故创建了以下结构体:
typedefstruct_list
{chardata[80];//记录一行字符
intlength;//记录一行字符长度
struct_list*next;//后继指针
struct_list*pre;//前趋指针
introw;//记录整篇文章的行数
}LinkList;
在文章内容创建部分中使用线性表的链式存储,并使用全局变量对文本的各种信息进行存储;
文章的内容统计、删除、查找、插入都采用链表操作完成。
本程序为将菜单功能完美化,使用了大量的dowhile语句。
(2)算法设计
程序框架:
图1文本编辑器主框架
两个子菜单:
如选择上图中功能3,则有:
图2简单的文本编辑器----文本内容统计菜单
如选择功能4,则有:
图3简单的文本编辑器-----文本内容处理菜单
根据以上各图,本程序共设计了11个函数。
1、HeadWord()标题函数,即一个输出标题,永远出现在程序的最顶端。
2、CreatWord()文本输入函数,实现上图1菜单功能1,对文本的内容进行输入;
3、PrintWord()当前文本内容输出函数,实现上图1菜单功能2以及图3中功能4,将当
前存储在链表中的文本内容输出;
4、CountWord()文章内容统计函数,实现上图1菜单功能3,对存储在链表中文本内容进
行统计,包括对文本内容中的大写字母、小写字母、数字、标点符号、空格以及文章所有字
数的个数的统计;图2是对其完整描述;
5、SearchWord()文章内容查找函数,实现上图3菜单功能1中查找部分;
6、DeleteWord()文章内容删除函数,实现上图3菜单功能2中删除部分;
7、InsertWord()文章内容插入函数,实现上图3菜单功能3中插入部分;
8、Bmenu()第二子菜单函数,实现上图1菜单功能4,图3是此函数实现的结果,它将5,
6,7各子函数集合在此函数中;
9、AboutWord()显示作者信息的函数,实现上图1菜单功能5。
10、menu()主菜单函数,其结果为图1所显示部分,将1、2、3、4、8、9等函数集合。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 报告