【C数据结构】非循环队列和循环队列(链表与顺序表实现)

本文详细介绍了队列的概念和特性,包括先进先出的原则,并展示了非循环队列和循环队列的实现,涵盖了单链表和顺序表两种数据结构。在单链表实现中,队列的初始化、入队、出队、查看队头和队尾以及计算队列长度等操作得到了实现。而在顺序表实现中,特别讨论了扩容和循环的效果。最后,文章探讨了循环队列的实现,包括链表和顺序表的循环逻辑,以及如何处理队列的满和空状态。

1、认识队列

在这里插入图片描述

队列的一大特点就是先进先出,后如后出。队列是有序的,从头出,从尾入。

一个很形象的应用就是医院的挂号机,有序的每次叫队列队头的号码,机器每次从记录的队尾加数据。

2、队列实现

一个队列需要实现的操作如下。

  1. 入队
  2. 出队
  3. 查看队头
  4. 查看队尾
  5. 计算队长度

结构的选择有顺序表和链表,从优缺点来看。

  1. 入队,顺序表和链表尾插的效率都一样,但在空间上链表更好,不会浪费空间。
  2. 出队,顺序表头删的效率低于链表头删的效率。
  3. 查看队头,都比较容易。
  4. 查看队尾,顺序表比较容易,链表需要遍历在尾部查看,如果没有建立尾指针的话。
  5. 计算对长度,顺序表本身记录了,链表需要遍历计算。

似乎都有自己擅长的领域,那么都实现一遍吧。

3、非循环队列单链表写法

3.1、测试页和头文件

为了在实现一些功能上更加的便利,在创建队列的结构体中创建头尾指针变量,以及一个size记录长度。

头文件中

//Queue.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

typedef int QDataType;

typedef struct QueueNode 
{
   
   
	struct QueueNode* next;
	QDataType data;
}QueueNode;

//队列结构体 有效避免二级指针
typedef struct Queue 
{
   
   
	QueueNode* front;
	QueueNode* tail;
	int size;
}Queue;

//初始化队列
void QueueInit(Queue* pq);

//销毁队列
void QueueDestroy(Queue* pq);

//入队
void QueuePush(Queue* pq, QDataType x);

//出队
void QueuePop(Queue* pq);

//返回队头数据
QDataType QueueFront(Queue* pq);

//返回队尾数据
QDataType QueueBack(Queue* pq);

//队列大小
int QueueSize(Queue* pq);

//判空
bool QueueEmpty(Queue* pq);

测试文件中

//Test.c
#include"Queue.h"
void QueueTest1() 
{
   
   
	Queue p;
	QueueInit(&p);
	QueuePush(&p, 1);
	QueuePush(&p, 2);
	QueuePush(&p, 3);
	///*QueuePop(&p);
	//QueuePop(&p);
	//QueuePop(&p);*/
	printf("%d\n", QueueSize(&p));
	while (!QueueEmpty(&p))
	{
   
   
		printf("%d ",QueueFront(&p));
		QueuePop(&p);
	}
	QueueDestroy(&p);
}


int main() 
{
   
   
	QueueTest1();
	return 0;
}

3.2、接口函数的实现

队列的函数实现比较容易

#include"Queue.h"

//初始化队列
void QueueInit(Queue* pq)
{
   
   
	assert(pq);

	pq->front = NULL;
	pq->tail = NULL;
	pq->size = 0;
}

//销毁队列
//从头到尾一次一个结点销毁
void QueueDestroy(Queue* pq)
{
   
   
	assert(pq);
	QueueNode* p = pq->front;
	while (p)
	{
   
   
		QueueNode* cur = p;
		p = p->next;
		free(cur);
	}
	pq->front = NULL;
	pq->tail = NULL;
	pq->size = 0;
}

//入队
void QueuePush(Queue* pq, QDataType x)
{
   
   
	assert(pq);
	
	//先创建新结点
	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	if (newnode == NULL)
	{
   
   
		perror("malloc fail");
		exit(-1);
	}
	newnode
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值