zoukankan      html  css  js  c++  java
  • 【数据结构】停车场问题

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

    【实验类别】设计型实验

    【实验目的】

    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;
    	Lane* L;
        s = (Stop_car*)malloc(sizeof(Stop_car));
        
        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 < MAX)
        {
            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 < SIZE_INIT_LANE)
                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->next = p->next;
            free(p);
            printf("
    出站成功,本次费用为%.3f", Price);
    		Stop_car_Num--;
            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 i;
            int f = find_Lane(L, carNum);
            if (f >= 0)
            {
                for (i = f; i < L->num; i++)
                {
                    L->Car_license[i] = L->Car_license[i + 1];
                }
                L->num--;
                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)
    {
    	int i;
        Lane* LL = L;
        for (i = 0; i < LL->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("---------------------停车站模拟---------------------
    ");
        printf("输入格式(到达/离去,汽车牌照号码,达到/离去的时刻)
    ");
        printf("请输入(A:代表进站 D:代表出站 P:代表结束(结束后显示状态))
    ");
        flag = 1;
        while (flag)
        {
            printf("输入格式(到达/离去,汽车牌照号码,达到/离去的时刻)
    ");
            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("该车已近入站
    ");
    
                        }
                        else
                        {
                            push_car(carNum,time,s,L);
                            printf("入站成功
    ");
                        }
    
    
            }; break;
            case 'D': {
                scanf("%c,%d",&carNum,&time);
                ch1 = getchar();
                pull_car(carNum, time, s, L);
                printf("出站成功
    ");
    
    
            }; break;
            case 'P': {
                printf("停车站还剩%d个位置,变车道还有%d个人排队中
    ",MAX-Stop_car_Num,L->num);
    			ch1=getchar();
            }; break;
            }
    
        }
    
    
    }
    
    

    朋友完整版
    更适合题目所需,思路一样。

    点击查看代码
    
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<malloc.h>
    #define n 3//可以停车的总数;
    #define m 3//便道的最大停车数
    int Stop_car_Num;
    typedef int Elemtype;
    
    typedef struct {
    	char zt;//进入或者出去
    	int cp;//车牌
    	int rushtime;//进入时间
    	int leavetime;//离开时间
    	struct Car *next;
    }Car,*car;
    
    typedef struct
    {
        int Car_license;        //汽车号码
        int Car_Inbound;        //入站时刻
        int Car_Outbound;       //出站时刻
        int  flag;              //是满车标志
        struct Stop_car* next;
    }Stop_car;
    
    
    typedef struct{
    	Elemtype * car_lincese;
    	int sum;
    	int length;//便道的长度
    }load;//便道
    
    
    void Initlist(load *x)//链表初始化
    {
    	x->car_lincese=(Elemtype *)malloc(m *sizeof(Elemtype));
    	if(x->car_lincese==NULL)
    		exit(0);
    	x->sum=0;
    	x->length=m;
    }
    
    int Init_Stop_car(Stop_car* s)//停车场初始化
    {
        if (s == NULL)
        {
            return 0;
        }
        s->Car_license = 0;       //汽车号码置空
        s->Car_Inbound = 0;
        s->Car_Outbound = 0;
        s->next = NULL;
        s->flag = 0;
        Stop_car_Num = 0;       //停车场初始车数量为零
        return 1;
    }
    
    void push(int carnum,int time,Stop_car *s,load *x)
    {
    	if(Stop_car_Num< n)
    	{
    		Stop_car* node = (Stop_car*)malloc(sizeof(Stop_car));
    		if(node==NULL)
    			exit(0);
    		node->Car_license=carnum;
    		node->Car_Inbound=time;
    		node->next=s->next;
    		s->next=node;
    		Stop_car_Num++;
    		printf("车牌为%d的车辆在%d时刻已经停入停车场",carnum,time);
    		printf("
    ");
    	}
    	else
    	{
    		if(x->sum<x->length)
    		{
    			printf("停车场已满,进入便道
    ");
    			x->sum++;
    			x->car_lincese[x->sum]=carnum;
    			printf("当前便道已经有%d辆车等待
    ",x->sum);
    		}
    		else
    		{
    			printf("当前停车场与便道车满,禁止停车
    ");
    		}
    		
    	}
    }
    
    
    Stop_car * find_insort(Stop_car * s,int 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_load(load *x,int carnum)
    {
    	int i;
    	load *xx=x;
    	for(i=0;i<=xx->sum;i++)
    	{
    		if(xx->car_lincese[i] == carnum)
    			return i;
    	}
    	return -1;
    }
    
    
    void leave_car(int carnum,int time,Stop_car *s,load *x)
    {
    	int price;
    	Stop_car * ss = find_insort(s,carnum);
    	if(ss!=NULL)
    	{
    		Stop_car *p=ss->next;
    		p->Car_Outbound = time;
    		price=(p->Car_Outbound-p->Car_Inbound) * 3;
    		ss->next=p->next;
    		free(p);
    		printf("出站成功,本次费用%d元,请及时缴纳
    ",price);
    		Stop_car_Num--;
    		if(x->sum>=1)
    		{
    			push(x->car_lincese[1],time,s,x);
    			x->car_lincese++;
    			x->sum--;
    		}
    		else
    		{
    			printf("便道中没有车进入停车场
    ");
    		}
    	}
    	else
    	{
    		int i;
    		int f;
    		f=find_load(x,carnum);
    		if(f>=1)
    		{
    			for(i=f;i<x->sum;i++)
    			{
    				x->car_lincese[i]=x->car_lincese[i+1];
    			}
    			x->sum--;
    			printf("该车位于便道中,离开不需要交付费用
    ");
    		}
    		else
    		{
    			printf("查无此车
    ");
    		}
    	}
    
    }
    
    int main()
    {
    	int i,num,time;
    	char y;
    	Stop_car *a;
    	load *b;
    	a = (Stop_car*)malloc(sizeof(Stop_car));
    	Init_Stop_car(a);
    	b = (load*)malloc(sizeof(load));
    	Initlist(b);
    
    	printf("*************************************
    ");
    	printf("           A.车辆到达                
    ");
    	printf("           D.车辆离开                
    ");
    	printf("           K.车辆情况                
    ");
    	printf("           E.退出                    
    ");
    	printf("当前停车场里有3辆空位,便道中有0辆车 
    ");
    	for(i=0;;i++)
    	{
    		scanf("%c",&y);
    		if(y=='A')
    		{
    			printf("请输入车牌号和进入时间
    ");
    			scanf("%d %d",&num,&time);
    			if(find_insort(a,num)!=NULL)
    			{
    				printf("该车已经进入停车场
    ");
    			}
    			else if(find_load(b,num)>=0)
    			{
    				printf("该车已经进入便道
    ");
    			}
    			else
    				push(num,time,a,b);
    		}
    		if(y=='D')
    		{
    			printf("请输入车牌号和离开时间
    ");
    			scanf("%d %d",&num,&time);
    			leave_car(num,time,a,b);
    		}
    		if(y=='K')
    		{
    			printf("停车站有%d辆车,便道中有%d辆车在排队
    ",Stop_car_Num,b->sum);
    		}
    		if(y=='E')
    		{
    			break;
    		}
    	}
    }
    
    
    ## 思路: 初次看题,便车道想用队列做,但是难于删除便车道的某一个车,故用了一个动态顺序表; 其他的看代码吧,对了,那个车站随意选位置 我没给位置赋值(赋值很容易实现,但是随意选位置不太好实现,姑且不给停车站赋值吧) 这个道题,算是对简单的顺序表和链表做了个综合练习; ## 下面贴一些出现的错误和解释

    image

    image

    image

    image

    image

  • 相关阅读:
    20155306 2016-2017-2 《Java程序设计》第1周学习总结
    20155213 2016-2017-2 《Java程序设计》第一周学习总结
    小议linux
    C语言学习的记忆
    我所期望的师生关系
    《暗时间》读书笔记(二)
    python——动态类型简介
    《Python学习手册》(二)
    python之模块导入和重载
    《暗时间》读书笔记(一)
  • 原文地址:https://www.cnblogs.com/zhujiaozhu/p/15431209.html
Copyright © 2011-2022 走看看