一、代码块
队列结点
typedef struct LinkNode{
int data;
LinkNode* next;
}*LinkNodePtr;
链队列
typedef struct LinkQueue{
LinkNodePtr front;
LinkNodePtr rear;
}*LinkQueuePtr;
初始化链队列和结点
LinkQueuePtr initQueue(){
LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(LinkQueue));
//创建头结点
LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(LinkNode));
headerPtr->next = NULL;
headerPtr->data = -1;
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(LinkNodePtr));
tempNodePtr->data = paraElement;
tempNodePtr->next = NULL;
//在队尾添加结点
paraQueuePtr->rear->next = tempNodePtr;
//更新队尾
paraQueuePtr->rear = tempNodePtr;
}
删除队列结点并返回对应元素
int dequeue(LinkQueuePtr paraQueuePtr){
//判断队列是否为空
if(paraQueuePtr->front == paraQueuePtr->rear){
printf("The queue is empty.\r\n");
return -1;
}
int resultValue;
LinkNodePtr tempNodePtr;
//删除队头元素
tempNodePtr = paraQueuePtr->front->next;
resultValue = tempNodePtr->data;
paraQueuePtr->front->next = paraQueuePtr->front->next->next;
//判断队列是否只有一个元素
if(paraQueuePtr->rear == tempNodePtr){
paraQueuePtr->rear = paraQueuePtr->front;
}
//释放删除结点的空间
free(tempNodePtr);
tempNodePtr = NULL;
//返回对应元素
return resultValue;
}
二、部分代码图示
- LinkQueuePtr initQueue()
tempQueuePtr = initQueue();
void enqueue(LinkQueuePtr paraQueuePtr, int paraElement)
enqueue(tempQueuePtr, 10);
enqueue(tempQueuePtr, 30);
enqueue(tempQueuePtr, 50);
- int dequeue(LinkQueuePtr paraQueuePtr)
printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
三、全部代码
//
// main.c
//
// Created on 2022/5/16.
//
#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(LinkQueue));
//创建头结点
LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(LinkNode));
headerPtr->next = NULL;
headerPtr->data = -1;
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(LinkNodePtr));
tempNodePtr->data = paraElement;
tempNodePtr->next = NULL;
//在队尾添加结点
paraQueuePtr->rear->next = tempNodePtr;
//更新队尾
paraQueuePtr->rear = tempNodePtr;
}
//删除队列结点并返回对应元素
int dequeue(LinkQueuePtr paraQueuePtr){
//判断队列是否为空
if(paraQueuePtr->front == paraQueuePtr->rear){
printf("The queue is empty.\r\n");
return -1;
}
int resultValue;
LinkNodePtr tempNodePtr;
//删除队头元素
tempNodePtr = paraQueuePtr->front->next;
resultValue = tempNodePtr->data;
paraQueuePtr->front->next = paraQueuePtr->front->next->next;
//判断队列是否只有一个元素
if(paraQueuePtr->rear == tempNodePtr){
paraQueuePtr->rear = paraQueuePtr->front;
}
//释放删除结点的空间
free(tempNodePtr);
tempNodePtr = NULL;
//返回对应元素
return resultValue;
}
//测试
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);
}
//main
int main(){
testLinkQueue();
return 0;
}
四、小结
队列为一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。