数据结构——队列

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的性质
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头

创建队列

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值