Linux 停车场(链表,链栈,顺序队列)----简易版

停车场项目需求

问题描述:停车场是一个能放 n 辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车要先退出,待它走后在依次进入。汽车离开时按停放时间收费。

基本功能要求:
(1)建立三个数据结构分别是:停放栈、让路栈、等候队列。
(2)输入数据模拟管理过程,数据(入或出,车号)

.
功能描述:进车登记、出车登记、按车牌号查询停车车辆信息、查询出入车记录、
查询场内车辆信息、查询等候车辆信息、退出系统。
(1)linux系统编写(链表、栈、队列);
(2)进车登记:登记车牌号以及入场时间;
(3)出车登记:计算出停车时间,记录车辆车牌;
(4)按车牌号查询车辆信息:停车时间,是否来过停车场,是否还在停车场
(5)查询出入记录:所有车辆,包括已经离开的
(6)查询场内车辆信息:列出所有场内车辆信息
(7)查询以及所有车牌号
(8)退出系统。



#ifndef _LINKLIST_H_
#define _LINKLIST_H_

#define maxsize 3


typedef int ElemType;

/**************************链表*******************************/
struct node
{
    int carnum;
    int timecome;
    int timeleft;
    struct node *next;
};
typedef struct node Node;
typedef Node *LinkList;

void ListInit(LinkList *L);
void ListInsert(LinkList *L,ElemType a,ElemType b);
void ListDelete(LinkList L,ElemType a,ElemType b);
void ListTraverse(LinkList L);

/***********************************************************************/



/****************************链栈**************************************/
struct stacknode
{
    int number;
    struct stacknode *next;
};
typedef struct stacknode StackNode;
typedef StackNode* LinkNode;

struct stack
{
    LinkNode top;
    int count;
};
typedef struct stack Stack;

void StackInit(Stack **s);
void StackPush(Stack *s,ElemType e);
int GetTop(Stack *s);
int StackPop(Stack *s);
int StackLength(Stack *s);

/***************************************************************/

/****************************顺序队列********************************/
struct queue
{
    ElemType data[maxsize];
    int front;
    int rear;
};
typedef struct queue SeQueue;


void QueueInit(SeQueue *sq);
void InQueue(SeQueue *sq,ElemType e);
int OutQueue(SeQueue *sq);
int QueueLength(SeQueue sq);


/**************************************************************/


#endif
/**********************链表功能函数*************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"LinkList.h"

void ListInit(LinkList *L)
{
    (*L)=(LinkList)malloc(sizeof(Node));
    if(NULL == (*L))
    {
        printf("ListInit fail\n");
    }
    (*L)->next=NULL;
}

void ListInsert(LinkList *L,ElemType a,ElemType b)
{
    LinkList p=(*L);
    LinkList n=(LinkList)malloc(sizeof(Node));
    if(NULL == n)
    {
        printf("ListInsert failure!\n");
    }
    n->carnum = a;
    n->timecome = b;

    n->next=p->next;
    p->next=n;

}


void ListTraverse(LinkList L)
{
    LinkList p = L->next;
    if(NULL == p)
    {
        printf("no  record\n");
    }
    else
    {
        printf("car number    cometime    lefttime\n");
        while(p)
        {
            printf("%5d    %10d    %10d\n",p->carnum,p->timecome,p->timeleft);  
            p = p->next;
        }
    }
}


void ListDelete(LinkList L,ElemType a,ElemType b)
{
    LinkList p=(L);

    while(p->carnum != a)
    {
        p = p->next;
        if(p->carnum == a)
        {
            p->timeleft = b;
        }
    }


}


/********************************链栈功能函数***************************/
#include<stdio.h>
#include<stdlib.h>
#include"LinkList.h"

void StackInit(Stack **s)
{
    (*s)=(Stack *)malloc(sizeof(Stack));
    if(NULL == (*s))
    {
        printf("StackInit Fail\n");
    }
    (*s)->top = NULL;
    (*s)->count = 0;

}

void  StackPush(Stack *s,ElemType e)
{
    StackNode *p = (StackNode *)malloc(sizeof(StackNode));
    if(NULL == p)
    {
        printf("StackPush fail\n");

    }
    p->number=e;
    p->next = s->top;
    s->top = p;
    s->count++;
}


int  StackLength(Stack *s)
{
    return s->count;
}

int GetTop(Stack *s)
{
    if(NULL == s->top)
    {
        printf("Stack Get Top Fail!\n");
    }
    int e;
    e = s->top->number;
    return e;
}

int  StackPop(Stack *s)
{
    if(NULL == s->top)
    {
        printf("Stack Pop fail!\n");
    }
    LinkNode p;
    int e;
    p = s->top;
    s->top = p->next;
    e = p->number;
    free(p);
    s->count--;
    return e;
}

/******************************顺序队列功能函数*******************************/
#include<stdio.h>
#include"LinkList.h"

void QueueInit(SeQueue *s)
{
    s->rear = s->front = 0;
}

void InQueue(SeQueue *s,ElemType e)
{
    if((s->rear +1)%maxsize == s->front)
    {
        printf("full\n");
    }
    else
    {
        s->data[s->rear] = e;
        s->rear = (s->rear + 1)%maxsize;
    }
}

int QueueLength(SeQueue s)
{
    return ((s.rear - s.front + maxsize)%maxsize);
}

int OutQueue(SeQueue *s)
{
    ElemType e;

    if(s->rear == s->front)
    {
        printf("OutQueue failure\n");

    }
    e = s->data[s->front];
    s->front = (s->front + 1)%maxsize;

    return e;
}



/********************************主函数***********************************/
#include<stdio.h>
#include<stdlib.h>
#include"LinkList.h"

int StackTraverse(Stack *s)
{
    LinkNode p;
    p = s->top;
    if(NULL == s->top)
    {
        printf("no car inside!\n");
    }
    else
    {   printf("car number\n");
        while(p != NULL)
        {
            printf("%5d\n",p->number);
            p = p->next;

        }
    }
}

void QueueTraverse(SeQueue s)
{
    ElemType e;
    int i=0;
    if(s.data[s.front]==s.data[s.rear])
    {
        printf("no  car  wait  here!\n");
    }
    else
    {
        printf("%d car are waiting for:\n",QueueLength(s));
        while(i<QueueLength(s))
        {
            e = s.data[s.front + i];
            printf("%d\n",e);

            i++;

        }
    }

}

int main()
{
    int t=0;
    int number,cometime,lefttime,stoptime,cost,ti;
    int num,i,j,find,mada;

    LinkList list;
    ListInit(&list);

    Stack *stop;
    StackInit(&stop);
    Stack *road;
    StackInit(&road);

    SeQueue wait;
    QueueInit(&wait);

    do
    {

        printf("----------------------------------\n");
        printf("|         1.in register          |\n");
        printf("----------------------------------\n");

        printf("----------------------------------\n");
        printf("|         2.out register         |\n");
        printf("----------------------------------\n");


        printf("----------------------------------\n");
        printf("|         3.find car             |\n");
        printf("----------------------------------\n");

        printf("----------------------------------\n");
        printf("|         4.access records       |\n");
        printf("----------------------------------\n");

        printf("----------------------------------\n");
        printf("|         5.list car(inside)     |\n");
        printf("----------------------------------\n");

        printf("----------------------------------\n");
        printf("|         6.list car(wait)       |\n");
        printf("----------------------------------\n");

        printf("----------------------------------\n");
        printf("|         7.exit                 |\n");
        printf("----------------------------------\n");


        printf("Please input your choice:\n");
        scanf("%d",&num);
        switch(num)
        {
            case 1:                           
                if(StackLength(stop)<3)
                {
                    printf("Please  input  carnumber:\n");
                    scanf("%d",&number);
                    printf("Please input cometime:\n");
                    scanf("%d",&cometime);

                    printf("car number    come time\n");
                    printf("%5d        %10d\n ",number,cometime);
                    ListInsert(&list,number,cometime);
                    StackPush(stop,number);
                }
                else
                {
                    printf("the parking lot is full!\n");
                    if(QueueLength(wait)<maxsize)
                    {
                        printf("would you like to wait?\n");
                        printf("  (1) YES     (2)NO\n");
                        scanf("%d",&i);
                        switch(i)
                        {
                            case 1:
                                printf("Please input carnumber:\n");
                                scanf("%d",&j);
                                InQueue(&wait,j);
                                break;
                            case 2:
                                printf("You  say : fuck you\n");
                                break;
                        }
                    }
                    else
                    {
                        printf("the waiting place is full!\n");
                    }
                }
                break;

            case 2:
                if(0 == StackLength(stop))
                {
                    printf("there is no car here!\n");
                }
                else
                {
                    printf("Please input car number:\n");
                    scanf("%d",&number);
                    while(number != GetTop(stop))
                    {
                        StackPush(road,StackPop(stop));
                    }
                    if(number == GetTop(stop))
                    {
                        printf("Please input leave time:\n");
                        scanf("%d",&lefttime);
                        printf("car number   stoptime      money\n");
                        LinkList t = list;
                        while(t->carnum != number)
                        {
                            t=t->next;
                        }
                        if(t->carnum == number)
                        {
                            ti=t->timecome;
                        }
                        stoptime=lefttime-ti;
                        cost = stoptime * 15;
                        printf("%d     %10d    %10d\n",number,stoptime,cost);
                        ListDelete(list,number,lefttime);
                        StackPop(stop);
                    }
                    while(StackLength(road)!=0)
                    {
                        StackPush(stop,StackPop(road));
                    }

                    if(StackLength(stop)<3)
                    {
                        if(QueueLength(wait)!=0)
                        {
                            mada=OutQueue(&wait);
                            StackPush(stop,mada);
                            ListInsert(&list,mada,lefttime);
                        }
                    }
                }

                break;

            case 3:
                printf("Please input car number!\n");
                scanf("%d",&find);
                LinkList p = list->next;
                LinkNode q = stop->top;
                if(NULL == p)
                {
                    printf("this is a new lot!\n");
                }
                else
                {
                    while(p!=NULL && p->carnum != find)
                    {
                        p = p->next;
                        if(NULL == p)
                        {
                            printf("this car never come here!\n");
                        }
                    }
                    if(p!=NULL && p->carnum == find)
                    {
                        printf("this car came here!\n");
                        if(p->timeleft)
                        {
                            printf("this car stop %d hour.\n",p->timeleft - p->timecome);
                        }

                        if(q!=NULL)
                        {
                            while(q!=NULL && q->number != find)
                            {
                                q = q->next;
                                if(q == NULL)
                                {

                                    printf("this car has left!\n");
                                }
                                if(q!=NULL && q->number == find)
                                {
                                    printf("this car is stil here!\n");
                                    if(p->timeleft)
                                    {
                                        printf("this car stop %d hour.\n",p->timeleft - p->timecome);
                                    }
                                }
                            }

                        }
                        else
                        {

                            printf("this car has left!\n");
                        }
                    }
                }

                break;

            case 4:
                ListTraverse(list);
                break;

            case 5:
                StackTraverse(stop);
                break;

            case 6:
                QueueTraverse(wait);
                break;

            case 7:
                t=1;
                break;

            default:
                printf("error!!!\n");
                return ;
        }

    }while(!t);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值