链队列,即队列的链式存储结构,它是仅在表头删除和表尾插入的单链表,因此一个链队列需要设置两个分别指示队头元素和队尾元素的指针,为了操作方便,给链队列添加一个头结点,并令队头指针指向头结点,由此,空的链队列的判断条件就是队头指针和队尾指针均指向头结点。
//链队列类型描述 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