1 #include<iostream>
2 #include<stdlib.h>
3 using namespace std;
4
5 typedef int ElemType;
6 typedef int Status;
7 #define OK 1
8 #define ERROR 0
9 #define MAXSIZE 10
10
11 //结点定义
12 typedef struct QNode
13 {
14 ElemType data; //数据域
15 struct QNode *next; //指针域
16 }QNode, *QueuePtr;
17
18 //链队定义
19 typedef struct
20 {
21 QueuePtr front; //队头指针
22 QueuePtr rear; //队尾指针
23 }LinkQueue;
24
25 //初始化链队
26 Status InitQueue(LinkQueue &Q)
27 {
28 Q.front = Q.rear = new QNode; //生成新结点作为头结点,队头和队尾指针指向此结点
29 Q.front->next = NULL; //头结点的指针域置为空
30 return OK;
31 }
32
33 //入队
34 //插入元素e为新的队尾元素
35 Status EnQueue(LinkQueue &Q, ElemType e)
36 {
37 QueuePtr p;
38
39 p = new QNode; //为入队元素分配结点空间,用指针p指向
40 p->data = e; //将新结点数据域置为e
41 p->next = NULL;
42 Q.rear->next = p; //将新结点插入到队尾
43 Q.rear = p; //修改队尾指针
44
45 return OK;
46 }
47
48 //出队
49 //删除队头元素,用e返回其值
50 Status DeQueue(LinkQueue &Q, ElemType &e)
51 {
52 if (Q.front == Q.rear) //队列为空,返回ERROR
53 return ERROR;
54
55 QueuePtr p;
56
57 p = Q.front->next; //p指向队头元素
58 e = p->data; //e保存队头元素的值
59 Q.front->next = p->next; //修改头结点的指针域
60
61 if (Q.rear == p)
62 Q.rear = Q.front; //最后一个元素被删,队尾指针指向头结点
63
64 delete p; //释放原队头元素的空间
65 return OK;
66 }
67
68 //取队头元素
69 ElemType GetHead(LinkQueue Q)
70 {
71 if (Q.front != Q.rear) //队列非空
72 return Q.front->next->data; //返回队头元素的值,队头指针不变
73 }
74
75 //创建队列
76 //输入元素入队,以-1结束
77 void CreatQueue(LinkQueue &Q, int &count) //count用于计算队列中的元素个数
78 {
79 int n;
80 InitQueue(Q);
81 count = 0;
82 cout << "请输入要入队的元素,以-1结束:" << endl;
83 while (cin >> n && n != -1)
84 {
85 count++;
86 EnQueue(Q, n);
87 }
88 }
89
90 //输出队列
91 void PrintQueue(LinkQueue Q)
92 {
93 if (Q.front == Q.rear) //空队列
94 return;
95 QueuePtr p = Q.front->next;
96 while (p != Q.rear) //依次输出队列中的元素
97 {
98 cout << p->data << " ";
99 p = p->next;
100 }
101 cout << p->data << endl; //最后输出队尾元素
102 }
103
104 int main()
105 {
106 int i, n, e;
107 int len;
108 LinkQueue Q;
109
110 InitQueue(Q); //初始化一个空队列
111
112 CreatQueue(Q, e); //创建一个队列
113
114 cout << "当前队列情况为:";
115
116 PrintQueue(Q); //输出队列的情况
117
118 cout << "当前的队头元素是:" << GetHead(Q) << endl;
119
120 cout << "请输入要出队的元素个数:";
121
122 cin >> n;
123
124 if (n > e) //如果出队的元素个数大于队内的总元素个数,则输出错误
125 {
126 cout << "错误!" << endl;
127 system("pause");
128 return 0;
129 }
130 else if (n == e) //如果出队的元素个数等于队内的总元素个数,则队列变空
131 {
132 cout << "队列为空!" << endl;
133 system("pause");
134 return 0;
135 }
136
137 for (i = 0; i < n; i++)
138 {
139 DeQueue(Q, e); //出队
140 }
141
142 cout << "当前队列情况为:";
143
144 PrintQueue(Q); //输出队列的情况
145
146 cout << "当前的队头元素是:" << GetHead(Q) << endl;
147
148 system("pause");
149
150 return 0;
151 }


