链队列的队头指针设置在链表的头结点上,队尾指针设置在链表的最后一个结点上,便于队头出、队尾入的操作。
1. 结构体定义
typedef struct LinkNode{ // 链队结点
int data;
struct LinkNode *next;
}LinkNode;
typedef struct { // 链队,有头结点
LinkNode *qFront, *qRear;
}LinkQueue;
2. 初始化
void LinkQueueInit(LinkQueue *lq)
{
LinkNode *head = malloc(sizeof(LinkNode));
head->next = NULL;
head->data = 0;
lq->qFront = lq->qRear = head; // 均设为头结点
}
3. 队列判空
int LinkQueueEmpty(LinkQueue *lq)
{
if(lq->qRear == lq->qFront)
return 1;
else
return -1;
}
4. 入队
int LinkQueueEnQueue(LinkQueue *lq, int e)
{
LinkNode *p = malloc(sizeof(LinkNode));
p->data = e;
p->next = NULL;
lq->qRear->next = p;
lq->qRear = p;
lq->qFront->data++;
return 1;
}
5. 出队
int LinkQueueDeQueue(LinkQueue *lq, int *e)
{
if(LinkQueueEmpty(lq) > 0)
return -1;
LinkNode *p = lq->qFront->next;
*e = p->data;
lq->qFront->next = p->next;
lq->qFront->data--;
if(lq->qRear == p) // 删除最后一个结点时,特殊处理
lq->qRear = lq->qFront;
free(p);
return 1;
}