一 写在开头数据结构
1.1 本文内容spa
数据结构队列的实现。指针
二 版本一code
不说废话,直接看代码。实现基于单链表。对象
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\n") : printf("no\n"); 22
23 */
24
25
26
27 tQueue * q = QueueInit(); 28
29
30
31 /* pass 32
33 printf("q->front = %p\n", q->front); 34
35 printf("q->rear = %p\n", q->rear); 36
37 printf("q->size = %llu\n", q->size); 38
39 printf("Queue q is empty : "); 40
41 IsEmpty(q) ? printf("yes\n") : printf("no\n"); 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\n", q->size); 70
71 printf("Queue q is empty : "); 72
73 IsEmpty(q) ? printf("yes\n") : printf("no\n"); 74
75 while (IsEmpty(q) == false) 76
77 printf("%c\n", DeQueue(q)); 78
79 printf("q->size = %llu\n", q->size); 80
81 printf("Queue q is empty : "); 82
83 IsEmpty(q) ? printf("yes\n") : printf("no\n"); 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,而后使用下面的命令编译blog
gcc -o tqueue tqueue.c queue.c队列