LinkQueue CreateQueue(); //新建一个队列
void AddQ(LinkQueue Q,ElementType Data); //进队
ElementType DeleteQ(LinkQueue Q); //出队
int IsEmpty(LinkQueue Q); //队列是否为空
//由于队列的元素的类型不唯一,所以最好设置为ElementType
typedef int ElementType;
//队列的结点
struct qNode{
ElementType Data; //结点储存的数据
struct qNode *Next;
};
typedef struct qNode * QNode;
//队列指针
struct queue{
QNode front; //指向对头结点
QNode rear; //指向队尾结点
};
typedef struct queue *LinkQueue;
LinkQueue CreateQueue()
{
LinkQueue Q;
Q=(LinkQueue)malloc(sizeof(struct queue));
//新建队列的front与rear都为NULL
Q->front=Q->rear=NULL;
return Q;
}
void AddQ(LinkQueue Q,ElementType Data)
{
QNode q;
q=(QNode)malloc(sizeof(struct qNode));
q->Data=Data;
q->Next=NULL;
if(Q->rear == NULL) //当Q->rear为NULL时,表明队列为空,所以front与rear都指向新的结点
{
Q->front = q;
Q->rear = q;
}
else{ //队列不空时,front不变
Q->rear->Next = q; //让q成为当前的尾部节点下一节点
Q->rear= q; //尾部指针指向q
}
}
ElementType DeleteQ(LinkQueue Q)
{
QNode temp;
ElementType Data;
if(Q->front==NULL) //队列为空,return 0
return 0;
if(Q->front==Q->rear){ //如果front=rear 表明队列仅有一个结点,出队后,front与rear都为NULL
Data=Q->front->Data;
Q->front=NULL;
Q->rear=NULL;
}
else{ //front!=rear 则front所指的结点元素出队,front指向出队结点的下一个结点
temp=Q->front;
Data=temp->Data;
Q->front=temp->Next;
free(temp);
}
return Data;
}
int IsEmpty(LinkQueue Q)
{
if(Q->front==NULL)
return 1;
else return 0;
}