1. 实验目的
(1) 熟练掌握单链表创建、插入、删除和其它综合应用等操作的算法实现;
(2) 熟练掌握串的创建、模式匹配等操作的算法实现;
(3) 熟练掌握二叉树遍历与路径查找等应用的算法实现。
2. 实验内容
2.1 实验一 客房管理(链表实验)
实现功能:采用结构化程序设计思想,编程实现客房管理程序的各个功能函数,从而熟练掌握单链表的创建、输出、查找、修改、插入、删除、排序和复杂综合应用等操作的算法实现。以带表头结点的单链表为存储结构,实现如下客房管理的设计要求。
实验机时:8
设计要求:
#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;
(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)主函数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>
#include<fstream>
#pragma warning(disable : 4996)
//定义客房管理链表结构
typedef struct HNode
{
char roomN[20];//客房名称
float Price;//标准价格
float PriceL;//入住价格
int Beds;//床位数
char State[5];//入住状态(空闲、入住、预定)
struct HNode* next;//指针域
}Hotel, * HLink;
HLink H;
//链表创建
void Build(HLink& H)
{
HLink rear;
HLink p;
FILE* fp;
fp = fopen("Hoteldata.txt", "r");
if (!fp)
{
printf("文件打开失败!");
exit(0);
}
H = new HNode;
rear = H;
while (!feof(fp))
{
p = new HNode;
fscanf(fp,"%s%f%d", &p->roomN, &p->Price, &p->Beds);
p->PriceL = p->Price *float( 0.8);
strcpy(p->State, "空闲");
p->next = rear->next;
rear->next = p;
rear = p;
}
rear->next = NULL;
fclose(fp);
}
//输出函数
void Exp(HLink H)
{
HLink p;
p = H->next;
printf("客房名称\t标准价格\t入住价格\t床位数\t入住状态\n");
while (p)
{
printf("%s\t%.2f\t\t%.2f\t\t%d\t%s\n", p->roomN, p->Price, p->PriceL, p->Beds, p->State);
p = p->next;
//printf("s");
}
}
//查找函数
int Find(HLink& H, char *roomN)
{
HLink p;
int loc = 0;
p = H->next;
while (p)
{
loc++;
if (!strcmp(p->roomN, roomN))
return loc;
else
p = p->next;
}
return 0;
}
//入住状态修改
void updateH(HLink& H, int beds, char *state)
{
HLink p;
p = H->next;
while (p)
{
if (p->Beds == beds)
strcpy(p->State, state);
p = p->next;
}
}
//价格调整
void Add(HLink& H)
{
HLink p;
p = H->next;
while (p)
{
if (strcmp(p->State , "空闲")==0)
p->PriceL = p->PriceL * float(1.2);
p = p->next;
}
}
//价格比较函数
HLink FirstH(HLink& H)
{
HLink p, q,r = H;
float MaxP = 0;
p = H->next;
q = H->next;
while (p)
{
if (p->PriceL > MaxP)
MaxP = p->PriceL;
p = p->next;
}
while (q->PriceL != MaxP)
{
q = q->next;
r = r->next;
}
r->next = q->next;
return q;
}
//节点移动
void MoveK1(HLink& H, int k)
{
HLink p = H->next;
HLink q = H->next;
HLink r = H;
for (int i = 0; i < k; i++)
p = p->next;
while (p)
{
q = q->next;
r = r->next;
p = p->next;
}
r->next = q->next;
q->next = H->next;
H->next = q;
}
//倒置函数
//双跳法:p比q多走一步,则p到尾,q在中间位置
void ReverseN2(HLink& H)
{
HLink p = H, q = H, h;
while (q)
{
if (p->next == NULL)
break;
else if (p->next->next)
p = p->next->next;
else
{
p = p->next;
q = q->next;
break;
}
q = q->next;
}
p = q->next; q->next = NULL;
while (p)
{
h = p->next;
p->next = q->next;
q->next = p;
p = h;
}
}
//升序排序
void SortPrice(HLink& H)
{
HLink head, pre, cur, next, end, temp;
head = H;
end = NULL;
//从链表头开始将较大值往后沉
while (head->next != end)
{
for (pre = head, cur = pre->next, next = cur->next; next != end; pre = pre->next, cur = cur->next, next = next->next)
{
//相邻的节点比较
if