C语言实现队列

目录

写在最前的话

一,队列的概念

二,队列结构的实现

三,队列与单链表的比较

四,队列接口的实现

1,基本接口

2,处理数据接口

3,其他接口


写在最前的话

数据结构的实现不是单一的或者统一的,思想是关键,代码实现的细节的差异因人而异,使用数据结构应当对代码进行了解,不是想怎么用就怎么用的。

关于数据结构的实现方式也是千差万别,例如队列的实现可以使用数组实现也可以使用链表实现,这里,我们使用的是链表的方式。

一,队列的概念

 

队列:

只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的特性

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

二,队列结构的实现

队列的结构成员有头指针front(指向单链表的头结点的指针),尾指针rear(指向单链表的尾结点的指针)和表示单链表长度的size

(至于为何如此设计,我们暂时不深究,先学习如何实现队列,而其中的意味我需要慢慢探究)

 

typedef int QueueDataType;

typedef struct QueueListNode
{
	QueueDataType data;
	struct QueueListNode* next;
}QNode;

typedef struct Queue
{
	QNode* front;
	QNode* rear;
	int size;
}Queue;

三,队列与单链表的比较

队列和单链表可以说是两回事,但是队列是依靠单链表实现的,通过头节点、尾节点控制单链表实现功能,但它绝不是单链表。

四,队列接口的实现

1,基本接口

初始化:void QueueInit(Queue* pQ);

使用者在创建一个队列的变量之后,将其指针传入初始化函数中,初始化函数将其成员全部置空

void QueueInit(Queue* pQ)
{
	assert(pQ != NULL);

	pQ->front = NULL;
	pQ->rear = NULL;
	pQ->size = 0;
}

销毁:void QueueDestroy(Queue* pQ);

遍历单链表,释放动态开辟的空间,将队列成员全部置空

void QueueDestroy(Queue* pQ)
{
	assert(pQ != NULL);
	QNode* cur = pQ->front;

	while (cur != NULL)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}

	pQ->front = pQ->rear = NULL;
	pQ->size = 0;
}


2,处理数据接口

插入数据:void QueuePush(Queue* pQ, QueueDataType x);

队列数据的插入就是单链表数据的插入

QNode* BuyNewNode(QueueDataType x)
{
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	newnode->data = x;
	newnode->next = NULL;

	return newnode;
}

void QueuePush(Queue* pQ, QueueDataType x)
{
	assert(pQ != NULL);
	QNode* newnode = BuyNewNode(x);

	if (pQ->front == NULL)
	{
		pQ->front = pQ->rear = newnode;
	}
	else
	{
		pQ->rear->next = newnode;
		pQ->rear = newnode;
	}

	pQ->size++;
}

删除数据:void QueuePop(Queue* pQ);

队列数据的删除就是单链表数据的删除,注意:当单链表只有一个节点时,将front置空后,需要将rear置空,不然rear就会成为野指针(当单链表只有一个节点时,头指针和尾指针指向同一个节点,该节点被释放后,两个指针都需置空)

void QueuePop(Queue* pQ)
{
	assert(pQ != NULL);
	assert(pQ->front != NULL);

	QNode* next = pQ->front->next;
	free(pQ->front);
	pQ->front = next;

	if (pQ->front == NULL)
	{
		pQ->rear = NULL;
	}

	pQ->size--;
}

3,其他接口

判断队列是否为空:bool QueueEmpty(Queue* pQ);

通过节点数量size判断

bool QueueEmpty(Queue* pQ)
{
	assert(pQ != NULL);
	return pQ->size == 0 ? true : false;
}

队列内元素数量:int QueueSize(Queue* pQ);

通过节点数量size判断

int QueueSize(Queue* pQ)
{
	assert(pQ != NULL);
	return pQ->size;
}

队头元素:QueueDataType QueueFront(Queue* pQ);

头节点元素即为队头元素

QueueDataType QueueFront(Queue* pQ)
{
	assert(pQ != NULL);
	assert(QueueEmpty(pQ) != true);
	return pQ->front->data;
}

队尾元素:QueueDataType QueueBack(Queue* pQ);

尾节点元素即为队尾元素

QueueDataType QueueBack(Queue* pQ)
{
	assert(pQ != NULL);
	assert(QueueEmpty(pQ) != true);
	return pQ->rear->data;
}

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
ZeroMQ的C语言实现是通过使用C语言库czmq来实现队列功能的。czmq是ZeroMQ的一个高级封装库,它提供了一组易于使用的API,用于在生产者和消费者之间建立队列通信。 使用ZeroMQ的C语言实现队列的主要特点是,不需要搭建队列环境,只需引入czmq库,并在生产者和消费者代码中调用相应的API即可。与传统的BSD开发不同,ZeroMQ中的Server和Client启动顺序没有要求。这意味着先启动Server还是先启动Client并不影响队列的正常运行。 总结起来,通过引入czmq库,并调用相应的API,ZeroMQ的C语言实现提供了一种简单而灵活的方法来实现队列功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [消息队列zeromq的c语言安装包czmq-4.2.1版本](https://download.csdn.net/download/weixin_41803458/85046594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [转载 消息队列ZeroMQ C语言](https://blog.csdn.net/wc996789331/article/details/104404412)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y雨何时停T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值