文档和源码下载地址:https://pan.baidu.com/s/1a0DDAQqQU8xZz-ToDp734Q

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
#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;
}