链式队列实现代码如下
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define QElemType int
typedef struct QNode{
QElemType data;
struct QNode * next;
}QNode, * QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
void InitQueue(LinkQueue &Q);
bool EnQueue(LinkQueue &Q, QElemType e);
bool DeQueue(LinkQueue &Q, QElemType &e);
void Traverse(LinkQueue Q);
void DestroyQueue(LinkQueue &Q);
void ClearQueue(LinkQueue &Q);
int main (void)
{
QElemType e;
LinkQueue Q;
InitQueue(Q);
EnQueue(Q , 2);
EnQueue(Q , 3);
EnQueue(Q , 4);
EnQueue(Q , 4);
if(DeQueue(Q , e))
{
printf("DeQueue succeed!The element deleted is %d\n",e);
}
Traverse(Q);
// DestroyQueue(Q);
ClearQueue(Q) ;
EnQueue(Q , 2);
EnQueue(Q , 3);
EnQueue(Q , 5);
Traverse(Q);
printf("=======Ending========\n");
return 0;
}
void InitQueue(LinkQueue &Q)
{
//构造一个队列Q
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode)); //队列空时Q.front == Q.rear
if (!Q.front) //存储分配失败
exit(-1);
Q.front->next = NULL;
}
bool EnQueue(LinkQueue &Q, QElemType e)
//插入元素e为Q新的队尾元素
{
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(!p) //除非内存满了,否则不会存在队满的问题
return false;
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return true;
}
bool DeQueue(LinkQueue &Q, QElemType &e)
//若队列不为空则删除Q的对头元素,用e返回其值
{
if(Q.front == Q.rear)
return false;
QueuePtr p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear == p)
Q.rear = Q.front;
free(p);
return true;
}
void Traverse(LinkQueue Q)
{
QueuePtr p = Q.front->next;
while(p != NULL)
{
printf("%d\t",p->data);
p = p->next;
}
printf("\n");
}
void DestroyQueue(LinkQueue &Q)
{
while(Q.front)
{
int i = 0;
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
}
void ClearQueue(LinkQueue &Q)
{
QueuePtr p = Q.front->next;
while(p)
{
int i = 0;
Q.rear = p->next;
free(p);
p = Q.rear;
}
Q.rear = Q.front;
}