大学的课程使用的是C语言
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
void QueueAppend(LQueue *&q,ElemType e) //入队
{QNode *p;
p=(QNode *)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
if (q->rear==NULL) //若链队为空,则新节点是队首节点又是队尾节点
q->front=q->rear=p;
else
{
q->rear->next=p; //将*p节点链到队尾,并将rear指向它
q->rear=p;
}
}
上面的函数完成元素e的如队列操作,在实现的时候首先是要if语句判断当前所操作的队列是否为空。为空,则只需将队列的头(Q->front)指向新建的节点p;非空,则将队尾(Q->real->next)指向新建的节点p,再修改队尾指针
bool QueueDelete(LQueue *&q,ElemType &e) //出队
{
QNode *t;
if (q->rear==NULL) //队列为空
return false;
t=q->front; //t指向第一个数据节点
if (q->front==q->rear) //队列中只有一个节点时
q->front=q->rear=NULL;
else //队列中有多个节点时
q->front=q->front->next;
e=t->data;
free(t);
return true;
}
上面的函数完成的是出队列操作,在实现的时候先判断队列是否为空。为空;抛出为空提示;非空;先将队头的元素(Q->front->data)赋值给待定的变量e,LQNone型的指针型变量*p指向队列的队头(Q->front),队头节点(Q->front)指向队头节点的下一个节点(Q->front->next),此时队头元素已经脱链,如果出队的是最后一个元素时,还应将队尾(Q->real)置为空(NULL),最后再释放*p的内存
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我的实验报告里面的算法分析也只写了队列的出队和入队操作,个人感觉队列的出队和入队操作是队列不同于线性表的地方