队列的基本操作(C语言链表实现)初始化,入队,出队,销毁,读取数据


前言


在这里插入图片描述

提示:以下是本篇文章正文内容,下面案例可供参考
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

一、队列基本变量的了解

在这里插入图片描述

typedef int QDataType;//队列数据类型

typedef struct QueueNode {
	QDataType data;//数据域
	struct QueueNode* next;//指针域
}QNode;//先建立一个结点

typedef struct Queue {
	QNode* head;//头
	QNode* tail;//尾
	int size;//队列数量
}Queue;//将头与尾还有数量封装在一起能更好操作

二、队列的基本操作

2.1队列的初始化(QueueInit)

void QueueInit(Queue* pq) {
	assert(pq);
	pq->head = pq->tail = NULL;
	//刚开始没有数据,所以头尾都为NULL
	pq->size = 0;//数量
}

2.2入队(QueuePush)

在这里插入图片描述

void QueuePush(Queue* pq,QDataType x) {
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL) {
		perror("malloc error");
		return;
	}//判断是否为有效空间
	newnode->data = x;
	newnode->next = NULL;
	//初始化新结点
	if (pq->head == NULL) {
		assert(!pq->tail);
		pq->head = pq->tail = newnode;
		//之所以要分开判断是因为
		//我们也要保证只有一个数据时
		//head与tail指向同一个
		//如果只有else虽然也能够正常插入
		//但是tail一直指向NULL
	}
	else {
		pq->tail->next = newnode;
		//在尾巴后面接上也就是入队
		pq->tail = pq->tail->next;
		//尾巴改变,指向新加入的数据
	}
	pq->size++;//数据+1
}

2.3判断是否为空队(QueueEmpty)

bool QueueEmpty(Queue* pq) {
	assert(pq);
	return pq->size==0;
	//数量为0返回为真,真为空,假为不空
}

2.4出队(QueuePop)

在这里插入图片描述

void QueuePop(Queue* pq) {
	assert(pq);
	assert(!QueueEmpty(pq));
	 
	if (pq->head->next == NULL) {
		free(pq->head);//只有一个元素
		//直接将尾巴与头置空
		pq->head = pq->tail = NULL;
	}
	else {
		QNode* Next = pq->head->next;
		//记录队头下一个结点
		free(pq->head);
		//释放队头
		pq->head = Next;
		//队头指向下一个位置
	}
	pq->size--;//数量减少
}

2.5队列的队头数据(QueueFront)

QDataType QueueFront(Queue* pq) {
	assert(pq);
	assert(!QueueEmpty(pq));
	//判断是否为空队列
	return pq->head->data;
	//直接去队头数据
}

2.6队列的队尾数据(QueueBack)

QDataType QueueBack(Queue* pq) {
	assert(pq);
	assert(!QueueEmpty(pq));
	//判断是否为空队列
	return pq->tail->data;
}

2.7队列大小(QueueSize)

int QueueSize(Queue* pq) {
	assert(pq);
	return pq->size;
}

2.8队列的销毁(QueueDestroy)


void QueueDestroy(Queue* pq) {
	assert(pq);
	QNode* cur = pq->head;
	//记录当前结点
	while (cur) {
		QNode* Next = cur->next;
		//当前结点的下一个结点
		free(cur);
		//释放当前节点
		cur = Next;
		//让当前结点指向下一个结点
	}
	pq->head = pq->tail = NULL;
	//最后头尾都NULL
	pq->size = 0;
}

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值