队列的链式存储实现
队列的链式存储结构也可以用一个单链表实现。插入和删除操作分别在链表的两头进行;队列指针front和rear应该分别指向链表的哪一头?
- front指向链表的头结点(头结点能找到下一个结点,可进行删除操作)
- rear指向链表的尾结点(只能做插入操作)
struct Node
{
ElementType Data;
struct Node* Next;
};
struct QNode
{
struct Node *rear; /*指向队尾结点*/
struct Node *front; /*指向队头结点*/
};
typedef struct QNode *Queue;
Queue PtrQ;
// 出队操作
ElementType DeleteQ(Queue PtrQ)
{
struct Node* FrontCell;
ElementType FrontElem;
if (PtrQ->front==NULL)
{
printf("堆栈空");
return ERROR;
}
FrontCell=PtrQ->front;
if (PtrQ->front==PtrQ->rear)
{
PtrQ->front=PtrQ->rear=NULL;
}
else
{
PtrQ->front=PtrQ->front->Next;
}
FrontElem=PtrQ->front->Data;
free(FrontCell)
return FrontElem;
}
// 入队操作
void AddQ(Queue PtrQ,ElementType Elem)
{
if (PtrQ->front==PtrQ->rear)
{
printf("堆栈满");
return ERROR;
}
else
{
PtrQ->rear->Next->Data=Elem;
PtrQ->rear=PtrQ->rear->Next;
}
}