队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的性质
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头
创建队列
typedef struct QueueNode
{
struct QueueNode* next;
int data;
}QueueNode;
typedef struct Queue
{
QueueNode* front; // 队头
QueueNode* rear; // 队尾
}Queue;
功能实现
初始化
初始化只需将头指针front和尾指针rear指向NULL。
void Queue_init(Queue* pq)//初始化
{
pq->rear = pq->front= NULL;
}
当队列里只有一个数据时,头指针front和尾指针rear指向同一个节点
如下图:
入队
队列具有先入先出的性质,故而入队操作只能是尾插数据,让尾指针rear指向的节点的指针域指向入队节点,并使尾指针rear指向入队节点。尾指针rear始终指向队列内最后一个节点。如下图:
void push_back(Queue* pq, int data) //入队
{
QueueNode* tem= (QueueNode*)malloc(sizeof(QueueNode)) ;
tem->data = data;
tem->next = NULL;
if (pq->front == NULL)
{
pq->front=pq->rear = tem; //入队第一个元素,对头队尾指向同一个节点
}
else
{
pq->rear->next = tem; //后面的元素一次接在上一个元素后面
pq->rear = tem; //尾指针后移
}
}
出队
同样的道理,出队只能出队首节点,即头指针front指向的节点,将其指针域指向NULL,并使front指针后移。如下图:
void pop_front(Queue* q)//出队
{
if ((q->front == q->rear)&&(q->rear ==NULL))//队头队尾指向一个同一个节点时表示没有元素
{
return;
}
QueueNode *p = q->front;
q->front = q->front->next;//头指针后移
free(p);
p->next = NULL;
p = NULL;
if (q->front == NULL)
{
q->rear = NULL;
}
}
全部代码
#include<stdio.h>
#include<stdlib.h>
typedef struct QueueNode
{
struct QueueNode* next;
int data;
}QueueNode;
typedef struct Queue
{
QueueNode* front; // 队头
QueueNode* rear; // 队尾
}Queue;
void QueueInit(Queue* pq)//初始化
{
pq->rear = pq->front= NULL;
}
void push_back(Queue* pq, int data) //入队
{
QueueNode* tem= (QueueNode*)malloc(sizeof(QueueNode)) ;
tem->data = data;
tem->next = NULL;
if (pq->front == NULL)
{
pq->front=pq->rear = tem; //入队第一个元素,对头队尾指向同一个节点
}
else
{
pq->rear->next = tem; //后面的元素一次接在上一个元素后面
pq->rear = tem; //尾指针后移
}
}
void pop_front(Queue* q)//出队
{
if ((q->front == q->rear)&&(q->rear ==NULL))//队头队尾指向一个同一个节点时表示没有元素
{
return;
}
QueueNode *p = q->front;
q->front = q->front->next;//头指针后移
p->next = NULL;
if (q->front == NULL)
{
q->rear = NULL;
}
}
int Queue_front(Queue* pq) //返回队头
{
return pq->front->data;
}
void print(Queue* pq)//显示队内元素
{
QueueNode *tem = pq->front;
for (; tem; tem = tem->next)
{
printf("%d ", tem->data);
}
printf("\n");
}
int Queue_empty(Queue* pq)//判断队列是否为空,为空返回NULL
{
return pq->front;
}
int main()
{
Queue pq;
Queue_init(&pq);
push_back(&pq,4);
push_back(&pq, 5);
push_back(&pq, 6);
push_back(&pq, 7);
print(&pq);
pop_front(&pq);
printf("%d\n", Queue_front(&pq));
print(&pq);
system("pause");
return 0;
}