一、链队列:
链队是指采用链式存储结果实现的队列,通常用单链表来表示。一个链队需要两个分别指示队头和队尾的指针才能确定。
代码:
#include <stdio.h>
#include <malloc.h>
//链队列的节点
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));
LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr));
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("\r\n");
}
//入队
void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) {
//创建一个新节点
LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(struct LinkNode));
tempNodePtr->data = paraElement;
tempNodePtr->next = NULL;
//将该节点与链表连接
paraQueuePtr->rear->next = tempNodePtr;
//尾指针指向新的尾结点
paraQueuePtr->rear = tempNodePtr;
}
//出队
int dequeue(LinkQueuePtr paraQueuePtr) {
int resultValue;
LinkNodePtr tempNodePtr;
//判断队列是否为空
if (paraQueuePtr->front == paraQueuePtr->rear) {
printf("队列为空!\n");
return -1;
}
tempNodePtr = paraQueuePtr->front->next;
resultValue = tempNodePtr->data;
paraQueuePtr->front->next = paraQueuePtr->front->next->next;
if (paraQueuePtr->rear == tempNodePtr) {
paraQueuePtr->rear = paraQueuePtr->front;
}
//free()
tempNodePtr = NULL;
return resultValue;
}
//功能测试
void testLinkQueue(){
LinkQueuePtr tempQueuePtr;
tempQueuePtr = initQueue();
enqueue(tempQueuePtr, 10);
enqueue(tempQueuePtr, 30);
enqueue(tempQueuePtr, 50);
enqueue(tempQueuePtr, 80);
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));
printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
enqueue(tempQueuePtr, 8);
outputLinkQueue(tempQueuePtr);
}
//main函数
int main(){
testLinkQueue();
return 1;
}
运行结果:
10 30 50 80
dequeue gets 10
dequeue gets 30
dequeue gets 50
dequeue gets 80
队列为空!
dequeue gets -1
队列为空!
dequeue gets -1
8
二、循环队列
在循环队列中判断队空队满的条件:
队空的条件:Q.front = Q.rear
队满的条件:(Q.rear+1)%MAQSIZE == Q.front
代码:
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 5
typedef struct CircleIntQueue{
int data[MAXSIZE];
int front;
int rear;
}*CircleIntQueuePtr;
//初始化
CircleIntQueuePtr initQueue() {
CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
resultPtr->front = 0;
resultPtr->rear = 0;
return resultPtr;
}
//入队
void enqueue(CircleIntQueuePtr paraPtr, int paraValue) {
if ((paraPtr->rear + 1) % MAXSIZE == paraPtr->front) {
printf("Queue full.\r\n");
return;
}
paraPtr->data[paraPtr->rear % MAXSIZE] = paraValue;
paraPtr->rear = (paraPtr->rear+1) % MAXSIZE;
}
//出队
int dequeue(CircleIntQueuePtr paraPtr) {
int resultValue;
if (paraPtr->front == paraPtr->rear) {
printf("Queue is empty.\r\n");
return -1;
}
resultValue = paraPtr->data[paraPtr->front % MAXSIZE];
paraPtr->front = (paraPtr->front+1) % MAXSIZE;
return resultValue;
}
//打印
void outputLinkQueue(CircleIntQueuePtr paraPtr)
{
//当队头指针和队尾指针相等时队为空
for(int i = paraPtr->front; i != paraPtr->rear; i = (i + 1) % MAXSIZE)
{
printf("data[%d] = %d ",i,paraPtr->data[i]);
}
printf("\n");
}
//功能测试
void testLinkQueue(){
int i = 10;
CircleIntQueuePtr tempPtr = initQueue();
for (; i < 16; i ++) {
enqueue(tempPtr, i);
}
outputLinkQueue(tempPtr);
for (i = 0; i < 6; i ++) {
printf("dequeue gets %d\r\n", dequeue(tempPtr));
}
enqueue(tempPtr, 8);
enqueue(tempPtr, -10);
enqueue(tempPtr, 15);
outputLinkQueue(tempPtr);
}
int main()
{
testLinkQueue();
return 0;
}
运行结果:
Queue full.
Queue full.
data[0] = 10 data[1] = 11 data[2] = 12 data[3] = 13
dequeue gets 10
dequeue gets 11
dequeue gets 12
dequeue gets 13
Queue is empty.
dequeue gets -1
Queue is empty.
dequeue gets -1
data[4] = 8 data[0] = -10 data[1] = 15