【数据结构】链表——客房管理
2016-11-04 18:21
281 查看
客房管理(链表)
满足如下要求
定义客房链表结点结构类型,以Hotel和*HLink命名,数据域:客房名称roomN、标准价格Price、入住价格PriceL(默认值=标准价格*80%)、床位数Beds、入住状态State(空闲、入住、预订,默认值为空闲),指针域:*next实现创建客房基本情况链表函数void Build(HLink &H),输入客房名称、标准价格、床位数,将入住价格、入住状态修改为默认值,建议用文件操作来输入数据
实现函数void updateH(HLink &H, int beds, char *state),将床位数为beds的客房入住状态改为state
实现输出客房基本情况函数void Exp(HLink H),输出所有客房的客房名称、标准价格、入住价格、床位数、入住状态
函数void Add(HLink &H),将该链表中未入住的客房入住价格均加价20%
函数void upBed(HLink &H,int beds),将该链表床位数不超过beds的结点都放在床位数超过beds的结点后面
求出入住价格最高的客房函数HLink FirstH(HLink &H),该函数内return语句返回入住价格最高的客房结点指针,返回前将该结点在链表中删除
函数void MoveK1(HLink &H, int k),将单链表中倒数第k个结点移到第一个结点位置,注意:严禁采用先计算链表长度n再减k(即n-k)的方法
函数void ReverseN2(HLink &H),将单链表的正中间位置结点之后的全部结点倒置的功能,注意:严禁采用先计算链表长度n再除以2(即n/2)的方法
主控函数main()调用以上函数,输出(3)(beds=2,state=”入住”)、(5)、(6)、(7)、(8)、(9)处理后的链表内容、输出入住价格最高的客房基本情况
预处理
#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;
源程序
#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; HLink H, L, rear, rem; int beds, k; char *state; float MaxPriceL; #define TRUE 1 #define FALSE 0 void Build(HLink &H); //创建链表 void updateH(HLink &H, int beds, char *state); //将入住状态改为state void Exp(HLink H); //输出链表 void Output(HLink H); void Add(HLink &H); //未入住的客房入住价格均加价20% void upBed(HLink &H,int beds); //床位数不超过beds的结点都放在床位数超过beds的结点后面 float MaxPriceLinH(HLink H); HLink FirstH(HLink &H); //返回入住价格最高的客房结点指针 HLink MaxPricelH(HLink H); void MoveK1(HLink &H, int k); //将单链表中倒数第k个结点移到第一个结点位置 void ReverseN2(HLink &H); //将单链表的正中间位置结点之后的全部结点倒置 int main(){ Build(H); //创建链表 Exp(H); printf("请输入要修改的床位数: "); scanf("%d", &beds); char Sstate[5]; printf("请输入新的入住状态: "); scanf("%s", Sstate); state = Sstate; updateH(H, beds, state); //将入住状态改为state Add(H); //未入住的客房入住价格均加价20% Exp(H); printf("请输入床位数,系统将根据您的输入整理客房信息: "); scanf("%d", &beds); upBed(H, beds); //床位数不超过beds的结点都放在床位数超过beds的结点后面 printf("更改入住状态、入住价格以及信息整理后:\n"); //将此时所有最大值的信息都删除 Exp(H); printf("\n现在删除最高入住价格:\n"); MaxPriceLinH(H); rear = L = (HLink)malloc(sizeof(Hotel)); do{ rem = FirstH(H); rear->next = rem; rear = rem; }while(MaxPricelH(H)&&MaxPriceL == MaxPricelH(H)->PriceL); printf("最高入住价格:\n"); Exp(L); Exp(H); MoveK1(H, k); //将单链表中倒数第k个结点移到第一个结点位置 Exp(H); ReverseN2(H); //将单链表的正中间位置结点之后的全部结点倒置 Exp(H); return 0; } void Build(HLink &H){ HLink rear; HLink p; char *indata = "studata.txt"; //数据输入文件路径及名称 FILE *fp; //文件指针 fp = fopen(indata, "r"); //打开文本文件 if (!fp) { printf("数据输入文件没找到!\n"); exit(1); } H = (HLink)malloc(sizeof(Hotel)); rear = H; //依次从文本文件中读取结点数据(学号、姓名和成绩) while(!feof(fp)){ //判断是否读取到文件结尾 p = (HLink)malloc(sizeof(Hotel)); //从文件中逐行读取客房名称p->roomN、标准价格p->price、入住价格p->PriceL、床位数p->Beds和入住状态p->State fscanf(fp,"%s%f%d",&p->roomN,&p->Price,&p->Beds); p->PriceL = p->Price * 0.8f; strcpy(p->State, "空闲"); rear->next = p; rear = p; } rear->next = NULL; fclose(fp); } void Exp(HLink H){ HLink p; printf("\n客房信息输出如下:\n"); printf("---------------------\n"); printf("客房名称\t标准价格\t入住价格\t床位数\t入住状态\n"); printf("---------------------\n"); for(p = H->next; p!=NULL; p = p->next) printf("%s\t\t%8.1f\t%8.1f\t%6d%8s\n",p->roomN,p->Price,p->PriceL,p->Beds,p->State); } void Output(HLink H){ HLink p; printf("\n客房信息输出如下:\n"); printf("---------------------\n"); printf("客房名称\t标准价格\t入住价格\t床位数\t入住状态\n"); printf("---------------------\n"); for(p = H; p!=NULL; p = p->next) printf("%s\t\t%8.1f\t%8.1f\t%6d%8s\n",p->roomN,p->Price,p->PriceL,p->Beds,p->State); } void updateH(HLink &H, int beds, char *state){ HLink p; for(p = H->next; p!=NULL; p = p->next) if(p->Beds == beds) strcpy(p->State,state); } void Add(HLink &H){ HLink p; for(p = H->next; p !=NULL; p = p->next){ if(!strcmp(p->State,"空闲")) p->PriceL = p->PriceL * 1.2f; } } void upBed(HLink &H,int beds){ HLink temp, cal, rear; //找到最后一个大于beds的结点 for(temp = H->next; temp != NULL; temp = temp->next) if(temp->Beds > beds) rear = temp; if(temp == NULL) return ; for(cal = H; cal->next; cal = cal->next); HLink p, p1, p2; for(p1 = H; p1->next != NULL&&p1!=rear;){ p2 = p = p1->next; if(p->Beds <= beds){ p1->next = p2->next; p->next = NULL; cal->next = p; cal = cal->next; } if(p1->next->Beds <= beds)continue; else p1 = p1->next; } } float MaxPriceLinH(HLink H){ MaxPriceL = 0; HLink p; for(p = H->next; p != NULL; p = p->next) MaxPriceL = MaxPriceL > p->PriceL ? MaxPriceL : p->PriceL; return MaxPriceL; } HLink FirstH(HLink &H){ HLink p, p1, p2; p1 = H; for(p = p1->next; p1->next != NULL;){ p = p2 = p1->next; if(p->PriceL == MaxPriceL){ p1->next = p2->next; p->next = NULL; return p; } else p1 = p1->next; } return NULL; } HLink MaxPricelH(HLink H){ HLink p; for(p = H->next; p != NULL; p = p->next){ if(p->PriceL == MaxPriceL){ return p; } } return NULL; } void MoveK1(HLink &H, int k){ restart: printf("\n将单链表中倒数第k个结点移到第一个结点位置: "); scanf("%d",&k); HLink p, p1, p2; for(p = H; k > 0; k--) p = p->next; if(k > 0||!p){ printf("输入k超过节点数\n"); goto restart; } for(p2 = H; p; p2 = p2->next){ p = p->next; p1 = p2; } p1->next = p2->next; p2->next = H->next; H->next = p2; } void ReverseN2(HLink &H){ printf("\n将单链表的正中间位置结点之后的全部结点倒置: \n"); HLink p, q, p1, temp; q = p1 = H; for(p = H; q&&q->next; p = p->next){ q = q->next->next; } temp = p; for(q = H; q->next; q = q->next); for(; temp->next != q;){ p = temp; for(p1 = p->next; q->next != p1; p = p->next){ p->next = p1->next; p1->next = p1->next->next; p->next->next = p1; } } }
相关文章推荐
- 数据结构(四)——单链表 、带头结点的单链表、循环链表 及其实现
- C++,数据结构,单向链表的实现及简单运用,运用模板
- 数据结构【线性表(二)链表】项目之循环双链表应用
- 单链表的就地逆转 -- 浙大《数据结构》第二版 例2.4
- 第4周SHH数据结构—【项目3-单链表应用(2)】
- 数据结构实践---单链表的初始化,建立,插入,查找,删除。
- 数据结构上机测试2-2:单链表操作B
- 数据结构-队列-链表实现
- 数据结构:双向链表list的表头/尾添加数据、链表显示、链表清空
- 数据结构-单向链表(C语言)
- 数据结构基本算法:图的存储(以邻接链表为例)
- C语言数据结构(链表)单向链表的创建删除逆序
- 数据结构之 线性表---单链表操作A (删除链表中的指定元素)
- C#版的数据结构(对链表的操作)
- 数据结构_线性表_链式存储_双向循环链表的基本操作
- 重学数据结构001——链表基本操作与一元多项式相加
- 数据结构练习(37)复杂链表的复制
- 【数据结构】单向循环链表实现
- 用邻接链表数据结构存储图 并实现Dijkstra算法
- 数据结构--单链表