|
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 中的头元素。
|
你是否注意到算法中那个黄色的语句?它是否多余?能否删去? |
|
|
请先看一个动画演示。
你一定看出问题来了吧!由于一般情况下,出队列的操作只涉及队头元素,因此不需要修改队尾指针,但当链队列中只有一个数据元素时,队头元素恰好也是队尾元素,当它被删除之后,队尾指针就"悬空"了,待下次再做入队操作时,就要产生指针的"悬空访问"的错误,因此在这种情况下必须同时修改尾指针。 |
|
|
|