数据结构项目二:停车场管理
来源:互联网 发布:c语言库函数大全 chm 编辑:程序博客网 时间:2024/04/30 17:04
项目目的:为了深入理解队和栈的使用原理,利用一个栈两个队列简单实现停车场的管理。
Parking.h 文件:
#ifndef __PARKING_H__#define __PARKING_H__#define TRUE 1#define FALSE 0#define SIZE 20#define TIME 86400/*停车场管理问题描述:停车场是一个能放n辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车要先退出,待它走后在依次进入。汽车离开时按停放时间收费。基本功能要求:(1) 建立三个数据结构分别是:停放队列、让路栈、等候队列。(2) 输入数据模拟管理过程,数据(入或出,车号)。停车场管理问题描述:停车场是一个能放n辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车要先退出,待它走后在依次进入。汽车离开时按停放时间收费。基本功能要求:(1) 建三个数据结构分别是:停放队列、让路栈、等候队列。(2) 输入数据模拟管理过程,数据(入或出,车号)。*/typedef struct _information{int id;char name[SIZE];char number[SIZE];int parktime;}ParkData;//停放队列typedef struct park_queue{ParkData data[SIZE];int front;//指向队头下标int rear;// 指向队尾下标}Park_Queue;// 置空队int InitPark_Queue (Park_Queue *q); // 停放队列进队 int EnPark_Queue (Park_Queue *q, ParkData x); // 停放队列出队 int DePark_Queue (Park_Queue *q, ParkData *x);// 判停放队列空否int Park_QueueEmpty (Park_Queue *q);// 判停放队列满否 int Park_QueueFull (Park_Queue *q);// 取停放队列队头int GetFront_Park (Park_Queue *q, ParkData *x);//让路栈typedef struct _node{ParkData data;struct _node *next;}Node;typedef struct way_stack{Node *top;}Way_Stack;// 创建让路栈Way_Stack *Create_Stack();// 判让路栈空否int StackEmpty (Way_Stack *s); // 进让路栈int Push (Way_Stack *s, ParkData x);// 出让路栈int Pop (Way_Stack *s, ParkData *x);// 获取让路栈顶元素int GetTop (Way_Stack *s, ParkData *x); // 销毁让路栈int Destroy(Way_Stack *s, Park_Queue *q);//等候队列typedef struct wait_node{ParkData data;struct wait_node *next;// 指向下一个结点}Wait_Node;typedef struct wait_queue{Wait_Node *front;Wait_Node *rear;}Wait_Queue;// 候车队Wait_Queue* Create_Queue();// 候车队是否为空int QueueEmpty (Wait_Queue *w); // 候车队进队int EnQueue (Wait_Queue *w, ParkData x); // 候车队出队int DeQueue (Wait_Queue *w, ParkData *x);// 停车场情况显示int Display (Park_Queue *q, Wait_Queue *w);// 停车休息!int Park (Park_Queue *q, Wait_Queue *w, ParkData *data);// 老司机开车了,劳资要出去浪啦!int Leave (Park_Queue *q, Wait_Queue *w);// 寻找停车队下标// tmp 需要出队的 id号, count是要找到元素的队列下标int FindData(Park_Queue *q, int tmp, int *count);#endif //__PARKING_H__
Parking.c 文件:
#include "Parking.h"#include <stdio.h>#include <stdlib.h>#include <time.h>Interface_Display (){system ("clear"); printf ("\t********************************************************\n");printf ("\t*------------------------------------------------------*\n");printf ("\t******* Welcome To Yangzi's Parking Lot! *********\n");printf ("\t* 1、停车 *\n");printf ("\t* 2、离开 *\n");printf ("\t* 3、查看停车场情况 *\n");printf ("\t* 4、退出 *\n");printf ("\t* *\n");printf ("\t* *\n");printf ("\t* 制作人: 陈阳 *\n");printf ("\t* *\n");printf ("\t*------------------------------------------------------*\n");printf ("\t********************************************************\n");}// 停放队列置空队int InitPark_Queue (Park_Queue *q){if (q == NULL)return FALSE;//置空队q->front = 0;q->rear = 0;return TRUE;}// 停放队列进队 int EnPark_Queue (Park_Queue *q, ParkData x){if (q == NULL)return FALSE;if (Park_QueueFull(q))return FALSE;q->rear = (q->rear+1) % SIZE;q->data[q->rear] = x;return TRUE;} // 停放队列出队 int DePark_Queue (Park_Queue *q, ParkData *x){if (q == NULL ){return FALSE;}if (Park_QueueEmpty(q)){return FALSE;}q->front = (q->front + 1) % SIZE;*x = q->data[q->front];return TRUE;}// 判停放队列空否int Park_QueueEmpty (Park_Queue *q){if (q == NULL)return FALSE;return q->front == q->rear;}// 判停放队列满否 int Park_QueueFull (Park_Queue *q){if (q == NULL)return FALSE;return q->front == (q->rear+1)%SIZE;} // 取停放队列队头int GetFront_Park (Park_Queue *q, ParkData *x){if (q == NULL || x == NULL){return FALSE;}if (Park_QueueEmpty (q)){return FALSE;}int index = (q->front+1)%SIZE;*x = q->data[index];return TRUE;}// 创建让路栈Way_Stack *Create_Stack(){Way_Stack* s = (Way_Stack*)malloc(sizeof(Way_Stack)/sizeof(char));if (s == NULL)return NULL;// 置空栈s->top = NULL;return s;}// 让路栈是否为空int StackEmpty (Way_Stack *s){if (s == NULL)return FALSE;return s->top == NULL;}// 进入让路栈int Push (Way_Stack *s, ParkData x){if (s == NULL)return FALSE;// 新建结点Node* node = (Node*)malloc(sizeof(Node)/sizeof(char));if (node == NULL)return FALSE;node->data = x;node->next = s->top;s->top = node;return TRUE;}// 出让路栈int Pop (Way_Stack *s, ParkData *x){if (s == NULL)return FALSE;if (StackEmpty(s))return FALSE;Node *p = s->top;*x = p->data;s->top = p->next;free(p);return TRUE;}// 获取让路栈顶元素int GetTop (Way_Stack *s, ParkData *x){if (s == NULL)return FALSE;if (StackEmpty(s))return FALSE;*x = s->top->data;return TRUE;}// 销毁让路栈并将数据返回停车队int Destroy(Way_Stack *s, Park_Queue *q){if (s == NULL || q == NULL)return FALSE;ParkData x;while(StackEmpty(s) != TRUE){Pop (s, &x);EnPark_Queue (q, x);}free(s);return TRUE;}// 创建候车队Wait_Queue* Create_Queue(){Wait_Queue *w = (Wait_Queue*)malloc(sizeof(Wait_Queue)/sizeof(char));if (w == NULL)return FALSE;w->front = NULL;w->rear = NULL;return w;}// 候车队是否为空int QueueEmpty (Wait_Queue *w) {if (w == NULL)return FALSE;return w->front == NULL;}// 候车队进队int EnQueue (Wait_Queue *w, ParkData x){if (w == NULL)return FALSE;Wait_Node *node = (Wait_Node*)malloc(sizeof(Wait_Node)/sizeof(char));if (node == NULL)return FALSE;node->data = x;node->next = NULL;if (w->front == NULL){w->front = node;w->rear = node;}else{w->rear->next = node;w->rear = node;}return TRUE;}// 候车队出队int DeQueue (Wait_Queue *w, ParkData *x){if (w == NULL)return FALSE;if (QueueEmpty (w))return FALSE;Wait_Node *p = w->front;*x = p->data;w->front = p->next;free(p);if (w->front == NULL)w->rear = NULL;return TRUE;}// 停车场情况显示int Display (Park_Queue *q, Wait_Queue *w){if (q == NULL || w == NULL)return FALSE;if (Park_QueueEmpty (q)){printf ("停车场为空!\n");return TRUE;}printf ("\t*************************停车列表*************************\n");ParkData x;int index = q->front;do{index++;x = q->data[index%SIZE];printf ("\t 停车号:%d, 姓名:%s, 车牌号:%s, 停车时间: %d秒 \n ", x.id, x.name, x.number, time(NULL)%TIME - x.parktime);}while (index != q->rear);printf ("\t*************************候车列表*************************\n");if (QueueEmpty (w)){printf ("候车队为空\n");return TRUE;}Wait_Node *tmp = w->front; //指向候车队队头x = tmp->data;printf ("\t 停车号:%d, 姓名:%s, 车牌号:%s, 候车时间: %d秒\n", x.id, x.name, x.number, time(NULL)%TIME - x.parktime);while (tmp != w->rear){tmp = tmp->next;x = tmp->data;printf ("\t 停车号:%d, 姓名:%s, 车牌号:%s, 候车时间: %d秒\n", x.id, x.name, x.number, time(NULL)%TIME - x.parktime);};return TRUE;}// 老司机开车了,劳资要出去浪啦!int Leave (Park_Queue *q, Wait_Queue *w){if (q == NULL || w == NULL)return FALSE;if (Park_QueueEmpty (q))return FALSE;ParkData x;int t;printf ("请输入离开车辆id :");scanf ("%d", &t);time_t Time = time(NULL);//获取当前时间GetFront_Park (q, &x);//取停车队队首//若离开车辆在队头,则直接出队if (t == x.id)//x 现在为队首数据{DePark_Queue (q, &x);printf ("离开成功!\n");printf ("\t现在时间:%s", ctime(&Time));if (QueueEmpty (w)){return TRUE;}else//候车队队头进停车队{DeQueue (w, &x);x.parktime = time(NULL);//此时x接收到了候车队抛出的队首数据,并将停车时间初始化EnPark_Queue (q, x); //该数据进入停车队}}//若离开的车辆不在队头,遍历整个停车队列,找到该车else{//创建让路栈Way_Stack *s = Create_Stack();if (s == NULL){printf ("让路栈创建失败!\n");Destroy(s, q);return FALSE;}int count = 0;if (FindData(q, t, &count) == FALSE){printf ("您输入的id号不在停车场\n");Destroy(s, q);return;}// 找到id,将该车前面的车放入让车栈,然后离开,再让让车栈的车返回停车队else{int i = 0;for (i = 0; i < count - 1; i++){DePark_Queue (q, &x);Push (s, x);}DePark_Queue (q, &x);//该车出停车队Destroy(s, q);//销毁让路栈并让让路栈的车回停车队printf ("离开成功!\n");printf ("\t现在时间:%s", ctime(&Time));if (QueueEmpty (w)){return TRUE; }else { DeQueue (w, &x);x.parktime = time(NULL);EnPark_Queue (q, x); }}}return TRUE;}// 寻找停车队下标int FindData(Park_Queue *q, int tmp, int *count){if (q == NULL || count == NULL)return FALSE;int flag = 0;ParkData x;int index = q->front;do {index++;(*count)++;index = index % SIZE;x = q->data[index];if (tmp-1 == x.id){flag = 1;break;}}while (index != q->rear);return flag;}
阅读全文
0 0
- 数据结构项目二:停车场管理
- 停车场管理 (数据结构)
- 【数据结构】 停车场管理优化
- 数据结构 课设一:停车场管理
- 【数据结构】关于停车场的管理
- 数据结构课程设计-停车场管理系统
- 停车场管理系统(二)
- 小小项目3:停车场管理
- 项目二——停车场
- 停车场的模拟管理(数据结构 C++)
- 数据结构课程设计——停车场管理系统
- 停车场管理
- 停车场项目
- 项目:停车场
- 停车场项目
- 数据结构(C语言版)严蔚敏 实习2 停车场管理 问题
- 数据结构课程设计~~立体停车场管理系统(改进版)
- 数据结构课程设计--立体停车场管理系统(改)
- Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例
- 使用CEfSharp之旅(3)下载文件 弹出保存框 IDownloadHandler
- BP算法经典例题 longest increasing subsequence
- numpy.linspace使用详解...
- String、StringBuffer与StringBuilder之间区别
- 数据结构项目二:停车场管理
- IntelliJ IDEA不能访问web资源目录解决方案
- Java 集合系列06之 Vector详细介绍(源码解析)和使用示例
- 对后台返回的json数据按月份分组并求和展示
- (2)Python笔记:内建模块HTMLParser实践
- 关于 MySQL LEFT JOIN 需要了解的三点
- Ext.form.Panel表单面板各组件介绍
- @RestController注解和@Controller注解的区别
- 安卓简单调用相机