数据结构工程实训 --停车场管理系统

本文介绍了一个基于栈和链队实现的停车场管理系统,详细展示了系统如何处理车辆的进出、计费及便道等待等功能,通过具体代码解释了数据结构的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

文档和源码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define TRUE 1
#define PS "lzc"
#define MPS 3
#define MAX 2
float price;
float money;
typedef struct time//时间结构体 
{    
    int year;//年
    int mon;//月
    int day;//日
    int hour;//时
    int min;//分
    int sec;//秒
}Time;
typedef struct car//车辆信息 
{
    char user[20];//车主
    char num[20];//车牌号
    Time *reach;//到达时间
    Time *leave;//离开时间
}Car;
typedef struct park//停车场 (栈) 
{
    Car *stack[MAX];
    int top;
}Park;
typedef struct linkcar//便道上的车
{
    Car *CAR;
    struct linkcar *next;
}LinkCar;
typedef struct linkpark//便道
{
    LinkCar *head;
    LinkCar *rear;
}LinkPark;
void InitStack(Park *p)//初始化栈 
{
    p->top=-1;
}
int Empty(Park *p)//判断栈空 
{
    if(p->top<0)
    return (TRUE);
    else 
    return (NULL);
}

Park *Push(Park *p,Car *c)//进栈 
{
    if(p->top>=MAX)
    {
        printf("栈满!");
        return NULL;
    }
    else 
    {
        p->top++;
        p->stack[p->top]=c;
    }
    return p;
}
Car *Pop(Park *p)//出栈 
{    Car *q=NULL;
    if(Empty(p))
    {
        printf("栈空!\n");
        return q;
    }
    else 
    {    q=p->stack[p->top];
        p->top--;
        return (q);
    }
}

void InitLinkQueue(LinkPark *p)//链队的初始化
{
    p->head=(struct LinkPark *)malloc(sizeof(LinkPark));
    p->head->next=NULL;
    p->rear=p->head;
}

int LinkQueue_Empty(LinkPark *p)//判断链队是否为空
{
    if(p->head==p->rear)
    {
        return 1;
    }
    else 
        return 0;
}

void EnLinkQueue(LinkPark *p,Car *c)//进队(车辆进入便道)
{
    LinkCar *q;
    q=(struct LinkCar*)malloc(sizeof(LinkCar));
    q->next=NULL;
    q->CAR=c;
    p->rear->next=q;
    p->rear=q;
    printf("\t\t车辆已进入便道!进入时间为:%d年%d月%d日%d时%d分%d秒\n",q->CAR->reach->year+1900,q->CAR->reach->mon,q->CAR->reach->day,q->CAR->reach->hour,q->CAR->reach->min,q->CAR->reach->sec);
}

LinkCar *DeLinkQueue(LinkPark *p)//出队
{
    LinkCar *c;
    c=(struct LinkCar*)malloc(sizeof(LinkCar));
    if(LinkQueue_Empty(p))
    {
        printf("\t\t便道上没有车! \n");
        return 0;
    }    
    else
    {    
        c=p->head->next;
        p->head->next=c->next;
        //free(c);
        //printf("出队完成");
        return c;
    }
}

void CheckLink(LinkPark *p)
{    
    LinkPark *q;
    q=p->head;//q暂时保存p的头指针
    printf("\t\t\t\t****查看便道车辆****\n");
    printf("\n\t\t车主\t\t车牌号\t\t   进入便道时间\n");
    while(p->head->next!=NULL)
    {
    p->head=p->head->next;    
    printf("\t\t");        
    printf("%s",p->head->CAR->user);
    printf("\t\t");
    printf("%s",p->head->CAR->num);
    printf("\t\t");
    printf("%d/%d/%d %d:%d:%d",p->head->CAR->reach->year+1900,p->head->CAR->reach->mon,p->head->CAR->reach->day,p->head->CAR->reach->hour,p->head->CAR->reach->min,p->head->CAR->reach->sec);
    printf("\n");
    }
    p->head=q;//输出数据后把p的头指针指向原来的空间
}
Time *gettime ()
{
    Time *TIME;
    time_t t;
    struct tm * lt;
    TIME=(Time *)malloc(sizeof(Time));
    time (&t);//获取Unix时间戳。
    lt = localtime (&t);//转为时间结构。localtime把t分解为 tm 结构,并用本地时区表示
   // printf ( "%d/%d/%d %d:%d:%d\n",lt->tm_year+1900, lt->tm_mon+1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);//输出结果
    TIME->year=lt->tm_year;
    TIME->mon=lt->tm_mon;
    TIME->day=lt->tm_mday;
    TIME->hour=lt->tm_hour;
    TIME->min=lt->tm_min;
    TIME->sec=lt->tm_sec;
    return TIME;
}
void Arrival(Park *p,LinkPark *P)
{    
    char temp;
    Car *c;
    c=(Car *)malloc(sizeof(Car));
    printf("\t\t请登记车辆信息,车主以及车牌号\n");
    printf("\t\t车主:");
    temp=getchar();
    gets(c->user);
    printf("\t\t车牌号:");
    //temp=getchar();
    gets(c->num);
//    printf("输入完成");
    c->reach=gettime();
    if(p->top<(MAX-1))
    {
    Push(p,c);
    printf("\t车辆已进站,进站时间为%d年%d月%d日%d时%d分%d秒\n",c->reach->year+1900,c->reach->mon,c->reach->day,c->reach->hour,c->reach->min,c->reach->sec);
    }
    else
    {    printf("\t\t停车场已满,请进入便道等候!\n");

        EnLinkQueue(P,c);
    }

}
void Check(Park *p)
{    
    int i;
    i=p->top;
    printf("\t\t\t\t****查看停车场****\n");
    printf("\n\t\t车主\t\t车牌号\t\t   车辆到达时间\n");
    while(i>=0)
    {
        printf("\t\t");        
        printf("%s",p->stack[i]->user);
        printf("\t\t");
        printf("%s",p->stack[i]->num);
        printf("\t\t");
        printf("%d/%d/%d %d:%d:%d",p->stack[i]->reach->year+1900,p->stack[i]->reach->mon,p->stack[i]->reach->day,p->stack[i]->reach->hour,p->stack[i]->reach->min,p->stack[i]->reach->sec);
        printf("\n");
        i--;
    }
        
    
}
void Bill(Car *c)
{    
    float charge;
    float n;
    float i;
    float StandTime;
    StandTime=(float)(c->leave->day-c->reach->day)*24+(float)(c->leave->hour-c->reach->hour)+(float)((c->leave->min-c->reach->min))/60+(float)((c->leave->sec-c->reach->sec))/3600;
    money=StandTime*price;
    printf("\t\t车辆已离开,停车时长为%f小时\t\t\n",StandTime);
    printf("\t\t应收费用%f元:\n",money);
    printf("\t\t请结账:");
    scanf("%f",&charge);
    n=money-charge;
    while(n>0)
    {
        printf("\t\t还要付%f元,请结完账再走!\n",n);
        scanf("%f",&i);
        n=n-i;
    }
    printf("\t\t找零%f元",-n);

}
void Leave(Park *p,LinkPark *P)
{    
    //因为栈是后进先出,所以如果离开的车辆不是最后一辆,则需要把该辆车之后进入的车放入一个临时栈,待该车出栈后,再把临时栈中的车入栈到停车场(原来的栈)
    int i;
    Park q;
    Car *c;
    printf("\t\t请输入需要离开的车辆1--%d\n",p->top+1);
    scanf("%d",&i);
    InitStack(&q);
    while(p->top>i-1)
    {
    Push(&q,Pop(p));
    }
    p->stack[p->top]->leave=gettime();
    Bill(Pop(p));
    while(q.top>=0)
    {
    Push(p,Pop(&q));//将临时栈中的车放回停车场中(原栈)
    }
    c=DeLinkQueue(P)->CAR;
    c->reach=gettime();
    printf("\t\t便道中%s的车进入停车场,进入时间为%d年%d月%d日%d时%d分%d秒\n",c->user,c->reach->year+1900,c->reach->mon,c->reach->day,c->reach->hour,c->reach->min,c->reach->sec);
    Push(p,c);

}
void login()//密码验证
{    
        int n=1;
    char password[20];
    printf("\t\t请输入停车场管理系统登录密码:");
    while(n<=MPS)
    {    
    gets(password);
    if(strcmp(password,PS)==0)
    {    
        //system("cls");//清屏
        printf("\t\t登录成功!\n");
        printf("\t\t请输入停车场收费标准(元/小时):");
        scanf("%f",&price);
        break;
        }    
        else
        {    
            if(n==3)
            {
            printf("\t\t第%d次登录失败,账户已锁定!!\n",n);
            break;
            }
            printf("\t\t第%d次登录失败,请重新输入:",n);
            
        }
        n++;
    }

}
void menu()
{    int m=1;
    int i;
    Park p;
    LinkPark P;
    InitLinkQueue(&P);
    InitStack(&p);
    printf("\t\t请选择功能\n");
    printf("\t\t1.车辆进入登记\n");
    printf("\t\t2.车辆离开登记\n");
    printf("\t\t3.查看停车场\n");
    printf("\t\t4.查看便道\n");
    printf("\t\t0.退出系统\n");
    while(m)
    {
        scanf("%d",&i);
        switch(i)
    {
    case 1:
            Arrival(&p,&P);break;
    case 2:
            Leave(&p,&P);break;
    case 3:
             Check(&p);break;
    case 4:
            CheckLink(&P);break;

    case 0:
            m=0;printf("谢谢使用!\n");break;
    }
}
}
int main()
{    system("color 1f");//蓝底
    printf("\t\t欢迎使用停车场管理系统\n");
    login(); 
    menu();
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值