一 写在开头
1.1 本文内容
数据结构队列的实现。
二 版本一
不说废话,直接看代码。实现基于单链表。
1 /* queue.h */
2
3 #ifndef _H_QUEUE_H
4 #define _H_QUEUE_H
5
6 #include <stdbool.h>
7
8 typedef char dtype; // 数据类型
9
10 typedef struct Node // 节点类型
11 {
12 dtype data;
13 struct Node * next;
14 } tNode;
15
16 typedef struct Queue // 队列类型
17 {
18 tNode * front;
19 tNode * rear;
20 unsigned long long size;
21 } tQueue;
22
23 /* 队列初始化 */
24 tQueue *
25 QueueInit(void);
26
27 /* 判断队列是否为空。为空返回true;否则返回false */
28 bool
29 IsEmpty(tQueue *);
30
31 /* 入队列 */
32 void
33 EnQueue(tQueue *, dtype);
34
35 /* 出队列 */
36 dtype
37 DeQueue(tQueue *);
38
39 /* 取得队首元素 */
40 dtype
41 GetFront(tQueue *);
42
43 /* 清空队列 */
44 void
45 ClearQueue(tQueue *);
46
47 #endif
1 /* queue.c */
2
3 #include <stdlib.h>
4 #include <stdbool.h>
5 #include "queue.h"
6
7 /* 描述:队列初始化
8 * 输入:无
9 * 输出:一个指向tQueue型的指针,指针所指向对象已被初始化
10 */
11 tQueue *
12 QueueInit(void)
13 {
14 tQueue * q = (tQueue *)malloc(sizeof(tQueue));
15 if (q == NULL)
16 exit(EXIT_FAILURE);
17 q->front = NULL;
18 q->rear = NULL;
19 q->size = 0;
20 return q;
21 }
22
23 /* 描述:判断队列是否为空。为空返回true;否则返回false
24 * 输入:一个指向tQueue型的指针
25 * 输出:true或false
26 */
27 bool
28 IsEmpty(tQueue * q)
29 {
30 /* q未被初始化 */
31 if (q == NULL)
32 exit(EXIT_FAILURE);
33 return (q->size) == 0;
34 }
35
36 /* 描述:入队列操作
37 * 输入:一个指向tQueue型的指针,一个dtype型待入队列变量
38 * 输出:无
39 */
40 void
41 EnQueue(tQueue * q, dtype x)
42 {
43 /* q未被初始化 */
44 if (q == NULL)
45 exit(EXIT_FAILURE);
46
47 tNode * temp = (tNode *)malloc(sizeof(tNode));
48 if (temp == NULL)
49 exit(EXIT_FAILURE);
50
51 temp->data = x;
52 temp->next = NULL;
53 if (IsEmpty(q) == true)
54 q->front = temp;
55 else
56 q->rear->next = temp;
57 q->rear = temp;
58 q->size = (q->size) + 1;
59 }
60
61 /* 描述:出队操作
62 * 输入:一个指向tQueue型的指针
63 * 输出:一个dtype型的被出队元素
64 */
65 dtype
66 DeQueue(tQueue * q)
67 {
68 tNode * next = NULL;
69 dtype r;
70
71 /* 队列为空,不得出队 */
72 if (IsEmpty(q))
73 exit(EXIT_FAILURE);
74
75 next = q->front->next;
76 r = q->front->data;
77 free(q->front);
78 q->front = next;
79 q->size = (q->size) - 1;
80 if (IsEmpty(q))
81 q->rear = NULL;
82 return r;
83 }
84
85 /* 描述:取得队首元素,而不出队列
86 * 输入:一个指向tQueue型的指针
87 * 输出:队首元素
88 */
89 dtype
90 GetFront(tQueue * q)
91 {
92 /* 队列为空,出错 */
93 if (IsEmpty(q))
94 exit(EXIT_FAILURE);
95 return q->front->data;
96 }
97
98 /* 描述:清空队列
99 * 输入:一个指向tQueue型的指针
100 * 输出:无
101 */
102 void
103 ClearQueue(tQueue * q)
104 {
105 /* q未被初始化 */
106 if (q == NULL)
107 exit(EXIT_FAILURE);
108 while (IsEmpty(q) == false)
109 DeQueue(q);
110 free(q);
111 }
1 /* tqueue.c */
2
3
4
5 #include <stdio.h>
6
7 #include "queue.h"
8
9
10
11 int main(int argc, char *argv[])
12
13 {
14
15 /* q未被初始化 - pass
16
17 tQueue * q = NULL;
18
19 printf("Queue q is empty : ");
20
21 IsEmpty(q) ? printf("yes
") : printf("no
");
22
23 */
24
25
26
27 tQueue * q = QueueInit();
28
29
30
31 /* pass
32
33 printf("q->front = %p
", q->front);
34
35 printf("q->rear = %p
", q->rear);
36
37 printf("q->size = %llu
", q->size);
38
39 printf("Queue q is empty : ");
40
41 IsEmpty(q) ? printf("yes
") : printf("no
");
42
43 输出:
44
45 q->front = (nil)
46
47 q->rear = (nil)
48
49 q->size = 0
50
51 Queue q is empty : yes
52
53 */
54
55
56
57 /* pass
58
59 EnQueue(q, 'h');
60
61 EnQueue(q, 'e');
62
63 EnQueue(q, 'l');
64
65 EnQueue(q, 'l');
66
67 EnQueue(q, 'o');
68
69 printf("q->size = %llu
", q->size);
70
71 printf("Queue q is empty : ");
72
73 IsEmpty(q) ? printf("yes
") : printf("no
");
74
75 while (IsEmpty(q) == false)
76
77 printf("%c
", DeQueue(q));
78
79 printf("q->size = %llu
", q->size);
80
81 printf("Queue q is empty : ");
82
83 IsEmpty(q) ? printf("yes
") : printf("no
");
84
85 输出:
86
87 q->size = 5
88
89 Queue q is empty : no
90
91 h
92
93 e
94
95 l
96
97 l
98
99 o
100
101 q->size = 0
102
103 Queue q is empty : yes
104
105 */
106
107
108
109 /* 当队列为空时
110
111 * p q - 0x602010
112
113 * p q->front - 0x0
114
115 * p q->rear - 0x0
116
117 * p q->size - 0
118
119 */
120
121
122
123 // EnQueue(q, 'h');
124
125 /* 当队列中有一个元素时 - pass
126
127 * p q - 0x602010
128
129 * p q->front - 0x602030
130
131 * p q->rear - 0x602030
132
133 * p q->size - 1
134
135 * p q->front->data - 'h'
136
137 * p q->front->next - 0x0
138
139 */
140
141
142
143 // EnQueue(q, 'e');
144
145 /* 当队列中有两个元素时 - pass
146
147 * p q - 0x602010
148
149 * p q->front - 0x602030
150
151 * p q->rear - 0x602050
152
153 * p q->size - 2
154
155 * p q->front->data - 'h'
156
157 * p q->front->next - 0x602050
158
159 * p q->front->next->data - 'e'
160
161 * p q->front->next->next - 0x0
162
163 */
164
165
166
167 // DeQueue(q);
168
169 /* 当有一个元素出队列时 - pass
170
171 * p q - 0x602010
172
173 * p q->front - 0x602050
174
175 * p q->rear - 0x602050
176
177 * p q->size - 1
178
179 * p q->front->data - 'e'
180
181 * p q->front->next - 0x0
182
183 */
184
185
186
187 // DeQueue(q);
188
189 /* 当元素全部出队列时 - pass
190
191 * p q - 0x602010
192
193 * p q->front - 0x0
194
195 * p q->rear - 0x0
196
197 * p q->size - 0
198
199 */
200
201
202
203 /* pass
204
205 EnQueue(q, 'h');
206
207 EnQueue(q, 'e');
208
209 EnQueue(q, 'l');
210
211 EnQueue(q, 'l');
212
213 EnQueue(q, 'o');
214
215 ClearQueue(q);
216
217 */
218
219
220
221 return 0;
222
223 }
如何编译?在需要使用的.c文件,比如tqueue.c中包含queue.h,然后使用下面的命令编译
gcc -o tqueue tqueue.c queue.c