队列的链式结构,其实就是线性表的单链表,只不过有着队列的特点先进先出(FIFO),只能尾进头出,简称为链队列。
首先我们先抽象链表数据结构
typedef struct List
{
int date;
struct List* next;
}list;
在抽象队列数据结构(此时队列的队首和队尾用链表表示)
typedef struct Queue
{
list* head,*rear;
}LinkQueue;
然后我们创建一个链队列(即链队列的初始化),这里我们先将队首和队尾指向NULL。
LinkQueue* creatLinkQueue()
{
LinkQueue* Q = (LinkQueue*)malloc(sizeof(LinkQueue));
Q->head = Q->rear = NULL;
return Q;
}
接下来进行入对的操作,因为队列是先进先出的数据结构,所以在插入数据的方法上与链栈的方法不同(链栈插入数据采用头插法),链队列的插入我们采用尾插法,尾指针始终即为队尾指针。
void EnterQueue(LinkQueue* q, int date)
{
list* newNode = (list*)malloc(sizeof(list));
newNode->next = NULL;
newNode->date = date;//创建一个新节点
if (q->head == NULL)
q->head = q->rear = newNode;//如果队列为空,就让队首和队尾指向同一个结点
else
{
q->rear->next = newNode;
q->rear = newNode;//进行队列的插入
}
}
出队的操作就是将头指针往后挪一下,如果链表除头结点外只剩一个元素,则将尾指针指向头指针。
void DepertrueQueue(LinkQueue* q)
{
list* Q;
if (q->head==q->rear)
{
printf("空栈\n");
return;
}
Q = q->head;
q->head =Q->next;
free(Q);
if (q->rear == Q)
q->rear = q->head;
}
循环队列和链队列的差异,其实就是链式结构和顺序结构的差异,总的来说,在确定队列长度的情况下,建议使用循环队列,反之则用链队列