Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8825
  • 博文数量: 2
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-10 22:07
文章分类

全部博文(2)

文章存档

2015年(2)

我的朋友
最近访客

分类: C/C++

2015-09-05 08:29:02


点击(此处)折叠或打开

  1. /*
  2.  *队列各种常见操作的实现
  3.  */
  4.  
  5.  #include <stdio.h>
  6.  #include <stdlib.h>
  7.  #include <string.h>
  8.  
  9.  #define TURE 1
  10.  #define FALSE 0
  11.  #define ONE_COUNT 1
  12.  
  13.  
  14.  typedef struct Queue
  15.  {
  16.      struct QueueNode *head; //指向队列头部
  17.      struct QueueNode *tail; //指向队列尾部
  18.      struct element_count; //队列元素的个数
  19.  }Queue;
  20.  
  21.  typedef struct QueueNode
  22.  {
  23.      int data; //队列节点的数据域
  24.      struct QueueNode *prev; //该节点的上一个节点的地址
  25.      struct QueueNode *next; //该节点的下一个节点的地址
  26.  }QueueNode;
  27.  
  28.  typedef unsigned char Boolean;
  29.  
  30.  Queue *create_queue(void); //创建一个空队列
  31.  void destory_queue(Queue **queue); //销毁一个队列
  32.  Boolean is_empty(Queue *queue); //判断队列是否为空
  33.  int get_queue_count(Queue *queue); //得到队列的元素个数
  34.  void push_back(Queue *queue, int value); //入队操作
  35.  static QueueNode *make_one_node(void); //创建一个队列节点
  36.  Boolean pop_front(Queue *queue); //出队操作
  37.  Boolean get_front(Queue *queue, int value); //得到一个队首元素
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  //创建一个空队列
  44.  Queue *create_queue(void)
  45.  {
  46.      Queue *queue = (Queue *)malloc(sizeof(queue));
  47.      if(queue == NULL){
  48.      fprintf(stderr,"the memory is full!\n");
  49.          exit(1);
  50.      }
  51.     
  52.      bzero(queue, sizeof(Queue));
  53.     
  54.      return queue;
  55.  }
  56.  
  57.  
  58.  //销毁一个队列
  59.  void destory_queue(Queue **queue)
  60.  {
  61.      QueueNode *p_node = NULL;
  62.     
  63.      if(queue == NULL || *queue == NULL){
  64.      return ;
  65.      }
  66.     
  67.      p_node = (*queue)->head;
  68.     
  69.      while(p_node != NULL){
  70.      //让Queue的head指针指向当前队列的第二个节点,
  71.          //然后释放队列的第一个节点,再让p_node指向p_node的head指针
  72.          (*queue)->head = (*queue)->head->next;
  73.          free(p_node);
  74.          p_node = (*queue)->head;    
  75.      }
  76.     
  77.      //删除完队列节点后再删除队列的控制信息
  78.      free(*queue);
  79.      *queue = NULL;
  80.      }
  81.     
  82.     
  83. //判断队列是否为空
  84. Boolean is_empty(Queue *queue)
  85. {
  86.     //若queue->element_count == 0为真时,返回1;为假时返回0.
  87.     return (queue->element_count == 0);
  88. }    
  89.     
  90.     
  91.     
  92. //得到队列的元素个数
  93. int get_queue_count(Queue *queue)
  94. {
  95.     if(queue == NULL){
  96.     //判断队列是否存在,如果队列不存在,则返回一个负数。
  97.      return -1;
  98.     }
  99.     
  100.     return queue->element_count;
  101. }    
  102.     
  103.     
  104. //入队操作
  105. void push_back(*Queue queue, int value)
  106. {
  107.     QueueNode *node = NULL;
  108.     
  109.     if(queue == NULL){ //判断队列的控制信息是否存在
  110.      return ;
  111.     }

  112.     node = make_one_node(); //完成节点赋初值
  113.     node->data = value;
  114.     
  115.     if(is_empty(queue)){
  116.     //如果队列为空,直接让控制信息的head和tail指针指向node
  117.      queue->head = queue->tail = node;
  118.     }else{
  119.      queue->tail->next = node ;
  120.         node->prev = queue->tail;
  121.         queue->tail = node;
  122.     }
  123.     (queue->element_count)++;
  124. }
  125.     
  126.     
  127. //创建一个队列节点
  128. static QueueNode *make_one_node(void)
  129. {
  130.     QueueNode *result = (QueueNode *)malloc(sizeof(QueueNode));
  131.     if(result == NULL){
  132.      fprintf(stderr,"the memory is full!\n");
  133.         exit(1);
  134.     return result;    
  135. }

  136. //出队操作
  137. Boolean pop_front(Queue *queue)
  138. {
  139.     Boolean ok = FALSE;
  140.     QueueNode *p_node = NULL;
  141.     
  142.     if(queue == NULL || is_empty(queue)){
  143.      //队列不存在或没有元素直接返回失败
  144.         return ok;
  145.     }
  146.     
  147.     if(queue->element_count == ONE_COUNT){
  148.     //队列只有一个节点时,直接删除,并且修改head和tail的指向
  149.      free(queue->head);
  150.      queue->head = queue->tail = NULL;
  151.     }else{
  152.         p_node = queue->head;
  153.         queue->head = queue->head->next;
  154.      free(p->node);
  155.     }
  156.     (queue->element_count)--;
  157.     return ok = TURE;
  158. }


  159. Boolean get_front(Queue *queue, int *value)
  160. {
  161.     Boolean ok = FALSE;
  162.     
  163.     if(queue == NULL || is_empty(queue)){
  164.     //判断队列是否存在或队列是否为空
  165.      return ok;
  166.     }

  167.     *value = queue->head->data; //返回队首节点的数据值给value
  168.     return ok = TURE;
  169. }

阅读(1118) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:冒泡排序的三种方法

给主人留下些什么吧!~~