数据结构:队列的实现

一 写在开头

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\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,然后使用下面的命令编译

gcc -o tqueue tqueue.c queue.c

 

posted @ 2018-07-23 14:43  wallace-rice  阅读(383)  评论(0编辑  收藏  举报