數據結構:隊列的實現

一 寫在開頭數據結構

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隊列

相關文章
相關標籤/搜索