一 寫在開頭數據結構
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隊列