4.1-4.2
基本概念:
有表首、表尾。
表首:也称队首,可进行删除操作
表尾:也称队尾,可进行插入操作
//函数NewQNode()产生一个新队列结点。
qlink NewQNode()
{
return (qlink)malloc(sizeof(QNode));//转类型
}
//用指针实现的队列Queue定义如下
typedef struct lque *Queue;/*队列指针类型*/
typedef struct lque{ /*队列结构*//*队首、队尾*/
qlink front; /*队首指针*/
qlink rear; /*队尾指针*/
}Lqueue;
//函数QueueInit()通过将队首指针front和队尾指针rear置为空指针,创建一个空队列。
Queue QueueInit()
{
Queue Q=(Queue)malloc(sizeof*Q);
Q->front=Q->rear=0; //有队首、队尾且都要是空的,才有用
return Q;
}
//函数EnterQueue(x)先为元素x创建一个新结点,然后修改队列O的队尾结点指针,在队尾插入新结点,使新结点成为新队尾结点。
void EnterQueue(QItem x,Queue Q)
{
qlink p=NewQNode();/*创建一个新结点*/
p->element=x;
p->next=0;
/*队尾插入新结点*/
if(Q->front)0->rear->next=p;/*队列非空*/
elseQ->front=p;/*队列空*/
Q->rear=p; //队列不管空不空都要指向p
}
//函数DeleteQueue(0)先将队首元素存于x中,然后修改队列o的队首结点指针使其指向队首结点的下一个结点,从而删除队首结点:最后返回x。
QItem DeleteQueue(Queue Q)
{/*前提:队列非空*/
if(QueueEmpty(Q))exit(1); //这是一句判断句,结果为:假
QItemx=Q->front->element/*头元素*/;/*将队首元素存于x中*/
/*删除队首结点*/
qlink p=Q->front;
Q->front=Q->front->next;
free(p);
return x;
}