C语言实现队列相关操作(初始化、入队列、出队列、获取队头及队尾元素、获取队列中有效元素个数、判空、销毁)

今天给小伙伴们送上数据结构中队列的相关操作实现的代码,希望对需要的小伙伴们有所帮助,但是千万不要只是“拿来主义”,一定要进行思考后自己亲自动手写代码,这样自己的代码能力才能有所进步!最后还是那句话:“我在谢顶的路上一路狂奔,哈哈哈哈!”

C语言实现队列相关操作:
1.初始化
2.入队列
3.出队列
4.获取队头及队尾元素
5.获取队列中有效元素个数
6.判空
7.销毁

.h文件中的代码如下:

typedef int QDataType;
// 链式结构:表示队列 
typedef struct QListNode
{
	struct QListNode* _next;
	QDataType _data;
}QNode;

// 队列的结构 
typedef struct Queue
{
	QNode* _front;
	QNode* _rear;
}Queue;

// 初始化队列 
void QueueInit(Queue* q);
// 队尾入队列 
void QueuePush(Queue* q, QDataType data);
// 队头出队列 
void QueuePop(Queue* q);
// 获取队列头部元素 
QDataType QueueFront(Queue* q);
// 获取队列队尾元素 
QDataType QueueBack(Queue* q);
// 获取队列中有效元素个数 
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* q);
// 销毁队列 
void QueueDestroy(Queue* q);

.c文件中的代码如下:

#include<malloc.h>
#include<assert.h>
#include<stdio.h>
#include"Queue.h"


QNode* BuyQListNode(QDataType data)
{
	QNode* node = (QNode*)malloc(sizeof(QNode));
	if (node == NULL)
	{
		assert(0);
		return NULL;
	}
	node->_data = data;
	node->_next = NULL;
}
// 初始化队列 
void QueueInit(Queue* q)
{
	assert(q);
	q->_front = q->_rear = BuyQListNode(0);
}

// 队尾入队列 
void QueuePush(Queue* q, QDataType data)
{
	assert(q);
	q->_rear->_next = BuyQListNode(data);
	q->_rear = q->_rear->_next;
}

// 队头出队列 
void QueuePop(Queue* q)
{
	QNode* delNode = NULL;
	if (QueueEmpty(q))
	{
		return;
	}
	delNode = q->_front->_next;
	q->_front->_next = delNode->_next;
	if (delNode->_next == NULL)
	{
		q->_rear = q->_front;
	}
	free(delNode);
}

// 获取队列头部元素 
QDataType QueueFront(Queue* q)
{
	assert(q);
	if(!QueueEmpty(q))
	return q->_front->_next->_data;
}

// 获取队列队尾元素 
QDataType QueueBack(Queue* q)
{
	assert(q);
	if (!QueueEmpty(q))
	return q->_rear->_data;
}

// 获取队列中有效元素个数 
int QueueSize(Queue* q)
{
	assert(q);
	int count = 0;
	QNode* cur = q->_front->_next;
	while (cur)
	{
		++count;
		cur = cur->_next;
	}
	return count;
}

// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* q)
{
	assert(q);
	return q->_front->_next == NULL;
}

// 销毁队列 
void QueueDestroy(Queue* q)
{
	assert(q);
	QNode* cur = q->_front;
	while (cur)
	{
		q->_front = cur->_next;
		free(cur);
		cur = q->_front;
	}
	q->_front = q->_rear = NULL;
}
//测试
void TestQueue()
{
	Queue q;
	QueueInit(&q);

	QueuePush(&q, 1);
	QueuePush(&q, 2);
	printf("size=%d\n", QueueSize(&q));
	printf("front=%d\n", QueueFront(&q));
	printf("rear=%d\n", QueueBack(&q));

	QueuePush(&q, 3);
	QueuePush(&q, 4);
	QueuePush(&q, 5);
	QueuePush(&q, 6);
	printf("size=%d\n", QueueSize(&q));
	printf("front=%d\n", QueueFront(&q));
	printf("rear=%d\n", QueueBack(&q));

	QueuePop(&q);
	printf("size=%d\n", QueueSize(&q));
	printf("front=%d\n", QueueFront(&q));
	printf("rear=%d\n", QueueBack(&q));

	QueuePop(&q);
	QueuePop(&q);
	QueuePop(&q);
	QueuePop(&q);
	QueuePop(&q);
	printf("size=%d\n", QueueSize(&q));

	if (QueueEmpty(&q))
	{
		printf("EMPTY!!!\n");
	}
	else
	{
		printf("Error!!!\n");
	}
	QueueDestroy(&q);
}



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

运行结果截图:在这里插入图片描述

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我来回答你的问题。 1. C语言实现队列初始化: ```c #define MAXSIZE 100 // 定义一个队列的最大长度 // 定义一个链队列结构体 typedef struct Node { int data; // 队列的数据 struct Node* next; // 队列下一个元素的指针 } Node; typedef struct { Node* front; // 队首指针 Node* rear; // 队指针 } LinkQueue; // 初始化队列 void InitQueue(LinkQueue* Q) { Q->front = Q->rear = (Node*)malloc(sizeof(Node)); // 创建结点 Q->front->next = NULL; // 结点的指针为空 } ``` 2. 队数据: ```c // 队 void EnQueue(LinkQueue* Q, int e) { Node* p = (Node*)malloc(sizeof(Node)); // 创建一个新节点 p->data = e; // 将e赋值给新节点的数据域 p->next = NULL; // 新节点的指针为空 Q->rear->next = p; // 队指针指向新节点 Q->rear = p; // 将队指针指向新节点 } ``` 3. 弹出队元素: ```c // 出队 int DeQueue(LinkQueue* Q) { if (Q->front == Q->rear) { // 队列为空 printf("队列为空!"); return -1; } Node* p = Q->front->next; // p指向队列的第一个元素 int e = p->data; // 取出队元素的值 Q->front->next = p->next; // 队首指针指向下一个元素 if (Q->rear == p) { // 如果队列只有一个元素 Q->rear = Q->front; // 队指针指向结点 } free(p); // 释放掉队首元素的空间 return e; // 返回队首元素的值 } ``` 4. 对换首位数据: ```c // 对换队首与队元素 void Swap(LinkQueue* Q) { if (Q->front == Q->rear) { // 队列为空 printf("队列为空!"); return; } else if (Q->front->next == Q->rear) { // 队列只有一个元素 printf("队列只有一个元素,无法交换!"); return; } Node* p = Q->front->next; // p指向队列的第一个元素 Node* q = p->next; // q指向队列的第二个元素 while (q != Q->rear) { // 找到队列倒数第二个元素 q = q->next; } // 对换队首和队元素的值 int temp = p->data; p->data = q->data; q->data = temp; } ``` 以上就是C语言实现队列初始化、队数据、弹出队元素、对换首位数据的完整代码。希望能对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值