队列所需要的头文件
先给类型重命名 意义前几篇有讲
队列要用到的两个结构体
第一个结构体里面有 1.存储数据的 a 2.指向下一个节点的指针
重命名为Queue(这里的名字需要记一下,等会需要分辨两个结构体,结构体两个的功能是不一样的)
第二个结构体里面有 1.指向头的头指针 2.指向尾的尾指针
重命名尾Qnene
队列实现的函数功能有: 1.初始化队列 2.队尾入数据 3.队头出数据 4.获取队列的有效元素个数 5.判断队列是否为空 6.获取队列头部数据 7.获取队列尾部数据 8.销毁队列
1.初始化队列
初始化我们直接把头和尾置尾空(第一个结构体是包含着第二个结构体的,所以初始化第二个结构体就可以了)
2.队尾入数据
因为是要入数据,所以我们要先申请一个空间(并且把数据放入到新空间中)
入数据是有两种情况
1.第一次入,队列是没有数据的,所以我们要先进行单独处理
直接在头和尾的位置入数据(因为第一次没数据,头和尾是重叠在一起的)
2.已经入过了,队列中已经存在其他的数据,所以我们直接在队尾后面入数据
3.队头出数据
1.若这个队列中只剩下一个数据了,那么我们可以直接删除数据后,并且释放掉整个队列
2.若队列中不止一个数据,那么先存储一个队头的下一个数据,再释放掉对头,再让对头的指针指向存储的数据
4.获取队列中有效的数据个数
这把我们使用遍历的方法
1.先定义一个size,用来计算队列中的个数
2.先从队头开始,每次都++size,直接空。
3.最后返回size的个数
5.判断队列是否为空
用bool类型来返回
我们判断队头是否为空就可以了
6.获取队头的数据
返回队头用来存储数据的a
7.获取队尾的数据
返回队尾用来存储数据的a
8.销毁队列
先创建一个存放队头的(命名为tist),再来一个存放对头的下一个数据(命名为cur)。
先释放tist,再把cur给tist。就此循环
最后把头和尾的指针置空
9.队列的打印
这里不需要用到单独的函数实现,置需要把前几个实现的函数结合起来用
1.先判断队列是否为空
2.再打印返回的头元素
3.再掉头元素
这样队列的全部功能就实现了!
接下来是源码,需要自取
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
typedef int STDataType;
typedef struct Quene
{
struct Quene* next;
STDataType a;
}Queue;
typedef struct Qnene
{
Queue* head;
Queue* tail;
}Qnene;
//初始化
void QueueInit(Qnene* q)
{
assert(q);
q->head = q->tail = NULL;
}
void QueuePush(Qnene* q, STDataType data)
{
assert(q);
Queue* newnode = (Queue*)malloc(sizeof(Queue));
newnode->a = data;
newnode->next = NULL;
//如果队列没有数据要做单独处理
if (q->tail == NULL)
{
q->head = q->tail = newnode;
}
//如果队列已经有数据了
else
{
q->tail->next = newnode;
q->tail = newnode;
}
}
void QueuePop(Qnene* q)
{
assert(q);
//如果队列中只有一个数据,那么删除这个数据就是空了
if (q->head->next == NULL)
{
free(q->head);
q->head = q->tail = NULL;
}
else
{
Queue* tist = q->head->next;
free(q->head);
q->head = tist;
}
}
STDataType QueueFront(Qnene* q)
{
assert(q);
return q->head->a;
}
STDataType QueueBack(Qnene* q)
{
assert(q);
return q->tail->a;
}
int QueueSize(Qnene* q)
{
assert(q);
int size = 0;
Queue* tist = q->head;
while (tist)
{
++size;
tist = tist->next;
}
return size;
}
bool QueueEmpty(Qnene* q)
{
assert(q);
return q->head == NULL;
}
void QueueDestroy(Qnene* q)
{
assert(q);
Queue* tist = q->head;
while (tist)
{
Queue* cur = tist->next;
free(tist);
tist = cur;
}
q->head = q->tail = NULL;
}
void Intenode()
{
Qnene st;
初始化队列
QueueInit(&st);
队尾入队列
QueuePush(&st, 1);
QueuePush(&st, 2);
QueuePush(&st, 3);
QueuePush(&st, 4);
获取队列队尾元素
int size= QueueSize(&st);
printf("队列中有%d个数据\n", size);
检测队列是否为空
while (!QueueEmpty(&st))
{
获取队列头部元素
printf("%d ", QueueFront(&st));
队头出队列
QueuePop(&st);
}
//获取队列尾部元素
//QueueBack(&st);
销毁队列
QueueDestroy(&st);
}