数据结构实验-客房管理-串匹配-二叉树

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 
实验一 客房管理(链表应用实验) 定义客房链表结点结构HLink (1)实现创建客房信息链表函数void Build(HLink &H),输入(客房名称、标准价格、床位数),同时修改入住价格、入住状态为默认值,即入住价格=标准价格*80%,入住状态为”空闲”(提示:用strcpy()字符拷贝函数)。为了提高程序调试效率,强烈建议:用文件操作来输入客房信息(客房名称、标准价格、床位数); (2)实现输出客房信息函数void Exp(HLink H),输出所有客房客房名称、标准价格、入住价格、床位数、入住状态; (3)函数int Find(HLink &H, char *roomN)),查找房间名称为roomN的客房。 (4)实现函数void updateH(HLink &H, int beds, char *state),将床位数为beds的客房入住状态改为state。 (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的新结点】->【床位数=1则输出该客房在链表中的位置序号,否则输出该客房不存在;输出(4)~(10)处理后的链表内容,(6)还要输出入住价格最高的客房信息。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值