在之前讲解了顺序队列,接下来讲解队列的链式存储结构及实现
队列的链式存储结构及实现
在队列的链式存储中我们将队头指针指向单链表的头结点,队尾指针指向终端节点
在队列为空时,front和rear都指向头结点
链队列的结构为:
# define MAXSIZE 1000
# define OK 1
# define ERROR 0
# define TRUE 1
# define FALSE 0
typedef int Status;
typedef int QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct{
QueuePtr front, rear;
}LinkQueue;
在定义好链队列的结构后我们就可以对链队列的基本操作进行代码实现
入队操作
Status EnQueue(LinkQueue *Q, QElemType e){
QueuePtr s = (QueuePtr)malloc(sizeof(QNode));
if(!s){
exit(OVERFLOW);
}
s->data = e;
s->next = NULL;
Q->rear->next = s;
Q->rear = s;
return OK;
}
出队操作
Status DeQueue(LinkQueue *Q, QElemType *e){
QueuePtr p;
if(Q->front == Q->rear){
return ERROR;
}
p = Q->front->next;
*e = p->data;
Q->front->next = p->next;
if(Q->rear == p){ //当队列中只有一个元素,出队后需要让rear指针指向头结点即 Q->rear = Q->front
Q->rear = Q->front;
}
free(p);
return OK;
}
上面的操作比较简单,主要是明白队列的思想