队列的链式存储结构,其实就是线性的单链表,只不过它只是尾进头出而已,把它简称为链队列。
为了操作上的方便,将对头指针指向链队列的头结点,而队尾指针指向终端结点。
#include <iostream>
#define MAX_SIZE 50
using namespace std;
typedef int DataType;
typedef struct _QNode
{
DataType data;
struct _QNode* next;
}QNode;
typedef QNode* QueuePtr;
typedef struct Queue
{
int length;
QueuePtr front;
QueuePtr rear;
}LinkQueue;
//初始化队列
int initQueue(LinkQueue* LQ)
{
if (!LQ) return 0;
LQ->front = LQ->rear = NULL;
LQ->length = 0;
return 1;
}
判断队列是否为满
int isFull(LinkQueue* LQ)
{
if (!LQ) return 0;
if (LQ->length==MAX_SIZE) return 1;
return 0;
}
判断队列是否为空
int isEmpty(LinkQueue* LQ)
{
if (!LQ) return 0;
if (LQ->length == 0) return 1;
return 0;
}
//入队,只能从队尾入
//是否为满,是否为空(front)
int enterQueue(LinkQueue* LQ,DataType data)
{
if (!LQ) return 0;
if (isFull(LQ))
{
cout << "队列已满" << endl;
return 0;
}
QueuePtr tmp = new QNode;
tmp->data = data;
tmp->next = NULL;
if (isEmpty(LQ))
{
LQ->front = LQ->rear = tmp;
}
else
{
LQ->rear->next = tmp;
LQ->rear = tmp;
}
LQ->length++;
return 1;
}
//出队,只能从头出
int deleteQueue(LinkQueue* LQ, DataType* data)
{
if (!LQ || isEmpty(LQ)) {
cout << "队列为空" << endl;
return 0;
}
QueuePtr tmp = NULL;
tmp = LQ->front;
LQ->front = tmp->next;
if (!LQ->front) LQ->rear = NULL;
delete tmp;
LQ->length--;
return 1;
}
//打印
void printQueue(LinkQueue* LQ)
{
if (!LQ) return ;
QueuePtr tmp;
tmp = LQ->front;
while (tmp)
{
cout <<tmp->data <<"\t";
tmp = tmp->next;
}
cout << endl;
}
//获取队首元素,不出队
int getHead(LinkQueue* LQ, DataType* data)
{
if (!LQ || isEmpty(LQ)) {
cout << "队列为空" << endl;
return 0;
}
*data = LQ->front->data;
return 1;
}
//清空队列
void clearQueue(LinkQueue* LQ)
{
if (!LQ) return;
while (LQ->front)
{
QueuePtr tmp = LQ->front;
LQ->front = tmp->next;
delete tmp;
}
LQ->front = LQ->rear = NULL;
LQ->length = 0;
}
int getLength(LinkQueue* LQ)
{
if (!LQ) return 0;
return LQ->length;
}
int main()
{
LinkQueue* LQ = new LinkQueue;
DataType data;
if (initQueue(LQ))cout << "队列初始化成功" << endl;
if (isEmpty(LQ))cout << "队列为空" << endl;
for (int i = 0; i < 10; i++)
{
enterQueue(LQ, i);
}
printQueue(LQ);
deleteQueue(LQ,&data);
printQueue(LQ);
system("pause");
return 0;
}