链队列,即队列的链式存储结构,它是仅在表头删除和表尾插入的单链表,因此一个链队列需要设置两个分别指示队头元素和队尾元素的指针,为了操作方便,给链队列添加一个头结点,并令队头指针指向头结点,由此,空的链队列的判断条件就是队头指针和队尾指针均指向头结点。
//链队列类型描述
typedef int QElemType;
typedef struct node{
QElemType data;
struct node *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;//链队列的初始化(带头结点)
void Init_LinkQueue(LinkQueue *Q){
QueuePtr head = (QueuePtr)malloc(sizeof(QNode));
if(!head)
exit(OVERFLOW);
head->next = NULL;
Q->front = Q->rear = head;
}
//销毁链队列
void Destroy_LinkQueue(LinkQueue *Q){
//从头结点开始释放链队列中所有的结点
while(Q->front){
Q->rear = Q->front->next;
free(Q->front);
Q->front = Q->rear;
}
}//清空链队列
void Clear_LinkQueue(LinkQueue *Q){
Destroy_LinkQueue(Q);
Init_LinkQueue(Q);
}//判断链队列是否为空
int IsEmpty_LinkQueue(LinkQueue *Q){
return Q->front == Q->rear;
}//求链队列的长度
int GetLength_LinkQueue(LinkQueue *Q){
int count = 0;
//指向存放数据的第一个结点
QueuePtr p = Q->front->next;
while(p){
count++;
p = p->next;
}
return count;
}//取得链队列的头部元素
void GetHead_LinkQueue(LinkQueue *Q,QElemType *x){
if(IsEmpty_LinkQueue(Q)){
printf("链队列为空!\n");
exit(0);
}
else{
*x = Q->front->next->data;
}
}//取得链队尾的头部元素
void GetRear_LinkQueue(LinkQueue *Q,QElemType *x){
if(IsEmpty_LinkQueue(Q)){
printf("链队列为空!\n");
exit(0);
}
else{
*x = Q->rear->data;
}
}//入链队列
void En_LinkQueue(LinkQueue *Q,QElemType x){
QueuePtr q = (QueuePtr)malloc(sizeof(QNode));
if(!q)
exit(OVERFLOW);
q->data = x;
q->next = NULL;
Q->rear->next = q;
Q->rear = q;
}
//出链队列
void De_LinkQueue(LinkQueue *Q,QElemType *x){
QueuePtr q;
if(IsEmpty_LinkQueue(Q)){
printf("链队列为空!\n");
exit(0);
}
else{
*x = Q->front->next->data;
q = Q->front->next;
*x = q->data;
Q->front->next = q->next;
//删除元素后队列为空
if(q->next == NULL)
Q->rear = Q->front;
free(q);
}
}//输出链队列
void Print_LinkQueue(LinkQueue *Q){
//p指向头结点的下一个结点,即存放数据的第一个结点
QueuePtr p = Q->front->next;
if(IsEmpty_LinkQueue(Q)){
printf("链队列为空!\n");
exit(0);
}
else{
while(p){
printf("%d\t",p->data);
p = p->next;
}
printf("\n");
}
}
原文地址:http://blog.csdn.net/jesson20121020/article/details/39460423