//链队列的实现
//设置一个头结点,初始的时候头指针和尾指针都指向队列头节点~
#include <stdio.h>
#include <stdlib.h>
#define Status int
#define QElemType int
#define INIT_SIZE 100
#define INCREMENT 10
#define OK 1
#define ERROR 0
//链表队列节点类型
typedef struct QNode {
QElemType data;
struct QNode * next;
}QNode;
//链表队列类型
typedef struct{
QNode *front;//指向链表的对头节点,用来删除
QNode *rear;//指向链表的队尾节点,用来插入
}LinkQueue;
//初始化一个队列
Status InitQueue (LinkQueue *Q)
{
//让队头指针合队尾指针均指向头结点
Q->front = Q->rear = (QNode *)malloc(sizeof(QNode ));//生成一个头结点类型
if(!Q->front)
{
printf("队列初始化失败:内存分配失败\n");
return ERROR;
}
return OK;
}
//销毁一个队列
Status DestroyQueue(LinkQueue * Q)
{
while(Q->front)//如果Q->front 不为空
{
Q->rear=Q->front->next;
free(Q->front);
Q->front=Q->rear;
}
return OK;
}
//判断是否为空队列,如果是空队列,则返回OK,如果不是空队列,则返回ERROR
Status QueueEmpty(LinkQueue *Q)
{
if(Q->rear==Q->front)//如果对头指针和队尾指针相同则是空队列,头指针始终指向头节点
return OK;
return ERROR;
}
//向队列中插入元素
Status EnQueue(LinkQueue *Q,QElemType e)
{
QNode *s=(QNode *)malloc(sizeof(QNode));
if(!s)
return ERROR;
s->data=e;
s->next=NULL;
Q->rear->next=s;
Q->rear=s;
return OK;
}
//从队列中删除元素,并将元素值存放在e中
Status DeQueue(LinkQueue *Q,QElemType *e)
{
if(Q->front==Q->rear)//队列为空
return ERROR;
QNode *s=Q->front->next;//令s指向队列的对头节点
*e=s->data;
Q->front->next=s->next;
if(Q->rear==s)//如果只有一个元素
Q->rear=Q->front;
free(s);
return OK;
}
//返回队列的长度
Status QueueLength(LinkQueue *Q)
{
int length=0;
QNode *s=Q->front->next;
while(s)
{
length++;
s=s->next;
}
return length;
}
//返回队列的第一个元素
QNode* GetHead(LinkQueue *Q)
{
QNode *s=Q->front->next;
return s;
}
//打印输出整个队列
Status PrintQueue(LinkQueue *Q)
{
if(Q->front==Q->rear)//如果队列为空
return ERROR;
QNode *s=Q->front->next;
while(s)
{
printf("%d ",s->data);
s=s->next;
}
printf("\n");
return OK;
}
int main()
{
LinkQueue *Q=(LinkQueue *)malloc(sizeof(LinkQueue));
InitQueue(Q);
EnQueue(Q,3);
EnQueue(Q,5);
EnQueue(Q,8);
EnQueue(Q,14);
EnQueue(Q,7);
PrintQueue(Q);
QElemType *e=(QElemType *)malloc(sizeof(QElemType));
DeQueue(Q,e);
printf("%d\n",*e);
DeQueue(Q,e);
printf("%d\n",*e);
PrintQueue(Q);
return 0;
}
链队列中需要特别注意的地方就是:删除操作的时候,如果队列中恰好只有一个元素的话,那么删除该元素也会删除队尾指针,所以这个操作需要提前判断队列中是不是只有一个元素~