/*----------------------------------------------------------------
* 设立一个队首指针front ,一个队尾指针rear ,分别指向队首和队尾元素。
* ◆ 初始化:LQ->front = LQ->rear = NULL;将队列的尾指针和头指针置空,
* 由于不带头结点,所有不需要为头结点开辟空间
* ◆ 判断队列是否为空:LQ->front == NULL
* ◆ 队满:链式队列的结点是动态开辟的,一般情况下不存在队满
* ◆ 入队:将新结点插入rear所指下一个结点,然后rear指向新插入的结点
* ◆ 出队:删去front所指的元素,并返回被删元素。
* ◆ 取队头元素:返回队头元素的值 return *data = LQ->front->_data;
* ◆ 清空队列:从头结点开始,依次销毁结点的空间
* ◆ 打印队列中的元素:pCur指向头结点,打印pCur指向的结点元素,pCur
* 后移直到pCur==NULL
------------------------------------------------------------------*/
/* 不带头结点的队列实现源代码*/
/*----------------------------------------------------------------*/
#include <stdio.h>
#include <Windows.h>
#include <stdlib.h>
#include <assert.h>
typedef int DataType;
typedef struct Node
{
DataType _data;
struct Node* _next;
}LinkQueueNode;
typedef struct
{
LinkQueueNode* front;
LinkQueueNode* rear;
}LinkQueue;
//初始化链队列
void InitLinkQueue(LinkQueue* LQ)
{
LQ->front = LQ->rear = NULL;
}
//判断队列是否为空,如果队列为空返回1,否则返回0
int IsEmpty(LinkQueue* LQ)
{
if (LQ->front == NULL)
{
return 1;
}
else
{
return 0;
}
}
//入队操作
void EnterQueue(LinkQueue* LQ, DataType data)
{
LinkQueueNode* pNewNode = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
assert(pNewNode);
pNewNode->_data = data;
pNewNode->_next = NULL;
//如果队列为空,则是头指针和尾指针都指向要插入的结点
if (IsEmpty(LQ))
{
LQ->front = pNewNode;
LQ->rear = pNewNode;
return;
}
LQ->rear->_next = pNewNode;
LQ->rear = pNewNode;
}
//出队操作
int DeleteQueue(LinkQueue* LQ,DataType* data)
{
if (IsEmpty(LQ))
{
printf("队列为空!\n");
return 0;
}
LinkQueueNode* pDel;
//出队是对队头,进行操作使pDel指向队头指针
pDel = LQ->front;
//将要出队的元素值赋给data
*data = pDel->_data;
LQ->front->_next = pDel->_next;
LQ->front = pDel->_next;
//释放pDel指向的空间
free(pDel);
return *data;
}
//取队头元素
int GetHead(LinkQueue* LQ,DataType* data)
{
if (IsEmpty(LQ))
{
printf("队列为空!\n");
return 0;
}
//将队头元素的值赋给data
*data = LQ->front->_data;
//返回队头元素值
return *data;
}
//打印队列中的元素
void PrintLinkQueue(LinkQueue* LQ)
{
assert(LQ);
//pCur指向队头
LinkQueueNode* pCur = LQ->front;
while (pCur)
{
//打印pCur指向的结点值
printf("%-3d", pCur->_data);
//pCur指针后移
pCur = pCur->_next;
}
printf("\n");
}
//清空队列,销毁队列中结点的空间
void ClearQueue(LinkQueue* LQ)
{
while (LQ->front != NULL)
{
//队尾指针指向队头指针指向的下一个结点
LQ->rear = LQ->front->_next;
//释放队头指针指向的结点
free(LQ->front);
//队头指针指向队尾指针
LQ->front = LQ->rear;
}
}
int main()
{
LinkQueue LQ;
DataType data;
InitLinkQueue(&LQ);
printf("1,2,3,5,7,8,10,15依此入队\n");
EnterQueue(&LQ, 1);
EnterQueue(&LQ, 2);
EnterQueue(&LQ, 3);
EnterQueue(&LQ, 5);
EnterQueue(&LQ, 7);
EnterQueue(&LQ, 8);
EnterQueue(&LQ, 10);
EnterQueue(&LQ, 15);
printf("\n");
printf("队列中的元素为:");
PrintLinkQueue(&LQ);
printf("\n");
data = GetHead(&LQ, &data);
printf("队头元素为:%d\n", data);
printf("\n");
printf("队头元素第一次出队:\n");
data = DeleteQueue(&LQ,&data);
printf("出队的元素为:%d\n", data);
printf("\n");
printf("\n");
printf("队头元素第二次出队:\n");
data = DeleteQueue(&LQ, &data);
printf("出队的元素为:%d\n", data);
printf("\n");
printf("队列中的元素为:");
PrintLinkQueue(&LQ);
data = GetHead(&LQ, &data);
printf("队头元素为:%d\n", data);
printf("\n");
printf("20入队\n");
EnterQueue(&LQ, 20);
printf("25入队\n");
EnterQueue(&LQ, 25);
printf("\n");
printf("队列中的元素为:");
PrintLinkQueue(&LQ);
ClearQueue(&LQ);
system("pause");
return 0;
}
运行结果
1,2,3,5,7,8,10,15依此入队
队列中的元素为:1 2 3 5 7 8 10 15
队头元素为:1
队头元素第一次出队:
出队的元素为:1
队头元素第二次出队:
出队的元素为:2
队列中的元素为:3 5 7 8 10 15
队头元素为:3
20入队
25入队
队列中的元素为:3 5 7 8 10 15 20 25
请按任意键继续. . .