#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;//记录队列个数
struct Node* next;
}Node;
Node* tail = NULL;//尾节点指针
// 初始化函数
Node* initQueue()
{
// 开辟空间,创建节点
Node* head = (Node*)malloc(sizeof(Node));
// 容错判断 略
head->data = 0;//存储队列个数
head->next = NULL;
return head;
}
// 入列:尾插法--创建尾指针法
void inQueue(Node* queue, int data)
{
// 开辟空间,创建节点
Node* node = (Node*)malloc(sizeof(Node));
// 容错判断 略
if (node == NULL)
{
perror("inQueue malloc errror\n");
return;
}
// 存放数据
node->data = data;
// 插入
// 改变要插入节点指向
node->next = tail->next;
// 原尾节点指向插入节点
tail->next = node;
// 移动尾指针到插入节点
tail = node;
// 队列个数++
queue->data++;
}
// 判空
int isNullQueue(Node* queue)
{
// 当队列个数data为0时,队列为空
return queue->data == 0;
}
// 出列:每次都是将头节点后面节点出队
int outQueue(Node* queue)
{
// 判断空队列
if (isNullQueue(queue))
{
printf("空队列\n");
return -1;
}
// 指向要出队的节点
Node* head_next = queue->next;
// 取出数据
int data = head_next->data;
// 跨过第一个节点
queue->next = head_next->next;
// 释放第一个节点
free(head_next);
head_next = NULL;
// 队列个数--
queue->data--;
// 返回数据
return data;
}
// 清空列
void noneQueue(Node* queue)
{
// 当头节点next不为null时,一直进行出列
while (queue->next != NULL)
{
printf("出列:%d\n", outQueue(queue));
}
}
// 查看队列:同链表遍历
void printQueue(Node* queue)
{
Node* queue_cp = queue->next;
while (queue_cp)
{
printf("%d<-", queue_cp->data);
queue_cp = queue_cp->next;
}
printf("NULL\n");
}
int main(int argc, char const *argv[])
{
// 初始化
Node* queue = initQueue();
tail = queue;
inQueue(queue, 1);
inQueue(queue, 2);
inQueue(queue, 3);
inQueue(queue, 4);
inQueue(queue, 5);
printf("长度:%d\n", queue->data);
printQueue(queue);
printf("出列:%d\n", outQueue(queue));
printQueue(queue);
printf("出列:%d\n", outQueue(queue));
printQueue(queue);
noneQueue(queue);
printQueue(queue);
return 0;
}
有头链式队列尾指针版
于 2023-08-28 11:46:32 首次发布