简介
采用链式存储结构实现的队列。 通常采用单链表来实现,因此结构与单链表类似。
由于队列的插入和删除操作分别在表的两端进行,所以需要两个分别指向对头和队尾的指针,即队头指针front和队尾指针rear。
链队的基本操作
初始化
typedef char ElemType;
typedef struct DataNode {
ElemType data;
struct DataNode *next;
} DataNode;//链队数据结点类型
typedef struct {
DataNode *front;
DataNode *rear;
} LinkQuNode;//链队类型
void InitQueue(LinkQuNode *&q) {
q = (LinkQuNode *) malloc(sizeof(LinkQuNode));
q->front = q->rear = NULL;
}
销毁
void DestroyQueue(LinkQuNode *&q) {
DataNode *p = q->front, *r;//p指向队头数据结点
if (p != NULL) {//释放数据结点占用空间
r = p->next;
while (r != NULL) {
free(p);
p = r;
r = p->next;
}
}
free(p);
free(q);//释放链队结点占用空间
}
判断是否为空
bool QueueEmpty(LinkQuNode *q) {
return (q->rear == NULL);
}
进队
void enQueue(LinkQuNode *&q, ElemType e) {
DataNode *p;
p = (DataNode *) malloc(sizeof(DataNode));
p->data = e;
p->next = NULL;
if (q->rear == NULL)//若链队为空,则新结点是队首结点又是队尾结点
q->front = q->rear = p;
else {
q->rear->next = p;//将p结点链到队尾,并将rear指向它
q->rear = p;
}
}
出队
bool deQueue(LinkQuNode *&q, ElemType &e) {
DataNode *t;
if (q->rear == NULL)//队列为空
return false;
t = q->front;//t指向第一个数据结点
if (q->front == q->rear)//队列中只有一个结点时
q->front = q->rear = NULL;
else//队列中有多个结点时
q->front = q->front->next;
e = t->data;
free(t);
return true;
}
编写测试
int main(){
ElemType e;
LinkQuNode *q;
printf("链队的基本操作如下:\n");
printf("1.初始化链队\n");
InitQueue(q);
printf("2.依次进链队元素a,b,c\n");
enQueue(q,'a');
enQueue(q,'b');
enQueue(q,'c');
printf("3.是否为空?%s\n",QueueEmpty(q)?"空":"非空");
if(deQueue(q,e)==0)
printf("队空,不能出队");
else
printf("4.出队一个元素%c\n",e);
printf("5.依次进链队元素d,e,f\n");
enQueue(q,'d');
enQueue(q,'e');
enQueue(q,'f');
printf("6.出链队序列:");
while (!QueueEmpty(q)){
deQueue(q,e);
printf("%c ",e);
}
printf("\n");
printf("7.释放\n");
DestroyQueue(q);
return 1;
}