链队就是将队列的元素用链表的形式来表示,设置头节点和尾结点来控制队列的尾入头出。
下面我们主要来实现链队的基本操作:
1.头文件
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int DataType;
typedef struct QueueNode{
struct QueueNode*next;
DataType data;
}QNode;
struct Queue{
QNode*front;
QNode*rear;
};
void QueueInit(QNode*q);//初始化
void QueueDestroy(QNode*q);//销毁
void QueuePush(QNode*q,DataType x);//入队
void QueuePop(QNode*q);//出队头元素
DataType QueueFront(QNode*q);//取队头元素
DataType QueueBack(QNode*q);//取队尾元素
int QueueSize(QNode*q);//大小计算
bool QueueEmpty(QNode*q);//判空
2.源文件
void QueueInit(QNode*q){
assert(q);
q->front=q->rear=NULL;
}
void QueuePush(QNode*q,DataType x){
assert(q);
QNode*newnode=(QNode*)malloc(sizeof(QNode));
if(newnode==NULL)
exit(0);
newnode->data=x;
newnode->next=NULL;
if(q->rear==NULL)
q->rear=q->front=newnode;
else{
q->rear->next=newnode;
q->rear=newnode;
}
}
void QueuePop(QNode*q){
assert(q);
assert(q->front);
if(q->front->next==NULL){
free(q->front);
q->front=NULL;
}
QNode*cur=q->front->next;
free(q->front);
q->front=cur;
}
void QueueDestroy(Queue&q){
assert(q);
QNode*cur=q->front;
while(cur){
QNode*next=cur->next;
free(cur);
cur=NULL;
cur=next;
}
q->front=q->rear=NULL;
}
DataType QueueFront(QNode*q){
assert(q);
assert(q->front);
return q->front->data;
}
DataType QueueBack(QNode*q){
assert(q);
assert(q->front);
return q->rear->data;
}
int QueueSize(QNode*q){
assert(q);
int size=0;
QNode*cur=q->front;
while(cur){
cur=cur->next;
size++;
}
return size;
}
bool QueueEmpty(QNode*q){
assert(q);
return q->front==NULL;
}