链队列和单链表相似,在单链表的基础上增加了两个头尾指针,且元素的删除和增加按照循环队列规则。
//队列链表结构的节点
typedef struct node
{
int data;
struct node *next;
} Q_node;
//链表结构(头尾指针)
typedef struct List
{
Q_node *front;
Q_node *rear;
} ListQueue;
初始化操作:
ListQueue *InitListQueue(ListQueue *Q)
{
Q = (ListQueue *)malloc(sizeof(ListQueue)); //生成节点指针
Q->front = (Q_node *)malloc(sizeof(Q_node)); //生成头结点
if (Q->front == NULL)
{
exit(-1);
}
Q->rear = Q->front; //空队列时头指针和尾指针一样,指向头节点
Q->front->next = NULL; //空队列的头结点的next指向空
return Q;
}
进队操作:
void InListQueue(ListQueue *Q, int data)
{
Q_node *p;
p = (Q_node *)malloc(sizeof(Q_node));
if (!p)
{
exit(-1);
}
p->data = data; //传入需要入队的值
p->next = NULL; //将其指针域作为尾,即将其作为最后一个元素
Q->rear->next = p; //将入队的元素赋为当前队列尾节点的后继
Q->rear = p; //将入队的元素当做为尾节点
}
出队操作:
void OutListQueue(ListQueue *Q, int *data)
{
Q_node *p;
if (Q->front == Q->rear)
{
printf("队空");
exit(-1);
}
p = Q->front->next; //p指向队头节点
*data = p->data; //保存删除的值
Q->front->next = p->next; //将原队头的后继变成队头
if (Q->rear == p) //若此时队头也是队尾
{
Q->rear = Q->front;
}
free(p); //移除队列之后记得释放保存其内容的指针
}
打印:
void PrintListQueue(ListQueue *Q)
{
Q_node *q;
q = Q->front->next;
if (Q->front->next == Q->rear->next)
{
printf("空队列\n");
exit(0);
}
while (q != NULL)
{
printf("节点的值为: %d\n", q->data);
q = q->next;
}
}