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

3.6链队列

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

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

#include<stdio.h>
#include<malloc.h>
/**
*链队列结点
*/
typedef struct LinkNode {
	int data;
	LinkNode* next;
}*LinkNodePtr;

/**
*链队列
*/
typedef struct LinkQueue {
	LinkNodePtr front;
	LinkNodePtr rear;
}*LinkQueuePtr;

/**
*construct an empty queue
*/
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;
	
}
/**
*Output the queue
*/
void outputLinkQueue(LinkQueuePtr paraQueuePtr) {
	LinkNodePtr tempPtr = paraQueuePtr->front->next;
	while (tempPtr != NULL)
	{
		printf("%d ", tempPtr->data);
		tempPtr = tempPtr->next;
	}
	printf("\r\n");
}
/**
*Enqueue
*/
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;
}
/**
 * Dequeue.
 * @return The value of the header
 */
int dequeue(LinkQueuePtr paraQueuePtr)
{
	int resultValue;
	LinkNodePtr tempNodePtr;
	//step 1.检测是否链表为空
	if (paraQueuePtr->front == paraQueuePtr->rear) {
		printf("The queue is empty\r\n");
		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;
	}
/**
 * Unit test.
 */
void testLinkQueue() {
	LinkQueuePtr tempQueuePtr;
	tempQueuePtr = initQueue();
	enqueue(tempQueuePtr, 10);
	enqueue(tempQueuePtr, 30);
	enqueue(tempQueuePtr, 50);

	outputLinkQueue(tempQueuePtr);

	printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
	printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
	printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
	printf("dequeue gets %d\r\n", 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 <stdio.h>
#include <malloc.h>

#define TOTAL_SPACE 5
/**
*Ciecle int queue
*/
typedef struct CircleIntQueue {
	int data[TOTAL_SPACE];
	int head;
	int tail;
}*CircleIntQueuePtr;
/**
*Initialize the queque
*/
CircleIntQueuePtr initQueue() {
	CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
	resultPtr->head = 0;
	resultPtr->tail = 0;

	return resultPtr;
}
/**
 * Enqueue.
 *
 * @param paraValue The value of the new node.
 */
void enqueue(CircleIntQueuePtr paraPtr, int paraValue)
{
	if ((paraPtr->tail + 1) % TOTAL_SPACE == paraPtr->head)
	{
		printf("Queue full\r\n");
		return;
	}
	paraPtr->data[paraPtr->tail % TOTAL_SPACE] = paraValue;
	paraPtr->tail++;
}
/**
*Dequeue.
*
* @return The value at the head.
*/
int dequeue(CircleIntQueuePtr paraPtr)
{
	int resultValue;
	if (paraPtr->head == paraPtr->tail)
	{
		printf("No element in the queue\r\n");
		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("\r\n");
}
/**
 * Unit test.
 */
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 %d\r\n", dequeue(tempPtr));
	}//Of for i

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

/**
 * The entrance.
 */
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,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值