热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【数据结构】停车场问题

实验二线性表的应用(二)【实验类别】设计型实验【实验目的】1.熟悉线性表的顺序存储和链式存储各自的特点及运算;2.熟练掌握线性表的基本操作在不同存储结构中实现算法;3.通过本次实验




实验二 线性表的应用(二)

【实验类别】设计型实验


【实验目的】

1.熟悉线性表的顺序存储和链式存储各自的特点及运算;
2.熟练掌握线性表的基本操作在不同存储结构中实现算法;
3.通过本次实验帮助学生加深对C语言的使用(特别是函数的参数调用、指针类型的应用和链表的建立等各种基本操作)
4.对一个实际的问题能够进行合理的需求分析,选择合适的存储结构,设计完成符合实际需要的功能。


【实验学时】4学时


【实验组人数】1人。


【实验设备环境】计算机,VC++6.0,C-Free等


【实验内容】

1、停车场的管理(4学时)
【问题描述】设有一个可以停放n辆汽车的停车场,它有二个大门可以供车辆进出,其中一个进,一个出。车辆到达停车场后任意选择空闲停车位停放,每个停车位按顺序编号。如果停车场已放满n辆车,则后来的车辆只能停在停车场大门外的便道上等待,一旦停车场里有车开走,则排在便道上的第一辆车就进入停车场。每辆车离开停车场时,都应根据其在停车场的逗留时间交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆顺序。编制一程序模拟停车场的管理。
image


[基本要求] 1、要求程序输出每辆车到达后的停车位置(停车场或便道上);
2、某辆车离开停车场时应交纳的费用和停留时间;
3、可以随时查看停车场及便道的状态。
4、可以随时查看空闲停车位。4、可以随时查看空闲停车位。
【实现提示】
1.本题可以用静态链表作为存储结构
2.汽车模拟输入格式为:(到达\ 离去, 汽车牌照号码,到达\离去的时刻), 例如: (‘A’,1,5) 表示1号车在5时刻到达;(‘D’, 5,20) 表示5号车在20时刻离开;结束标志为: (‘E’,0,0)。
说明:以上题目除了要求的基本功能以外,可以根据实际调研的需求自由发挥,增加可行功能,使系统的功能应用更加完善。


#include "stdio.h"
#include "malloc.h"
#define MAX 3 //停车站所能容纳的最大车数量
#define SIZE_INIT_LANE 100
#define INCREASE 10 //没次增量
#define PRICE 10; //单价
typedef int Elemtype;//汽车号变量类型
typedef struct
{
Elemtype Car_license; //汽车号码
int Car_Inbound; //入站时刻
int Car_Outbound; //出站时刻
int flag; //是否有车标志
struct Stop_car* next;
}Stop_car;//停车场用静态链表
typedef struct
{
Elemtype* Car_license;
int num;
int size;
}Lane;//便车道动态数组
//全局变量
int Stop_car_Num;//停车站车数量
//函数声明
int Init_Stop_car(Stop_car* s);
int Init_Lane(Lane* L);
int push_car(Elemtype carNum, int time, Stop_car* s, Lane* L);
int pull_car(Elemtype carNum, int time, Stop_car* s, Lane* L);
Stop_car* find_INSTOP(Stop_car* s, Elemtype carNum);
int find_Lane(Lane* L, Elemtype carNum);
void meau(Stop_car* s, Lane* L);
int main()
{
Stop_car* s;
s = (Stop_car*)malloc(sizeof(Stop_car));
Lane* L;
L = (Lane*)malloc(sizeof(Lane));
Init_Stop_car(s);
Init_Lane(L);
meau(s, L);
return 0;
}
/*---停车场初始化---*/
int Init_Stop_car(Stop_car* s)
{
if (s == NULL)
{
return 0;
}
// s->Car_license = ""; //汽车号码置空
// s->Car_Inbound = 0;
// s->Car_Outbound = 0;
s->next = NULL; //头插法式初始化
// s->flag = 0;
Stop_car_Num = 0; //停车场初始车数量为零
return 1;
}
/*---便车道初始化---*/
int Init_Lane(Lane* L)
{
L->Car_license = (Elemtype*)malloc(SIZE_INIT_LANE * sizeof(Elemtype));
if (L->Car_license == NULL)
return 0;
L->num = 0;
L->size = SIZE_INIT_LANE;
return 1;
}
/*---车入站(停车站/便车站)---*/
int push_car(Elemtype carNum, int time, Stop_car* s, Lane* L)
{
//当停车场还能容纳车
if (Stop_car_Num {
Stop_car* node = (Stop_car*)malloc(sizeof(Stop_car));
if (node == NULL)
{
return 0;
}
node->Car_license = carNum;
node->Car_Inbound = time; //到达时刻
node->flag = 1;
node->next = s->next;
s->next = node;
Stop_car_Num++;
return 1;
}
else
{
if (L->num L->Car_license[L->num++] = carNum;
else
{
L->Car_license[L->num++] = carNum;
L->Car_license = (char*)realloc(L->Car_license, (L->size + INCREASE) * sizeof(char));
if (L->Car_license == NULL)
exit(0);
L->size += INCREASE;
}
return 1;
}
}
/*---车出站(停车站/便车道)---*/
int pull_car(Elemtype carNum, int time, Stop_car* s, Lane* L)
{
float Price; //这里(计算费用)可以另写一个函数 ,有点让出站函数功能不单一了
Stop_car* ss = find_INSTOP(s, carNum);
if (ss != NULL)
{
Stop_car* p = ss->next;
p->Car_Outbound = time;
Price = (p->Car_Outbound - p->Car_Inbound) * PRICE;
ss = p->next;
free(p);
printf("\n出站成功,本次费用为%.3f", Price);
if(L->num>=1)
{
push_car(L->Car_license[0],time,s,L);
L->Car_license++;
L->num--;
}
else
{
return 1;
}
}
else if (ss == NULL)
{
int f = find_Lane(L, carNum);
if (f >= 0)
{
for (int i = f; i num; i++)
{
L->Car_license[i] = L->Car_license[i + 1];
}
L->size--;
return 1;
}
else
{
printf("暂无此车");
return 0;
}
}
else
{
printf("暂无此车");
return 0;
}
}
/*---判断某辆车是否在停车场---*/
Stop_car* find_INSTOP(Stop_car* s, Elemtype carNum)
{
Stop_car* ss = s;
Stop_car* p = ss->next;
while (p != NULL)
{
if (p->Car_license == carNum)
return ss;
ss = p;
p = p->next;
}
return NULL;
}
/*---判断车是否在便车道---*/
int find_Lane(Lane* L, Elemtype carNum)
{
Lane* LL = L;
for (int i = 0; i num; i++)
{
if (LL->Car_license[i] == carNum)
return i;
}
return -1;
}
/*---车站管理菜单---*/
void meau(Stop_car* s, Lane* L)
{
int flag;
char ch,ch1;
Elemtype carNum;
int time;
printf("---------------------停车站模拟---------------------\n");
printf("输入格式(到达/离去,汽车牌照号码,达到/离去的时刻)\n");
printf("请输入(A:代表进站 D:代表出站 P:代表结束(结束后显示状态))\n");
flag = 1;
while (flag)
{
printf("输入格式(到达/离去,汽车牌照号码,达到/离去的时刻)\n");
scanf("%c", &ch);
ch1 = getchar();
switch (ch)
{
case 'A': {
scanf("%c,%d",&carNum,&time);
ch1 = getchar();
if(find_INSTOP(s,carNum)||find_Lane(L,carNum)>=0)
{
printf("该车已近入站\n");
}
else
{
push_car(carNum,time,s,L);
printf("入站成功\n");
}
}; break;
case 'D': {
scanf("%c,%d",&carNum,&time);
ch1 = getchar();
pull_car(carNum, time, s, L);
printf("出站成功\n");
}; break;
case 'P': {
printf("停车站还剩%d个位置,变车道还有%d个人排队中\n",MAX-Stop_car_Num,L->num);
ch1 = getchar();
}; break;
}
}
}

思路:

初次看题,便车道想用队列做,但是难于删除便车道的某一个车,故用了一个动态顺序表;
其他的看代码吧,对了,那个车站随意选位置 我没给位置赋值(赋值很容易实现,但是随意选位置不太好实现,姑且不给停车站赋值吧)
这个道题,算是对简单的顺序表和链表做了个综合练习;


下面贴一些出现的错误和解释

image
image
image
image
image


以上是qq群一位好心人士提供,仅是个人见解,如有错误,请谅解。不行就评论出来,我研究研究




推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
author-avatar
xinweiss
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有