目录
定义链式队列(不带头结点)的基本结构
/*0.定义链式队列的基本结构*/
typedef struct LinkNode { //链式队列结点
ElemType data;
struct LinkNode* next;
}LinkNode;
typedef struct { //链式队列
LinkNode* front, * rear; //队列的队头和队尾指针
}LinkQueue;
1.初始化
/*1.初始化链式队列(不带头结点)*/
void InitQueue(LinkQueue& Q)
{//初始时,front、rear都指向NULL
Q.front = NULL;
Q.rear = NULL;
}
2.判空
/*2.判断队列是为空(不带头结点)*/
Status IsEmpty(LinkQueue Q)
{
if (Q.front == NULL)
return true;
else
return false;
}
3.入队
/*3.入队(不带头结点)*/
Status EnQueue(LinkQueue& Q, ElemType x)
{
LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
if (s == NULL)
return false;
s->data = x;
s->next = NULL;
if (Q.front == NULL) //在空的队列中插入第一元素
{ //不带头结点的队列,第一个元素入队时需要特别处理
Q.front = s; //修改队头队尾指针
Q.rear = s;
}
else
{
Q.rear->next = s; //新结点插入到rear之后
Q.rear = s; //修改表尾指针
}
return true;
}
4.出队
/*4.出队(不带头结点)*/
Status DeQueue(LinkQueue& Q, ElemType& x)
{
if (Q.front ==NULL)
return false; //空队
LinkNode* p = Q.front; //p指向此次出队的结点
x = p->data; //用变量x返回队头元素
Q.front = p->next; //修改front指针
if (Q.rear == p) //此次是最后一个结点出队
{
Q.front = NULL; //front指向NULL
Q.rear = NULL; //rear指向NULL
}
free(p); //释放结点空间
return true;
}
完整代码
/*实现不带头结点的链式队列*/
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef bool Status;
/*0.定义链式队列的基本结构*/
typedef struct LinkNode { //链式队列结点
ElemType data;
struct LinkNode* next;
}LinkNode;
typedef struct { //链式队列
LinkNode* front, * rear; //队列的队头和队尾指针
}LinkQueue;
/*1.初始化链式队列(不带头结点)*/
void InitQueue(LinkQueue& Q)
{//初始时,front、rear都指向NULL
Q.front = NULL;
Q.rear = NULL;
}
/*2.判断队列是为空(不带头结点)*/
Status IsEmpty(LinkQueue Q)
{
if (Q.front == NULL)
return true;
else
return false;
}
/*3.入队(不带头结点)*/
Status EnQueue(LinkQueue& Q, ElemType x)
{
LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
if (s == NULL)
return false;
s->data = x;
s->next = NULL;
if (Q.front == NULL) //在空的队列中插入第一元素
{ //不带头结点的队列,第一个元素入队时需要特别处理
Q.front = s; //修改队头队尾指针
Q.rear = s;
}
else
{
Q.rear->next = s; //新结点插入到rear之后
Q.rear = s; //修改表尾指针
}
return true;
}
/*4.出队(不带头结点)*/
Status DeQueue(LinkQueue& Q, ElemType& x)
{
if (Q.front == NULL)
return false; //空队
LinkNode* p = Q.front; //p指向此次出队的结点
x = p->data; //用变量x返回队头元素
Q.front = p->next; //修改front指针
if (Q.rear == p) //此次是最后一个结点出队
{
Q.front = NULL; //front指向NULL
Q.rear = NULL; //rear指向NULL
}
free(p); //释放结点空间
return true;
}
int main()
{
LinkQueue Q;
ElemType x = -1;
InitQueue(Q);
EnQueue(Q, 3);
EnQueue(Q, 6);
EnQueue(Q, 8);
EnQueue(Q, 9);
EnQueue(Q, 7);
EnQueue(Q, 5);
for (int i = 1; i < 6; i++)
{
DeQueue(Q, x);
printf("%d\n", x);
}
if (IsEmpty(Q))
{
printf("队列为空\n");
}
else
{
printf("队列非空\n");
}
return 0;
}