栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构3.6链队列,3.7循环队列

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构3.6链队列,3.7循环队列

3.6链队列

转载:链队列与链表相似,不同的是它具有对列的运算方法,存储结构和链表相同,下面是其结构示意图:

 这里的*Q类似于链表的头节点*head;它包含两个指向队列节点的指针front和rear;当front和rear都为NULL时队列为空;front指向队列第一个节点,rear指向最后一个节点,当两者指向同一个节点说明队列只有一个节点;
还有不设头指针的链队列表示形式,这里不予说明;
代码部分:

#include
#include

typedef struct LinkNode {
	int data;
	LinkNode* next;
}*LinkNodePtr;


typedef struct LinkQueue {
	LinkNodePtr front;
	LinkNodePtr rear;
}*LinkQueuePtr;


LinkQueuePtr initQueue()
{
	LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(struct LinkQueue));
	//The header ,the data is not useful
	LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(struct LinkNode));
	headerPtr->next = NULL;
	resultPtr->front = headerPtr;
	resultPtr->rear = headerPtr;
	return resultPtr;
	
}

void outputLinkQueue(LinkQueuePtr paraQueuePtr) {
	LinkNodePtr tempPtr = paraQueuePtr->front->next;
	while (tempPtr != NULL)
	{
		printf("%d ", tempPtr->data);
		tempPtr = tempPtr->next;
	}
	printf("rn");
}

void enqueue(LinkQueuePtr paraQueuePtr, int paraElement)
{
	//step 1.create a new node
	LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(struct LinkNode));
	tempNodePtr->data = paraElement;
	tempNodePtr->next = NULL;
	//step 2.Link to the existing rear
	paraQueuePtr->rear->next = tempNodePtr;
	//step 3.
	paraQueuePtr->rear = tempNodePtr;
}

int dequeue(LinkQueuePtr paraQueuePtr)
{
	int resultValue;
	LinkNodePtr tempNodePtr;
	//step 1.检测是否链表为空
	if (paraQueuePtr->front == paraQueuePtr->rear) {
		printf("The queue is emptyrn");
		return -1;
	}
	//step 2.Change the queue
	tempNodePtr = paraQueuePtr->front->next;
	resultValue = tempNodePtr->data;
	paraQueuePtr->front->next = paraQueuePtr->front->next->next;
	if (paraQueuePtr->rear == tempNodePtr) {
		paraQueuePtr->rear = paraQueuePtr->front;
	}
	//step 3.Free space
	tempNodePtr = NULL;
	//Step 4.Return 
	return resultValue;
	}

void testLinkQueue() {
	LinkQueuePtr tempQueuePtr;
	tempQueuePtr = initQueue();
	enqueue(tempQueuePtr, 10);
	enqueue(tempQueuePtr, 30);
	enqueue(tempQueuePtr, 50);

	outputLinkQueue(tempQueuePtr);

	printf("dequeue gets %drn", dequeue(tempQueuePtr));
	printf("dequeue gets %drn", dequeue(tempQueuePtr));
	printf("dequeue gets %drn", dequeue(tempQueuePtr));
	printf("dequeue gets %drn", dequeue(tempQueuePtr));

	enqueue(tempQueuePtr, 8);
	outputLinkQueue(tempQueuePtr);
}
int main() {
	testLinkQueue();
	return 1;
}

运行结果:

10 30 50
dequeue gets 10
dequeue gets 30
dequeue gets 50
The queue is empty
dequeue gets -1
8

3.7循环队列

百度百科:为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。循环队列是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。

为了区分空队列与满队列, 需要留一个空间. 相当于不允许首尾相连.

网图:

#include 
#include 

#define TOTAL_SPACE 5

typedef struct CircleIntQueue {
	int data[TOTAL_SPACE];
	int head;
	int tail;
}*CircleIntQueuePtr;

CircleIntQueuePtr initQueue() {
	CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
	resultPtr->head = 0;
	resultPtr->tail = 0;

	return resultPtr;
}

void enqueue(CircleIntQueuePtr paraPtr, int paraValue)
{
	if ((paraPtr->tail + 1) % TOTAL_SPACE == paraPtr->head)
	{
		printf("Queue fullrn");
		return;
	}
	paraPtr->data[paraPtr->tail % TOTAL_SPACE] = paraValue;
	paraPtr->tail++;
}

int dequeue(CircleIntQueuePtr paraPtr)
{
	int resultValue;
	if (paraPtr->head == paraPtr->tail)
	{
		printf("No element in the queuern");
		return -1;
	}
	resultValue = paraPtr->data[paraPtr->head % TOTAL_SPACE];
	paraPtr->head++;
	return resultValue;
}
void outputLinkQueue(CircleIntQueuePtr paraPtr) {
	int i;
	if (paraPtr->head == paraPtr->tail)
	{
		printf("Empty queue");
		return;
	}
	printf("Elements in the queue ");
	for (i = paraPtr->head; i < paraPtr->tail; i++)
	{
		printf("%d, ", paraPtr->data[i % TOTAL_SPACE]);
	}
	printf("rn");
}

void testLinkQueue() {
	int i = 10;
	CircleIntQueuePtr tempPtr = initQueue();
	for (; i < 16; i++) {
		enqueue(tempPtr, i);
	}//Of for i

	outputLinkQueue(tempPtr);

	for (i = 0; i < 6; i++) {
		printf("dequeue gets %drn", dequeue(tempPtr));
	}//Of for i

	enqueue(tempPtr, 8);
	outputLinkQueue(tempPtr);
}//Of testLinkQueue


int main() {
	testLinkQueue();
	return 1;
}

运行结果:

 

Queue full
Queue full
Elements in the queue 10, 11, 12, 13,
dequeue gets 10
dequeue gets 11
dequeue gets 12
dequeue gets 13
No element in the queue
dequeue gets -1
No element in the queue
dequeue gets -1
Elements in the queue 8,
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/889828.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号