linkQueue.h
个人笔记
#include <errno.h>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#define Error(module) fprintf(stderr,"error:"#module"\n")
//实现指针节点
typedef struct qnode *qlink;
typedef struct qnode {
QItem element;
qlink next;
}Qnode;
//实现队列
typedef struct lque *Queue;
typedef struct lque {
qlink front;
qlink rear;
}Lqueue;
qlink NewNode() { //新增节点,节点类型为指针型
qlink q;
if( (q = malloc(sizeof(Qnode)))==0 ) {
Error("Exhausted memory.");
} else {
return q;
}
}
Queue QueueInit() {
Queue Q = malloc(sizeof(*Q));
Q->front = Q->rear = 0;
return Q;
}
int QueueIsEmpty(Queue Q) {
return Q->front == 0;
}
int QueueMemFull() {
qlink q;
if( (q = malloc(sizeof(Qnode)))==0 )
return 1;
else {
free(q);
return 0;
}
}
int QueueFull(Queue Q) {
return QueueMemFull();
}
QItem QueueFirst(Queue Q) {
if( QueueIsEmpty(Q) ) {
Error("Queue is empty.");
}
else {
return Q->front->element;
}
}
QItem QueueLast(Queue Q) {
if( QueueIsEmpty(Q) ) {
Error("Queue is empty.");
} else
return Q->rear->element;
}
void QueueEnter(QItem x, Queue Q) {
qlink p;
p = NewNode();
p->element = x;
p->next = 0;
if( Q->front ) { //队列非空
Q->rear->next = p;
} else { //空队列
Q->front = p;
}
Q->rear = p;
}
QItem QueueDeleteFirst(Queue Q){
QItem x;
qlink q;
if( QueueIsEmpty(Q) ) {
Error("Queue is empty.");
} else {
x = Q->front->element;
q = Q->front;
Q->front = Q->front->next;
free(q);
return x;
}
}
void QueueTraverse(Queue Q, void(*visit)(QItem e)) {
qlink p=Q->front;
while(p!=NULL) {
visit(p->element);
p = p->next;
}
}