队列的链式存储
队列的链式存储结构其实也就是前面线性表的单链表,只不过限定了头出尾进。我们一般将队列的头Front指向链表的头结点,Rear指向链表的尾结点(由于队列是头出,也就是在队列头部进行删除操作,如果反过来将Front指向链表的尾结点,那么删除元素之后Front要指向前一结点,但在单链表中并不只知道其前置的地址),空队列时,front与rear均指向头结点。
定义
typedef int ElementType;//根据实际情况将ElementType定义为需要的数据类型,这里假定为int类型
typedef struct QNode
{
ElementType Data;
struct QNode *Next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front,rear;
}LinkQueue;
入队操作
Status EnQueue(LinkQueue *Q,ElementType e)
{
QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
if(!s)
return ERROR;
s->Data=e;
s->Next=NULL;
Q->rear->Next=s;
Q->rear=s;
return OK;
}
出队
Status DeQueue(LinkQueue *Q,ElementType *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)
Q-rear=Q->front;
free(p);
return OK;
}
总结
尽管队列的顺序存储结构和链式存储结构在时间复杂度上都是O[1],但是由于链式存储实现下,入队出队均需要申请和释放空间,所以还是有一些细微的差异;
而在空间是,尽管顺序存储不需要指针域,但是它也存在着数组长度和空间浪费的问题,链式存储在空间方面就灵活的多;
总的来讲,确定队列长度最大值的情况下可以选用循环顺序结构。不确定时选用链结构。