zoukankan      html  css  js  c++  java
  • 数据结构:队列的实现

    一 写在开头

    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

  • 相关阅读:
    Python 不同数据类型比较
    计算机外语收集
    d3.js学习-联系力学图
    d3.js学习11
    d3.js学习10
    d3.js学习9
    d3.js学习8
    [springboot jpa] [bug] Could not open JPA EntityManager for transaction
    [spring cloud feign] [bug] 使用对象传输get请求参数
    [ethereum源码分析](5) 创建新账号
  • 原文地址:https://www.cnblogs.com/laizhenghong2012/p/9354563.html
Copyright © 2011-2022 走看看