队列的链式存储结构也可以用一个单链表实现。 插入和删除操作分别在链表的两头进行。
先讲一下对于带头节点的动态链式实现,不带头节点版本请点击这里
代码如下:(C++)
myqueue.h
#include<stdio.h>
#include<stdlib.h>
struct Node
{
char data;
Node* next;
};
struct Queue
{
Node*front;
Node*rear;
};
void initQueue(Queue*q);
bool enQueueEmpty(Queue*q); //因为是链表式的,所以不需要判满
void enQueue(Queue*q,char ch);
char deQueue(Queue*q);
void resetQueue(Queue*q);
void destroyQueue(Queue*q);
myqueue.cpp
#include"myqueue.h"
void initQueue(Queue*q)
{
q->front = q->rear = (Node*)malloc(sizeof(Node));
q->front->next=NULL;
}
bool enQueueEmpty(Queue*q)
{
return q->front==q->rear;
}
void enQueue(Queue*q,char ch)
{
Node*cur= (Node*)malloc(sizeof(Node));
cur->data=ch;
cur->next=NULL; //在尾巴
q->rear->next=cur;
q->rear=cur; //让rear始终指向最后一个
}
char deQueue(Queue*q)
{
char ch = q->front->next->data;
if(q->front->next == q->rear) //若两者相等,则队列为空
{
q->rear = q->front;
free(q->front->next);
q->front->next=NULL; //置为空
}
else //若不是相等,就是正常的节点脱离
{
Node*t=q->front->next;
q->front->next=t->next;
free(t);
}
return ch;
}
void resetQueue(Queue*q)
{
Node* head=q->front->next;
q->front->next=NULL; //将链表一分为二
q->rear=q->front;
Node*t;
while(head)
{
t=head->next;
free(head);
head=t;
}
}
void destroyQueue(Queue*q) //销毁所有
{
resetQueue(q);
free(q->front);
}
main函数
#include <iostream>
#include"myqueue.h"
using namespace std;
int main()
{
Queue q;
initQueue(&q);
for(char ch='a';ch<='z';ch++)
{
enQueue(&q,ch);
}
//resetQueue(&q);
while(!enQueueEmpty(&q))
printf(" %c ",deQueue(&q));//结果显示压入和弹出顺序是一致的,也表明是先进先出
destroyQueue(&q);
return 0;
}