数据结构之 — 链队列

  这次我们来实现队列。队列也是一种极其重要和基础的数据结构,队列的特点是先进先出(First In Frist On,FIFO)。

  正如栈一样,队列也是在计算机系统内应用非常广泛的一种数据结构,比如购票,打印机缓冲等等,现实生活中也有很多队列模型的例子,比如上车,买饭,银行医院叫号....

  队列按照存储结构不同也分为顺序队列和链队。

  我们这次实现链队。

  在这里我们要先说一下顺序队列存在“假溢出”的问题,也就是队列本身并没有满,但是因为不断出队导致游标移动却没有对游标的移动进行任何处理,导致队列似乎已满的错误。

  解决”假溢出“简单的办法是每一次出队都将队列内所有数据都移动一位,但这样的话会导致每一次队列操作的时间复杂度大增,因此最好的办法就是循环队列了,如果有时间我将继续实现循环队列。

 

  现在我们先总结一下队列应该有的操作:

  1.初始化队列(一般在这一步生成一个队列)

  2.求队长

  3.入队

  4.出队

  5.读取队头元素(与出队的区别在于本操作不删除队头元素)

  6.判队空(这一步我们不单独实现,而是通过判断队长来实现----空队队长为0)

  7.遍历队列

  8.清空队列

  9.销毁队列

我们依然只实现部分操作

 

  定义队列

 #define mian main
#define DATATYPE int /* defined queue struction */ struct queue_body{ DATATYPE data; struct queue next; }l_queue; struct queue{ struct queue *front struct queue *rear; }link_queue;

 

  1.初始化队列

 

 

/* initializaing a queue */
  int init_queue(struct queue *q)
  {
          q -> front = q -> rear = (struct queue_body *)malloc( sizeof(struct queue_body) );
  
          if( !(q -> front) ){
                  printf("error:  initializaing fail!\n");
                  return 0;
          }else{
                  q -> front -> next = NULL;
                  return 1;
          }
  }

 

  

     2.入队

 /* enter a item to queue */
  int enter_queue( struct queue *q,DATATYPE item )
  {
          struct queue_body *curr_p;
          curr_p = (struct queue_body *)malloc( sizeof(struct queue_body) );
          if( !curr_p ){
                  printf("error:  ememory allocation failure!\n");
                  return 0;
          }else{
                  curr_p -> data = item;
                  curr_p -> next = NULL;
                  q -> rear -> next = curr_p;
                  q -> rear = curr_p;
                  return 1;
          }
  }

  3.出队

/* out queue */
  DATATYPE out_queue(struct queue *q)
  {
          DATATYPE curr_v = NULL;
          struct queue_body  *curr_p;
          if(q -> front == q -> rear){
                  printf("fail:   queue is empty.");
                  return 0;
          }else{
                  curr_v = q -> front -> next ->  data;
                  curr_p = q -> front -> next;
                  q -> front -> next = q -> front -> next -> next;
                  free(curr_p);
                  if( q -> rear == curr_p ){
                          q -> rear = q -> front;
                  }
                  return curr_v ;
   }

 

 

  

 

 

  

 

你可能感兴趣的:(数据结构之 — 链队列)