参考书目:《数据结构(C语言版)》,严蔚敏
common.h
#ifndef _COMMON_H_
#define _COMMON_H_
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
//Status Equal(int a, int b);
#endif
queue.h
#ifndef _QUEUE_H_
#define _QUEUE_H_
typedef int QElemType;
//单链队列,队列的链式存储结构
typedef struct QNode_
{
QElemType data;
struct QNode_ *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
Status InitQueue(LinkQueue *Q);
//初始化指定的队列,使之成为一个空队列
Status EnQueue(LinkQueue *Q,QElemType e);
//插入元素e为Q的新的队尾元素
Status QueueScanf(LinkQueue *Q);
//向指定的队列输入数据,约定当输入0时结束,且不将0存入队列。
Status QueueDisp(LinkQueue *Q);
//显示整个队列中的元素
Status DeQueue(LinkQueue *Q,QElemType *e);
//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
int QueueLength(LinkQueue *Q);
//返回指定队列的元素个数,即为队列的长度
Status DestroyQueue(LinkQueue *Q);
//销毁指定队列
#endif
queue.c
#include "stdio.h"
#include "stdlib.h"
#include "common.h"
#include "queue.h"
/*
输入参数:*Q 待初始化的队列
返回参数:OVERFLOW 存储分配失败
OK 成功
函数功能:初始化指定的队列,使之成为一个空队列
*/
Status InitQueue(LinkQueue *Q)
{
Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
if(!Q->front)
exit(OVERFLOW);
Q->front->next = NULL;
return OK;
}
/*
输入参数:*Q 待插入的队列
e 待插入的数据
返回参数:OVERFLOW 存储分配失败
OK 成功
函数功能:插入元素e为Q的新的队尾元素
*/
Status EnQueue(LinkQueue *Q,QElemType e)
{
QueuePtr p = NULL;
p = (QueuePtr)malloc(sizeof(QNode));
if(!p)
exit(OVERFLOW);
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
return OK;
}
/*
输入参数:*Q 待处理的队列
返回参数:OVERFLOW 存储分配失败
OK 成功
函数功能:向指定的队列输入数据,约定当输入0时结束,且不将0存入队列
*/
Status QueueScanf(LinkQueue *Q)
{
//QNode *newQNode = NULL;
QueuePtr newQNode = NULL;
QElemType newdat;
scanf("%d",&newdat);
while(newdat)
{
newQNode = (QueuePtr)malloc(sizeof(QNode));
if(!newQNode)
return OVERFLOW;
newQNode->data = newdat;
newQNode->next = NULL;
Q->rear->next = newQNode;
Q->rear = newQNode;
scanf("%d",&newdat);
}
return OK;
}
/*
输入参数:*Q 待显示的队列
返回参数: OK 操作成功
函数功能:显示整个队列中的元素
*/
Status QueueDisp(LinkQueue *Q)
{
QueuePtr p;
p = Q->front->next;
printf("\n>>>>>>>>>>>>>>> output start >>>>>>>>>>>>>>>\n");
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n<<<<<<<<<<<<<<< output end <<<<<<<<<<<<<<<\n");
return OK;
}
/*
输入参数:*Q 待处理的队列
*e 待返回的队头元素
返回参数:ERROR 指定的队列为空
OK 操作成功
函数功能:若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
*/
Status DeQueue(LinkQueue *Q,QElemType *e)
{
QueuePtr p;
if(Q->front == Q->rear)
{
return ERROR;
}
p = Q->front->next;
*e = p->data;
Q->front->next = p->next;
if(Q->rear == p)
{
Q->rear = Q->front;
}
free(p);
return OK;
}
/*
输入参数:*Q 待处理的队列
返回参数:指定队列的长度
函数功能:返回指定队列的元素个数,即为队列的长度
*/
int QueueLength(LinkQueue *Q)
{
int len=0;
QueuePtr p;
p = Q->front->next;
while(p)
{
len++;
p = p->next;
}
return len;
}
/*
输入参数:*Q 待销毁队列
返回参数:OK 操作成功
函数功能:销毁指定队列
*/
Status DestroyQueue(LinkQueue *Q)
{
while(Q->front)
{
Q->rear = Q->front->next;
free(Q->front);
Q->front = Q->rear;
}
return OK;
}
main.c
//队列的链式表示和实现
#include "common.h"
#include "stdio.h"
#include "queue.h"
int main()
{
QElemType head;
LinkQueue queue;
InitQueue(&queue);
EnQueue(&queue,4);
QueueScanf(&queue);
QueueDisp(&queue);
DeQueue(&queue,&head);
QueueDisp(&queue);
printf("Specified Queue length is %d\n",QueueLength(&queue));
DestroyQueue(&queue);
}