队列结构体
typedef struct Node
{
int data;//数据域
struct Node* next;//指针域
}Node;
typedef struct LinkQueue {
Node* front;//队头指针
Node* rear;//队尾指针
int size;//队列的大小
}LinkQueue;
队列的基本操作
//初始化队列
LinkQueue* InitLinkQueue(){
LinkQueue* queue = malloc(sizeof(LinkQueue));
queue->front = NULL;
queue->rear = NULL;
queue->size = 0;
return queue;
}
//入队
void push_LinkQueue(LinkQueue *queue,int value) {
if (NULL == queue) {
return;
}
Node* newNode = malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;
//当尾指针为空时,入队时头指针和尾指针指向一个同一个值
if (queue->rear == NULL) {
queue->front = newNode;
queue->rear = newNode;
}
else {
//尾指针指向的最后一个元素
queue->rear->next = newNode;
//改变尾指针的元素
queue->rear = newNode;
}
queue->size++;
}
//出队
int pop_LinkQueue(LinkQueue* queue) {
if (queue->front== NULL) {
return -1;
}
//拿到头指针
Node* firstNode = queue->front;
//得到头指针的值
int value = firstNode->data;
queue->front = queue->front->next;//更新头指针
free(firstNode);
queue->size--;
//如果头指针为空尾指针也为空
if (queue->front== NULL) {
queue->rear = NULL;
}
//返回出队的值
return value;
}
//打印队列
void print_LinkQueue(LinkQueue* queue) {
if (queue->front == NULL) {
return;
}
Node* node = queue->front;
while (node)
{
printf("%d\t", node->data);
node = node->next;
}
}
//获得队头元素
void * Front_LinkQueue(LinkQueue* queue) {
if (queue == NULL) {
return;
}
Node* node = queue->front;
return node->data;
}
//获得队尾元素
void * Back_LinkQueue(LinkQueue* queue) {
if (queue == NULL) {
return;
}
Node* node = queue->rear;
return node->data;
}
//大小
int Size_LinkQueue(LinkQueue* queue) {
if (queue == NULL) {
return 0;
}
return queue->size;
}
//销毁队列
void Destory_LinkNode(LinkQueue* queue) {
if (NULL == queue) {
return;
}
free(queue);
queue = NULL;
}
测试用例
int main() {
LinkQueue* queue = InitLinkQueue();
push_LinkQueue(queue, 1);
push_LinkQueue(queue, 2);
push_LinkQueue(queue, 3);
push_LinkQueue(queue, 4);
push_LinkQueue(queue, 5);
print_LinkQueue(queue);
int value = pop_LinkQueue(queue);
printf("出队元素%d\n", value);
print_LinkQueue(queue);
printf("队头元素%d\n", Front_LinkQueue(queue));
printf("队尾元素%d\n", Back_LinkQueue(queue));
printf("队列大小%d\n", Size_LinkQueue(queue));
Destory_LinkNode(queue);
return 0;
}
总结
队列的特点是节点的排队次序和出队次序按入队时间先后确定,即先入队者先出队,后入队者后出队,队列实现方式也有两种形式,基于数组和基于链表。对于基于链表,因为链表的长度是随时都可以变的,实现起来比较简单。