3.3.2 队列的存储表示和操作的实现

 一、链队列

算法
  void
InitQueue (Queue &Q)
  {
  //
构造一个空队列 Q

   Q.front=Q.rear=new LNode;
   if (!Q.front) exit(1);  // 存储分配失败
   Q.front->next=NULL;
   Q.length=0;
  }
 
     
  算法
  void
EnQueue(Queue &Q,ElemType e)
  {
  
// 在当前队列的尾元素之后,插入元素 e 为新的队列尾元素
   s = new LNode;
   if (!s) exit(1);  // 存储分配失败
   s->data=e;  s->next = NULL;
   Q.rear->next=s; // 修改尾结点的指针
   Q.rear=s;     // 移动队尾指针
   ++Q.length;    // 队列长度增1
  }
 
 
 插入元素 e 为新的队列尾元素。动画
 
  算法
  bool
DeQueue(Queue &Q, ElemType &e)
  {
 // 若队列不空,则删除当前队列 Q 中的头元素,用 e 返回其值,
 // 并返回 TRUE;否则返回 FALSE

  if ( Q.front == Q.rear )   // 链队列中只有一个头结点
   return FALSE;
  p = Q.front->next;
  e = p->data;        // 返回被删元素
  Q.front->next=p->next;    // 修改头结点指针
  if(Q.rear == p) Q.rear = Q.front;
  delete p;         // 释放被删结点
  return TRUE;
  } // DeQueue

  链队列的基本操作的时间复杂度,除遍历之外,都是常量级的。
 
 删除当前队列 Q 中的头元素。动画

  思考题 你是否注意到算法中那个黄色的语句?它是否多余?能否删去?