添加摘要
1 设计目的
《数据结构》课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。进行数据结构课程设计要达到以下目的:
1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
2 任务概述
设有一个可以停放n(n>=5)辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在他之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆在依原来的次序进场。每辆车在离开停车场时,都应依据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制模拟该停车场的管理的程序。
3 本设计采用的数据结构
//时间结点
typedef
struct{
int day;
int hour;
int min;
}TIME;
//车辆信息
typedef
struct{
char num[10]; //车牌号
TIME time;
//停车
时间
int n;
//停车场中所在位置
}information;
//栈的结构体定义
typedef
struct node
{
information data;
struct node *next;
}stacknode;
stacknode
*top1,*top2;//top1 为停车场 top2为暂存域
//队列结构体定义
typedef
struct{
information data;
s
tacknode *front,*rear;
}LQueue;
LQueue
*Q;
1.本程序主要应用了两个栈来模拟后进先出的停车场,用一个队列来模拟先进先出的停车便道。
2.由于车辆在停车场需要记录车牌号,停车时间,以
及车辆所在的位置,所以栈的结构体是由嵌套车辆
信息作为成员名和指针域组成,车辆信息又由车牌号,停车时间和车辆在车场中的位置组成。
3.队列结构体由车辆信息数据域和头尾指针组成
4 系统功能模块结构图及主要函数说明
系统功能模块说明:
车辆到达,
车辆离开
停车场信息与便道信息打印
系统主要函数及其说明:
辆进入停车场函数
stacknode
*into(stacknode *top1,LQueue *Q)
首先将要停入的车辆信息输入然后判断停车场是否已满,若不满则将该车辆停入,若满则将该车辆停入便道等待。使用指针p将要停的车辆信息存储起来,然后根据条件作为栈或队列的结点。
stacknode *leave(stacknode *top1,charstr[],LQueue *Q)
首先判断停车场是否为空,若不为空,则车辆离开,然后判断便道是否有车,如果有则便道车辆进入
停车场,否则结束。将q指向停车场栈top1来进行搜索车辆所在的位置,然后将该车辆前方车辆出停
车场top1栈进入临时存放栈top2,将该车辆出停车场top1栈后再将top2中的结点依次出栈进入top1,
最后根据便道有无车辆判断是否将便道车辆停入。
3.打印停车场信息/打印便道车辆信息函数
void showtop1(stacknode *top1)
int showLQ(LQueue *Q)
主要用while遍历栈或队列。
函数流程图如图1.3打印停车场信息/打印便道车辆信息函数流程图所示。
图1.3打印停车场信息/打印便道车辆信息函数流程图
5 程序运行数据及其结果
图1.5车辆离开运行结果图
3. 停车场信息打印运行结果如图1.6停车场信息打印运行结果图所示。
#include
#include
#include
#include
#define max 3
#define price 1
int b=1;
typedef struct{
int
day;
int
hour;
int
min;
}TIME;//时间结点
typedef struct{
char
num[10]; //车牌号
TIME
time; //停车时间
int
n; //停车场中所在位置
}information;
//栈的结构体定义
typedef struct node{
information
data;
struct
node *next;
}stacknode;
stacknode *top1,*top2;//top1 为停车场 top2为暂存域
//队列结构体定义
typedef struct{
information
data;
stacknode
*front,*rear;
}LQueue;
LQueue *Q;
//队列初始化
LQueue *InitQ()
{
LQueue
*Q;
stacknode
*p;
Q
= (LQueue *)malloc(sizeof(LQueue));
p
= (stacknode*)malloc(sizeof(stacknode));
p->next
= NULL;
Q->front
= Q->rear = p;
return
Q;
}
//栈的初始化
stacknode *Init()
{
stacknode
*top;
top
= (stacknode*)malloc(sizeof(stacknode));
top
= NULL;
return
top;
}
/*
调用时间函数用法
time_t t;
struct tm * lt;
time (&t);//获取Unix时间戳。
lt = localtime (&t);//转为时间结构。
时间结构体struct tm 说明:
struct tm {
int tm_sec; /* 秒 – 取值区间为[0,59] */
//int tm_min; /* 分 - 取值区间为[0,59] */
//int tm_hour; /* 时 - 取值区间为[0,23] */
//int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
//int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
//int tm_year; /* 年份,其值等于实际年份减去1900 */
//int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
//int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
//int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
//}; */
//车辆进入便道函数
LQueue *wait(LQueue *q,stacknode *s)
{
s->next
= NULL;
q->rear->next
= s;
q->rear
= s;
return
q;
}
//车辆进入停车场函数
stacknode *into(stacknode *top1,LQueue *Q)
{
stacknode
*p,*q;
time_t
t;//调用系统时间函数
struct
tm *timeinfo; //时间结点
time(&t);
timeinfo
= localtime(&t);
p
= (stacknode *)malloc(sizeof(stacknode));
if(p
== NULL)
{
printf("内存分配失败!\n");
return
top1;
}
printf("请输入车牌号:\n");
scanf("%s",p->data.num);
q
= top1;
p->data.time.day
= timeinfo->tm_mday;
p->data.time.hour
= timeinfo->tm_hour;
p->data.time.min
= timeinfo->tm_min;
p->data.n
= b;
if(b>max)
{
printf("停车场以满,请进入便道等候\n");
wait(Q,p);
return top1;
}
if(top1==NULL)
{
p->next
= NULL;
top1
= p;
}else{
p->next = top1;
top1
= p;
}
b++;
printf("车辆已进入停车场!\n");
printf("车牌为%s的汽车驶入时间为:%d日%d点%d分\n",top1->data.num,top1->data.time.day,top1->data.time.hour,top1->data.time.min);
return
top1;
}
//判断候车区是否为空
int EmptyLQ(LQueue *q)
{
if(q->front
== q->rear)
return
0;
else
return
1;
}
//候车区出队
stacknode *outQ(LQueue *q)
{
stacknode
*p;
p
= q->front->next;
if(q->front->next
== q->rear)//如果候车区只有一辆车
{
q->rear = q->front;
return
p;
}else{
q->front->next
= p->next;
}
p->next = NULL;
return p;
}
//候车区车辆进入停车场
stacknode *LQinto(stacknode *p,stacknode
*top1)
{
p->next
= top1;
top1
= p;
return
top1;
}
//车辆计费函数
int expense(stacknode *q,int x1,int x2,int
x3)
{
int
w;
if(x3!=0)
w =
(x1*24+x2+1-(top1->data.time.day*24+top1->data.time.hour+top1->data.time.min))*price;
else
w = (x1*24+x2-(top1->data.time.day*24+top1->data.time.hour+top1->data.time.min))*price;
return
w;
}
//车辆驶出停车场函数
stacknode *leave(stacknode *top1,char str[],LQueue
*Q)
{
int a,i,day,hour,min;
time_t
t;
struct
tm *timeinfo;
time(&t);
timeinfo
= localtime(&t);
day
= timeinfo->tm_mday;
hour
= timeinfo->tm_hour;
min
= timeinfo->tm_min;
stacknode
*p,*q;
if(top1
== NULL)
{
printf("停车场为空!\n");
return
top1;
}
q
= (stacknode*)malloc(sizeof(stacknode));
if(q
== NULL){
printf("内存分配失败");
return
top1;
}
q
= top1;
while(q!=NULL)
{
if(strcmp(str,q->data.num)==0)
break;
q=
q->next;
}
if(q==NULL)
{
printf("输入错误,无此车辆!\n");
return
top1;
}
for(i
= top1->data.n;i>top1->data.n;i--)//将该车辆之前的车停入临时地点
{
p =
(stacknode *)malloc(sizeof(stacknode));
if(p
== NULL)
{
printf("内存分配失败!\n");
return
top1;
}
strcpy(p->data.num,top1->data.num);
p->data.n
= top1->data.n-1;
p->data.time
= top1->data.time;
top1
= top1->next;
if(top2
== NULL)
{
p->next
= NULL;
top2
= p;
}else{
p->next
= top2;
top2
= p;
}
}
a
= expense(q,day,hour,min);
top1=top1->next;//指定车辆停出
while(top2!=NULL)
{
p =
(stacknode *)malloc(sizeof(stacknode));
if(p
== NULL)
{
printf("内存分配失败!\n");
return
top1;
}
strcpy(p->data.num,top2->data.num);
p->data.n
= top2->data.n;
p->data.time = top2->data.time;
p->next = top1;
top1 = p;
top2=top2->next;
}
if(EmptyLQ(Q))//车辆出停车场完成,判断便道是否有车
{
p = outQ(Q);//候车区车辆出队
p->data.n--;
top1 = LQinto(p,top1);//入栈
}else{
b--;
}
printf("车牌为%s的汽车驶出时间为:%d/%d:%d\n",q->data.num,day,hour,min);
printf("车辆驶出停车场需要缴纳的费用为:%d元\n",a);
return top1;
}
//打印停车场信息
void showtop1(stacknode *top1)
{
printf(" 停车场内全部车辆信息表\n");
if(top1==NULL)
printf(" 停车场内无车!\n");
else{
printf("车牌号 进入时间 位置\n");
while(top1!=NULL){
printf("
%s %d/%d:%d 第%d位\n",top1->data.num,top1->data.time.day,top1->data.time.hour,top1->data.time.min,top1->data.n);
top1=top1->next;
}
}
}
//打印便道车辆信息
int showLQ(LQueue *Q){
stacknode
*p;
p
= Q->front->next;
if(p==NULL)
{
printf("内便道无车辆\n");
}
while(p){
printf(" 候车便道内全部车辆信息表\n");
printf("车牌号:%s\n",p->data.num);
p=p->next;
}
printf("\n");
return
1;
}
int main()
{
char
str[10];
Q
= InitQ();
top1
= Init();
top2
= Init();
Q
= InitQ();
int
i;
printf("\t\t\t#####################################\n");
printf("\t\t\t 停车场管理系统\n");
printf("\t\t\t|| 1. 车辆进入停车场 ||\n");
printf("\t\t\t|| 2. 车辆离开停车场 ||\n");
printf("\t\t\t|| 3. 显示停车场内所有车辆信息 ||\n");
printf("\t\t\t|| 4. 显示候车区内所有车辆信息 ||\n");
printf("\t\t\t|| 5. 退出 ||\n");
printf("\t\t\t#####################################\n");
while(i!=5){
printf("\t请输入选项1-5:");
scanf("%d",&i);
switch(i){
case
1:
top1=into(top1,Q);
break;
case
2:
printf("请输入离开车辆的车牌号:");
scanf("%s",str);
top1=leave(top1,str,Q);
break;
case
3:showtop1(top1);break;
case
4:showLQ(Q);break;
case
5:exit(1);
default:printf("输入错误,请重新输入1-5:");
break;
}
}
}