-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path排队就餐作业.cpp
196 lines (165 loc) · 3.68 KB
/
排队就餐作业.cpp
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
#include <iostream>
#include <malloc.h>
using namespace std;
typedef int ElemType; //数据元素的类型为ElemType,将ElemType定义为int类型
typedef struct QNode /*结点类型*/
{ ElemType data;
struct QNode *next;
}LinkQueueNode, *LinkQList;
typedef struct /*链队列类型,记录队头指针和队尾指针*/
{
LinkQueueNode *last;
LinkQueueNode *first;/*队尾指针*/
}LinkQueue;
/*初始化一个空链队列q*/
int initQueue(LinkQueue *q)
{
q->first=q->last=new LinkQueueNode; /*申请头结点空间*/
if (q->last!=NULL)
{
q->last->next=q->last; /*头、尾指针均指向头结点*/
return 1;
}
else
return 0;
}
void VIP (LinkQueue &q,int c){
LinkQueueNode *s=new LinkQueueNode;
s->next=q.first->next;
s->data=c;
q.first->next=s;
}
/*---------------进队操作--------------------*/
/*要求:将值为x的数据元素插入到队q中,使之称为新的队尾元素
算法思路:尾插法*/
/*-------------请在以下空白区域完成进队操作的源代码--------------*/
int Enterqueue(LinkQueue *q, ElemType x,int &count)
{
LinkQueueNode *s;
s = new LinkQueueNode; /*申请新结点空间*/
if (s==NULL)
{
return 0;
}
else
{
s->data=x;
s->next=q->last->next;/*新结点成员赋值*/
q->last->next=s;
q->last=s; /*以尾插法方式插入结点*/
// count++;
return 1;
}
}
/*--------------------------出队操作---------------------------*/
/*算法思路:即删除第一个结点,注意队列中只有一个元素的情况*/
/*-------------请在以下空白区域完成出队操作的源代码-----------------*/
int deletequeue (LinkQueue* q, ElemType * x,int &count)
{
LinkQueueNode *p;
if (q->last->next==q->last) /*空队列*/
return 0;
p=q->last->next->next; /*找到要删除的元素*/
q->last->next->next=p->next; /*重新链接q的队头元素*/
if (p == q->last)
q->last->next=q->last; /*若要删除的为队尾元素,则修改尾指针last*/
// count--;
*x=p->data; /*带回被删除元素的值*/
delete p; /*删除该元素*/
return 1;
}
/*---------------请在以上空白区域完成出队操作的源代码------------------*
/*输出队列操作
要求:依次输出队首到队尾的元素值*/
void ListTra(LinkQueue* q,int count)
{
if (q->last->next==q->last)
{
cout<<"当前队列中没有元素!"<<endl;
return;
}
LinkQueueNode *p;
p=q->last->next->next; /*p指向第一个数据元素*/
cout<<"\n链队列的元素依次为:";
while(p!=q->last->next)
{
cout<<p->data<<',';
p=p->next;
}
cout<<"\n链队列的元素输出完毕!"<<endl;
}
int main()
{
char option;
ElemType e;
int i,count=0;
LinkQueue q; //q为LinkQueue类型的结构体变量,first成员为记录队首指针,last成员为队尾指针
cout<<endl;
cout<<"**********排队就餐队列**********"<<endl;
cout<<"**********主菜单**********"<<endl;
cout<<" 1.初始化链队列"<<endl;
cout<<" 2.来客人"<<endl;
cout<<" 3.走客人"<<endl;
cout<<" 4.查看排队"<<endl;
cout<<" 5.关门倒闭"<<endl;
cout<<"6.VIP"<<endl;
cout<<"********************"<<endl;
while (1)
{
cout<<"---------------------------------------- "<<endl;
cout<<" 选择你要的操作 (1 - 5): ";
//option = getche(); //获取用户输入的操作符号
cin>>option;
cout<<endl;
switch (option)
{
case '1':
i=initQueue(&q);
if(i==1)
{
cout <<"初始化成功!"<<endl;
}
else
{
cout<<"初始化失败!"<<endl;
}
break;
case '2':
cout <<"输入要进队的元素的值:"<<endl;
cin>>e;
i=Enterqueue(&q,e,count);
if(i==1)
{
cout <<"进队成功!"<<endl;
}
else
{
cout<<"进队失败!"<<endl;
}
break;
case '3':
i=deletequeue(&q,&e,count);
if (i == 0)
{
cout <<"队为空,出队失败。"<<endl;
}
else
{
cout <<"出队成功,"<<e<<"已出队!"<<endl;
}
break;
case '4':
ListTra(&q,count);
cout<<endl;
break;
case '5':
cout<<endl;
return 0;
case '6':
cout<<"输入vip号码";int c;
cin>>c;
VIP(q,c);
break;
}
}
}