以单链表的存储方式构建队列,动态分配内存空间,不用考虑上溢。
typedef struct node
{
ElemType data;
node * next;
} ListNode;
typedef struct
{
ListNode * front;
ListNode * rear;
}LiQueue;
四要素:
空队列:rear = NULL
满队列:不考虑满队列。
入队列:申请一块新的内存空间,接到rear的next,rear,front指向新的节点。
出队列:将front指向的首结点,输出节点并释放。
链队操作的函数
①初始化队列
void InitQueue(LiQueue *&q)
{
q = (LiQueue *)malloc(sizeof(LiQueue));
q->front = NULL;
q->rear = NULL;
}
②销毁队列
//链队的释放,一个指针指向队列的头结点,剩下的就如单链表的释放操作,p、q两指针相随释放其他节点。
void DestroyQueue(LiQueue *&q)
{
LiQueue * p = q->front,* r;
if(p!=NULL){
r = p->next;
while(r!=NULL)
{
free(p);
p = r;
r = p->next;
}
free(p);
free(q);
}
}
③队列判空
bool EmptyQueue(LiQueue *&q)
{
return (q->rear==NULL);
}
④进队EnQueue
void EnQueue(LiQueue *&q,ElemType e)
{
LiQueue *p = (LiQueue *)malloc(sizeof(LiQueue));
p->next = NULL;
p->data = e;
if(q->rear==NULL) //当在空队列进队时,front也需指向首节点
{
q->front = q->rear = p;
}
else
{
q->rear->next = p;
q->rear = p;
}
}
⑤出队DeQueue
当队列中只有一个元素时,出队后,需将rear,front都赋值NULL
bool DeQueue(LiQueue *&q,ElemType &e)
{
ListNode * n;
if(q->rear==NULL)
return false;
n = q->front;
e = n->data;
if(q->front==q->rear)
q->front = q->rear = NULL;
else
q->front = q->front->next;
free(n);
return true;
}