系列文章传送门:
数据结构与算法之树和二叉树(一):二叉树基本操作的实现及应用
数据结构与算法之线性表(二):链式表的实现和应用
数据结构与算法之线性表(三):顺序栈的实现和应用
数据结构与算法之线性表(四):链式栈的实现和应用
数据结构与算法之线性表(五):链式队列的实现和应用
数据结构与算法之线性表(六):顺序队列及循环队列的实现和应用
一.链式队列基本操作实现(所有代码均在Embarcadero DevC++6.0和VSCode 2021上编译运行通过)
#include<stdio.h>
#include<stdlib.h>
#define QElemType int
#define Status int
#define OVERFLOW -1
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef struct QNode
{
QElemType data; //定义队列结点
struct QNode *next;
}QNode, *QueuePtr;
typedef struct //定义队首和队尾指针
{
QueuePtr front; //头尾指针
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue &Q)
{
Q.front = (QueuePtr)malloc(sizeof(QNode)); //为首尾指针申请空间
Q.rear = (QueuePtr)malloc(sizeof(QNode));
Q.front->next=NULL;
Q.rear = Q.front;
return OK;
}
Status GetHead(LinkQueue Q, QElemType &e)
{
e = Q.front->next->data;
return OK;
}
Status QueueEmpty(LinkQueue Q)
{
if(Q.front==Q.rear)
return OK;
else
return FALSE;
}
Status EnQueue(LinkQueue &Q, QElemType e)
{
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(!p)
exit(OVERFLOW);
Q.rear->next = p;
p->data = e;
Q.rear = p; //尾部指针后移
p->next = NULL;
return OK;
}
Status DeQueue(LinkQueue &Q, QElemType &e)
{
if(Q.front==Q.rear)//若队列为空,出队失败
return ERROR;
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(Q.front->next==Q.rear)//若删除的元素是队尾元素
{
p = Q.front->next;
e = p->data ; //e来接盘
Q.rear = Q.front; //队首队尾指针都指向头结点
free(p);
}
else
{
p = Q.front->next;
Q.front->next = p->next;
e = p->data ; //e来接盘
free(p);
}
return OK;
}
Status QueueLength(LinkQueue Q)
{
int count;
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
p = Q.front->next;
while (p)
{
count++;
p = p->next;
}
return OK;
}
Status ClearQueue(LinkQueue &Q)
{
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(!p)
exit(OVERFLOW);
while (Q.front->next)
{
p = Q.front->next;
Q.front = p->next;
free(p);
}
Q.rear = Q.front;
return OK;
}
// QueueTraverse(Q, Visit());
Status DestroyQueue(LinkQueue &Q)
{
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(!p)
exit(OVERFLOW);
while (Q.front->next)
{
p = Q.front->next;
Q.front = p->next;
free(p);
}
free(Q.front);
free(Q.rear);
return OK;
}
Status QueueTraverse(LinkQueue Q, Status (*Visit)(QElemType))
{
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(!p)
exit(OVERFLOW);
p = Q.front->next;
while (p)
{
if(!Visit(p->data))
return ERROR;
p = p->next;
}
return OK;
}
Status print(QElemType e)
{
printf("%d->",e);
return OK;
}
int main()
{
QElemType e;
LinkQueue Q;
InitQueue(Q);
for (int i = 1; i <= 10; i++)
{
EnQueue(Q,i);
}
DeQueue(Q,e);
QueueTraverse(Q,print);
return 0;
}