当前位置:   article > 正文

队列的基本操作(C语言链表实现)初始化,入队,出队,销毁,读取数据_请写出初始化队列、销毁队列,入队,出队、判队空、显示队列中的所有元素算法。 voi

请写出初始化队列、销毁队列,入队,出队、判队空、显示队列中的所有元素算法。 voi


前言


在这里插入图片描述

提示:以下是本篇文章正文内容,下面案例可供参考
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出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;//将头与尾还有数量封装在一起能更好操作

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

二、队列的基本操作

2.1队列的初始化(QueueInit)

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

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
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

2.3判断是否为空队(QueueEmpty)

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

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--;//数量减少
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

2.5队列的队头数据(QueueFront)

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

2.6队列的队尾数据(QueueBack)

QDataType QueueBack(Queue* pq) {
	assert(pq);
	assert(!QueueEmpty(pq));
	//判断是否为空队列
	return pq->tail->data;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.7队列大小(QueueSize)

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

  • 1
  • 2
  • 3
  • 4
  • 5

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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/646354
推荐阅读
相关标签
  

闽ICP备14008679号