目录
一、实验要求
实验目的:
(1) 熟练掌握单链表创建、插入、删除和其它综合应用等操作的算法实现;
(2) 熟练掌握串的创建、模式匹配等操作的算法实现;
(3) 熟练掌握二叉树遍历与路径查找等应用的算法实现。
实现功能(要求):采用结构化程序设计思想,编程实现客房管理程序的各个功能函数,从而熟练掌握单链表的创建、输出、查找、修改、插入、删除、排序和复杂综合应用等操作的算法实现。以带表头结点的单链表为存储结构,实现如下客房管理的设计要求。
设计要求:
(1)实现创建客房信息链表函数void Build(HLink &H),输入(客房名称、标准价格、床位数),同时修改入住价格、入住状态为默认值,即入住价格=标准价格*80%,入住状态为”空闲”(提示:用strcpy()字符串拷贝函数)。为了提高程序调试效率,要求:用文件操作来输入客房信息(客房名称、标准价格、床位数);
(2)实现输出客房信息函数void Exp(HLink H),输出所有客房的客房名称、标准价格、入住价格、床位数、入住状态;
(3)函数int Find(HLink &H, char *roomN),查找房间名称为roomN的客房。如果找到,则返回该客房在链表中的位置序号(>=1),否则返回0。提示:用strcmp()字符串比较函数;
(4)实现函数void updateH(HLink &H, int beds, char *state),将床位数为beds的客房入住状态改为state。提示:用strcpy()字符串拷贝函数;
(5)函数void Add(HLink &H),将该链表中未入住的客房入住价格均加价20%;
(6)求出入住价格最高的客房函数HLink FirstH(HLink &H),该函数内return语句返回入住价格最高的客房结点指针,返回前将该结点在链表中删除;
(7)函数void MoveK1(HLink &H, int k),将单链表中倒数第k个结点之后的所有结点移到头结点后面,注意:严禁采用先计算链表长度n再减k(即n-k)的方法;
(8)函数void ReverseN2(HLink &H),将单链表的正中间位置结点之后的全部结点倒置的功能,注意:严禁采用先计算链表长度n再除以2(即n/2)的方法;
(9)函数void SortPriceL(HLink &H),按照客房(入住价格,客房名称)升序排序;
(10)函数void upBed(HLink &H,int beds),创建一个【床位数为beds的新结点】(还需输入:客房名称、标准价格等信息),使链表的形态为:【头结点】->【床位数>beds的结点】->【床位数为beds的新结点】->【床位数<=beds的结点】,要求【超过beds的结点】和【不超过beds的结点】这两段链表中的结点保持原来的前后相对顺序;
(11)实现函数void Merge(HLink &H1, HLink &H2),将两个按入住价格非递减排序的客房记录单合并为一个按入住价格非递增排序的客房记录单;要求算法的时间复杂度不超过两个链表的长度之和O(m+n);
(12)主函数main()调用以上函数,(3)若返回值>=1则输出该客房在链表中的位置序号,否则输出该客房不存在;输出(4)~(10)处理后的链表内容,其中(6)还要输出入住价格最高的客房信息。
二、实验提示
可能用到的函数:
从文件中读取客房数据:fscanf(文件指针,"%s %f,%d",p->roomN,&p->Price,&p->Beds);
输出客房数据: printf("%s%8.1f%8.1f%6d%8s\n",p->roomN,p->Price,p->PriceL,p->Beds,p->State);
字符串赋值函数: char* strcpy(char *, const char *);
字符串比较函数: int strcmp(const char *, const char *)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定义客房链表结点结构
typedef struct HNode
{
char roomN[7]; //客房名称
float Price; //标准价格
float PriceL; //入住价格(默认值=标准价格*80%)
int Beds; //床位数Beds
char State[5]; //入住状态(值域:"空闲"、"入住"、"预订",默认值为"空闲")
struct HNode *next; //指针域
}Hotel, *HLink;
三、实验分析
说是分析,实际上就是谈一谈我的个人体会。实验要求已经给的很清楚了,该设置哪些函数,函数的类型、名称、参数以及功能都已经明确,所以我们要做的就是按照要求,一个一个子函数去编写。
虽说难度不大,但是费事是真的。。。逐个编写子函数,最后再去写MAIN函数,对子函数进行调用,不正体现了“模块化”的思想嘛~
四、代码示例(部分)
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<fstream>
#include<iostream>
#define ERROR 0
using namespace std;
typedef struct HNode
{
char roomN[7]; //客房名称
float Price; //标准价格
float PriceL; //入住价格
int Beds; //床位数
char State[5]; //入住状态
struct HNode *next; //指针域
}Hotel,*HLink;
1.创建客房信息链表函数
void Build(HLink &H)
{
H=new HNode;
H->next=NULL;
Hotel *r; r=H; //尾指针
FILE *fp;
fp=fopen("数据文件.txt","r+");
if(!fp)
{
printf("fail\n");
exit(ERROR);
}
while(!feof(fp))
{
Hotel *p; p=new HNode;
fscanf(fp,"%s %f %d",p->roomN,&p->Price,&p->Beds);
p->PriceL=p->Price*0.8;
strcpy(p->State,"空闲");
p->next=NULL;
r->next=p;
r=p;
}
fclose(fp);
}
2.输出所有客房的客房名称、标准价格、入住价格、床位数、入住状态
void Exp(HLink H)
{
Hotel *p;
p=H->next;
printf("名称: 标准价格入住价格床位数房间状态\n");
while(p!=NULL)
{
printf("%-8s : %-12f %-12f %-6d %-6s\n",
p->roomN,p->Price,p->PriceL,p->Beds,p->State);
p=p->next;
}
}
3.查找房间roomN 客房
int Find(HLink &H,char *roomN)
{
printf("输入room 名称: ");
scanf("%s",roomN);
Hotel *p;
p=H->next;
int i=1;
while(p!=NULL)
{
if(strcmp(p->roomN,roomN) == 0) return i;
i++;
p=p->next;
}
return 0;
}
4.将床位数为beds 的客房入住状态改为state
void update(HLink &H,int beds,char *state)
{
printf("输入床的个数: ");
scanf("%d",&beds);
printf("输入更改成的房间状态: ");
scanf("%s",state);
Hotel *p;
p=H->next;
while(p!=NULL)
{
if(p->Beds == beds) strcpy(p->State,state);
p=p->next;
}
}
5.将链表中未入住的客房入住价格加价20%
void Add(HLink &H)
{
Hotel *p;
p=H->next;
while(p!=NULL)
{
if(strcmp(p->State,"空闲") == 0) p->PriceL*=1.2;
p=p->next;
}
}
6.求出入住价格最高的客房函数
HLink FirstH(HLink &H)
{
HLink p,pre,max,maxpre,t;
pre=H; p=H->next;
maxpre=H; max=H->next;
while(p!=NULL)
{
if(p->PriceL > max->PriceL)
{
maxpre=pre;
max=p;
}
pre=pre->next;
p=p->next;
}
t=max;
maxpre->next=max->next;
return t;
}
由于篇幅有限,完整代码不便在此展示,数据文件和.cpp文件我已经上传在CSDN里,小伙伴们可根据需要进行下载,链接放在下面喽。
五、执行结果(部分)
下图是我上传的压缩文件里的资源,源代码中我已经尽量多写了注释,便于大家理解。
六、写在最后
熟悉我的人都知道,我比较佛系,博客也是随缘更新。想到哪里、学到哪里,受到刺激、闲来无事。。。都会促使我写写博客来“放松”。
不敢保证自己能写多少,只是希望不要半途而废。
今晚月色很美,你看到了吗?不管你看到没有,反正我看到了,睡了睡了。