链队列的头文件
链队列的结构图
/*
链式队列
除摧毁队列时间复杂度为O(n),其余的都是O(1)
*/
/*===============链式队列结构体============================*/
typedef struct qnode{
DataType data;
struct qnode *next;
}LQNode;
/*===============头结点和尾结点=============================*/
typedef struct{
LQNode *front;
LQNode *rear;
}LQueue;
/*====================初始化链队列============================*/
void QueueInitiate(LQueue *Q){
Q->rear = NULL;
Q->front = NULL;
}
/*=======================判空=================================*/
int QueueNotEmpty(LQueue Q){
if(Q.front==NULL){
return 0;
}else{
return 1;
}
}
/*=========================入队================================*/
void QueueAppend(LQueue *Q, DataType x){
LQueue *p;
p = (LQueue*)malloc(sizeof(LQueue));
p->data = x; //存入数据
p->next = NULL;
if(Q->rear !=NULL) {
Q->rear->next = p;
}
Q->rear = p;
if(Q->front==NULL){
Q->front = p;
}
}
/*============================出队=============================*/
int QueueDelete(LQueue *Q, DataType *d){
LQNode *p;
if(Q->front==NULL){
printf("队列为空!\n");
return 0;
} else{
*d = Q->front->data;
p = Q->front;
Q->front = Q->front->next;//出队队列脱链
if(Q->front==NULL){
Q->rear = NULL; //删除最后一个结点
}
free(p);
return 1;
}
}
/*=========================取队头元素===============================*/
int QueueGet(LQueue Q, DataType *d){
if(Q.front==NULL){
printf("队列为空!\n");
return 0;
}else{
*d = Q.front->data;
return 1;
}
}
/*============================摧毁队列===============================*/
void Destroy(LQueue Q){
LQNode *p,*p1;
p = Q.front;
while(p!=NULL){
p1 = p;
p = p->next;
free(p1);
}
}