简介
本文将用链表的形式实现队列的基础接口功能:
1.初始化/销毁
2.增加/删除
还实现了返回队首元素的值,返回队列元素个数,以及判断队列是否为空
上图是队列的简单描述,队列遵循的规律是只能从队尾进队,出队只能从队首出队,这就意味着删除和插入元素简单了许多。
用两个指针分别指向队首元素以及队尾元素,这样就才能对相应的结点进行操作。
下面是代码的实现
头文件Queue.h
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdlib.h>
//用链表实现队列
//定义数据类型
typedef int QDataType;
//定义链表队列结点
typedef struct QNode{
QDataType val;
struct QNode *next;
} QNode;
//队列
typedef struct Queue{
int size; //队列元素个数
QNode *front;//指向队列第一个元素,如果队列为空,则等于NULL
QNode *rear;//指向队列最后一个元素,如果队列为空,则等于NULL
} Queue;
//初始化
void QueueInit(Queue *queue);
//销毁
void QueueDestroy(Queue *queue);
//插入,由于是队列,只能从队尾插结点
void QueuePush(Queue *queue, QDataType val);
//删除,只能从队首删
void QueuePop(Queue *queue);
//返回队首结点的值
QDataType QueueFront(const Queue *queue);
//判断队列是否为空,为空返回1,不空返回0
int QueueEmpty(const Queue *queue);
//返回队列结点的个数
int QueueSize(const Queue *queue);
//打印
void QueuePrint(const Queue *queue);
函数实现部分Queue.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
//初始化
void QueueInit(Queue *queue)
{
queue->front = queue->rear = NULL;
queue->size = 0;
}
//销毁
void QueueDestroy(Queue *queue)
{
//队内如果有元素,就先释放
QNode *next;
for (QNode *cur = queue->front; cur != NULL; cur = next)
{
next = cur->next;
free(cur);
}
queue->front = queue->rear = NULL;
queue->size = 0;
}
//插入
void QueuePush(Queue *queue, QDataType val)
{
//先创建结点
QNode *node = (QNode *)malloc(sizeof(QNode));
assert(node != NULL);
node->val = val;
node->next = NULL;
queue->size++;
//再判断队列是否为空
if (queue->rear == NULL)
{
queue->front = queue->rear = node;
}
else
{
queue->rear->next = node;
queue->rear = node;
}
}
//删除
void QueuePop(Queue *queue)
{
assert(queue->rear != NULL);//确保队列不为空
queue->size--;
QNode *old_front = queue->front;
queue->front = queue->front->next;
free(old_front);
//如果删完队列空了的话,就要设置rear的指向NULL
if (queue->front == NULL)
{
queue->rear = NULL;
}
}
//返回队首结点的值
QDataType QueueFront(const Queue *queue)
{
assert(queue->size > 0);
return queue->front->val;
}
//判断队列是否为空,为空返回1,不空返回0
int QueueEmpty(const Queue *queue)
{
return queue->size == 0 ? 1 : 0;
}
//返回队列结点的个数
int QueueSize(const Queue *queue)
{
return queue->size;
}
void QueuePrint(const Queue *queue)
{
for (QNode *cur = queue->front; cur != NULL; cur = cur->next)
{
printf("%d-->", cur->val);
}
printf("\n");
}
测试部分test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"
#include<stdio.h>
#include<stdlib.h>
void test()
{
Queue queue;
QueueInit(&queue);
QueuePush(&queue, 1);
QueuePush(&queue, 2);
QueuePush(&queue, 3);
QueuePush(&queue, 4);
QueuePush(&queue, 7);
QueuePrint(&queue);
QueuePop(&queue);
QueuePrint(&queue);
printf("%d", QueueFront(&queue));//输出队首元素
printf("\n");
printf("%d", QueueEmpty(&queue));//判断是否为空,为空输出1,不空输出0
printf("\n");
printf("%d", QueueSize(&queue));//输出队列元素个数
printf("\n");
QueueDestroy(&queue);
}
int main()
{
test();
system("pause");
return 0;
}
ps:欢迎讨论以及批评指正