队列(queue)是一种 先进先出(First In First Out, FIFO) 的线性表。
链队列的C语言实现
头函数
#include<stdio.h>
#include<stdlib.h>
//结果函数状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status;// Status--函数的类型,其值是函数结果的状态代码
typedef int QElemType;
typedef struct Qnode //定义链队列节点
{
QElemType data;
struct Qnode *next;
}QNode, *QueuePtr;
typedef struct //定义链队列指针
{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
int length; //队列长度
}LinkQueue;
队列初始化
Status InitLinkQueue(LinkQueue *Q) //队列初始化
{
Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode)); //分配内存空间
if(!Q->front) exit(OVERFLOW);
Q->front->next = NULL;
Q->length = 0;
return OK;
}
销毁链队列
Status DestoryLinkQueue(LinkQueue *Q) //销毁链队列
{
while(Q->front)
{
Q->rear = Q->front->next; // 利用尾指针进行操作,使尾指针指向头结点的下一节点
free(Q->front); //释放内存
Q->front = Q->rear; // 指向下一节点
}
Q->length = 0;
return OK;
}
清空链队
Status ClearLinkQueue(LinkQueue *Q) //清空链队
{
QNode *p = Q->front;
while(p!=Q->rear)
{
p = p->next;
printf("%d,", p->data);
free(p);
}
Q->length = 0;
Q->rear = Q->front;
return OK;
}
求链队长度
int LengthLinkQueue(LinkQueue Q) //求链队长度
{
return Q.length;
}
输出显示链队
void ShowLinkQueue(LinkQueue Q) //输出显示链队
{
QNode *p = Q.front;
while(p!=Q.rear)
{
p = p->next;
printf("%d,", p->data);
}
printf("\n");
}
入队
Status EnLinkQueue(LinkQueue *Q, QElemType e) //入队
{
QNode *p = (QueuePtr)malloc(sizeof(QNode)); //分配内存空间
if(!p) exit(OVERFLOW); //分配内存失败
p->data = e;
p->next = NULL;
Q->rear->next = p; //将p节点接在链队列尾部
Q->rear = p; //令尾指针指向 p
Q->length++;
return OK;
}
出队
Status DeLinkQueue(LinkQueue *Q, QElemType *e) //出队
{
if(Q->front!=Q->rear) //链队非空
{
QNode *p = Q->front->next;
*e = p->data;
Q->front->next = p->next; //头指针指向下一节点;
if(Q->rear==p) Q->rear = Q->front; //队列中只有一个元素,头结点的下一节点就是尾结点
free(p); //释放内存空间;
Q->length--;
return OK;
}
else return ERROR; //空链队
}
取头结点
Status GetLinkQHead(LinkQueue *Q, QElemType *e) //取头结点
{
if(Q->front!=Q->rear)
{
*e = Q->front->next->data;
return OK;
}
else return ERROR;
}
主函数
int main()
{
Status InitLinkQueue(LinkQueue *Q); //队列初始化
Status DestoryLinkQueue(LinkQueue *Q); //销毁链队列
Status ClearLinkQueue(LinkQueue *Q); //清空链队
int LengthLinkQueue(LinkQueue Q); //求链队长度
void ShowLinkQueue(LinkQueue Q); //输出显示链队
Status EnLinkQueue(LinkQueue *Q, QElemType e); //入队
Status DeLinkQueue(LinkQueue *Q, QElemType *e); //出队
Status GetLinkQHead(LinkQueue *Q, QElemType *e); //取头结点
LinkQueue Q;
QElemType e;
InitLinkQueue(&Q);
int i;
for(i=0;i<5;i++)
{
EnLinkQueue(&Q, i);
}
printf("链队列长度为:%d\n", LengthLinkQueue(Q));
ShowLinkQueue(Q);
DeLinkQueue(&Q, &e);
printf("链队列长度为:%d\n", LengthLinkQueue(Q));
printf("出队元素为:%d\n", e);
ShowLinkQueue(Q);
GetLinkQHead(&Q, &e);
printf("队首元素为:%d\n", e);
ClearLinkQueue(&Q);
printf("链队列长度为:%d\n", LengthLinkQueue(Q));
}