通讯录改bug

1.在h文件中定义顺序栈的数据结构体

typedef struct data
{
	char plate[10];//车牌号
	int t_year;
	int t_mon;
	int t_day;
	int t_hour;
	int t_min;
	int t_sec;//保存时间
	time_t start_sec;//保存入库时间,从1970年到现在的秒数
}Data;

将顺序栈的元素定义成数据和指针组合成的结构体

typedef struct stack
{
	Data data[SIZE];         // 栈存储空间
	int top; // 栈顶元素的下标
}Stack;

2、在h文件中定义链式队列的数据结构体

typedef struct node
{
	char num[10];         // 存放车牌号
	struct node *next; // 指向下一个元素的指针
}Node;

定义队头和队尾组成的结构体

typedef struct queue
{
	Node *front;//队头
	Node *rear;//队尾
}Queue;

2.在c文件中写出顺序栈的初始化函数Init1,判断空栈函数Empty1,判断满栈函数Full1,入栈函数Push1,出栈函数Pop1,获得栈顶元素函数GetTop1.
再写出链式栈的初始化队列函数Init2,判断空队列函数Empty2,入队列函数Push2,出队列函数Pop2,获取队列顶元素函数GetTop2.
3.在h文件中写出顺序栈和链式队列的函数声明
4.先初始化车库栈,让路栈,等候队列
5.打印出需要的功能选择,用fgets来获取命令,由于我上面用了system函数来清屏,下面调用getchar函数,防止清屏太快,看不到结果。
6.用switch对应用户操作的命令:停车,离开,查看停车场停车状况
停车:先判断车库有没有满,满了就调用等候队列的入队列函数

if(Full1(s)==TRUE)
	{
		char num[10];
		printf("请输入车牌号\n");
		scanf("%s",num);
		getchar();
		Push2(q,num);//车库满了,进等待队列
		printf("%s\n",GetTop2(q));
		
		/* while(q->front!=NULL)//之前为了测试错误,写的
		{
			printf("%s\n",q->front->num);//不能这么用,由于传的是指针
			q->front=q->front->next;//所以会把链表队头一直往后指,甚至会出现断错误
		} */
		int count=len(*q)-1;
		printf("车库已满,您的车在等候区等候,您的前面有%d人\n",count);
	}

如果没有满,就进入车库,调用入栈函数

Data data;
		printf("请输入车牌号\n");
		scanf("%s",data.plate);
		getchar();
		
		time_t t;
		struct tm * lt;
		// 获取Unix时间戳
		time (&t);
		data.start_sec=t;
		// 转为时间结构
		lt = localtime (&t);
		
		// 输出结果
		//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);
		data.t_year = lt->tm_year+1900;
		data.t_mon = lt->tm_mon + 1;
		data.t_day = lt->tm_mday;
		data.t_hour = lt->tm_hour;
		data.t_min = lt->tm_min;
		data.t_sec = lt->tm_sec;

		Push1(s , data);
		system("clear");
		printf("停车成功!\n");

离开:想要离开,必须将车子后面的车先移走,才能离开,所以在离开前,要将后面的移入让路栈


	while(num < (s1->top)+1)
	{
		data=GetTop1(s1);
		Push1(s2,data);
		Pop1(s1);
		//printf("3\n");
	}

然后让车出栈再将后面的车移回车库,此时,要判断等候区是否有车子,如果有车,需将等候区的第一辆车移入车库。

if(num == (s1->top)+1)
	{
		data = GetTop1(s1);
		time_t t;
		//struct tm * lt;
		// 获取Unix时间戳
		time (&t);
		time_t all_t = t - data.start_sec;
		//double cost = difftime(t, data.start_sec);
		printf("车位号:%d\t",s1->top+1);
		printf("车牌号: %s\t",s1->data[s1->top].plate);
		printf("停车时长:%ld s\t",all_t);
		printf ("入库时间:%d/%d/%d %d:%d:%d\n",s1->data[s1->top].t_year, s1->data[s1->top].t_mon,s1->data[s1->top].t_day, s1->data[s1->top].t_hour, s1->data[s1->top].t_min, s1->data[s1->top].t_sec);
		Pop1(s1);
		printf("您已成功出库,欢迎下次光临!\n");
		

		while(Empty1(s2) == FALSE)//把让路栈的车返回到车库
		{
			data = GetTop1(s2);
			Push1(s1,data);
			Pop1(s2);
		}
		
		if(Empty2(q) == FALSE)//等候区有车,就把第一辆车移到车库
		{//char num[10]=GetTop2(q);
		printf("%s\n",GetTop2(q));	
		strcpy(data.plate,GetTop2(q));//获取等候区第一辆车
		
		time_t t2;
		struct tm * lt;
		// 获取Unix时间戳
		time (&t2);
		data.start_sec = t2;
		// 转为时间结构
		lt = localtime (&t2);
	
		//strcpy(data.plate,num);
		data.t_year = lt->tm_year+1900;
		data.t_mon = lt->tm_mon + 1;
		data.t_day = lt->tm_mday;
		data.t_hour = lt->tm_hour;
		data.t_min = lt->tm_min;
		data.t_sec = lt->tm_sec;

		Push1(s1 , data);//将等候区第一辆车压栈进入车库
		printf("车牌号%s停车成功!\n",GetTop2(q));
		Pop2(q);//将第一辆车移出等候队列
	

查看停车场停车状况:将车库栈中保存的data结构体打印出来

void Display(Stack *s,Queue *q)
{
	
	time_t t;
	int i=s->top;
	while(i!=-1)
	{
		
		time (&t);
		time_t all_t = t - s->data[i].start_sec;
		
		printf("车位: %d\t",i+1);
		printf("车牌号:%s\t",s->data[i].plate);
		printf ("入库时间:%d/%d/%d %d:%d:%d\t",s->data[i].t_year, s->data[i].t_mon,s->data[i].t_day, s->data[i].t_hour, s->data[i].t_min, s->data[i].t_sec);
		printf("停车时长:%ld s\n",all_t);
		i--;
	}
	int count;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值