队列
目录
逻辑图
C语言实现队列基本操作
1.逻辑图
2.C语言实现基本操作
Test.c
#define _CRT_SECURE_NO_WARNINGS
#include"Queue.h"
int main()
{
Queue q;
QueueInit(&q); //初始化
//插入元素
QueuePush(&q, 5);
QueuePush(&q, 4);
QueuePush(&q, 3);
QueuePush(&q, 2);
QueuePush(&q, 1);
QueuePush(&q, 0);
printf("此时的队头元素是:%d\n", QueueTop(&q));
printf("此时的队尾元素是:%d\n", QueueBack(&q));
//出队+打印
while (!QueueEmpty(&q))
{
printf("%d", QueueTop(&q));
QueuePop(&q);
}
return 0;
}
Queue.c
#define _CRT_SECURE_NO_WARNINGS
#include"Queue.h"
//函数实现
//初始化
void QueueInit(Queue* q)
{
assert(q);
q->head = q->tail = NULL;
q->Size = 0;
}
//队尾入列
void QueuePush(Queue* q, QDataType data)
{
assert(q);
QNode* newnode = (QNode*)malloc(sizeof(QNode));
assert(newnode);
newnode->data = data;
newnode->pNext = NULL;
//如果为空队列直接在头插入
if (q->head == NULL)
{
//assert(q->head == NULL);
q->head = q->tail = newnode;
q->Size++;
}
//非空队列
else
{
q->tail->pNext = newnode;
q->tail = newnode;//更新新的尾指针
q->Size++;
}
}
//队头出列
void QueuePop(Queue* q)
{
assert(q);
//1.列表为空 直接断言报错
assert(q->head && q->tail);
//2.当只有一个节点时候
//只有一个节点时 next的值并没有改变 依旧是初始化时候的NULL
if (q->head->pNext == NULL)
{
free(q->head);
q->head = q->tail = NULL;
q->Size--;
}
//3.有多个元素
else
{
QNode* head_next = q->head->pNext;//记录head下一个节点地址
free(q->head);
q->head = head_next;
//free(head_next);
//head_next = NULL;
q->Size--;
}
}
//获取队列头部元素
QDataType QueueTop(Queue* q)
{
assert(q);
assert(q->head);
return q->head->data;
}
//获取队列尾部元素
QDataType QueueBack(Queue* q)
{
assert(q);
assert(q->tail);
return q->tail->data;
}
//获取队列种有效元素的个数
int QueueSize(Queue* q)
{
//1.0遍历
/*assert(pq);
QNode* cur = pq->head;
size_t size = 0;
while (cur)
{
size++;
cur = cur->next;
}
return size;*/
//2.0 在结构体创建一个变量SIZE记录元素个数
return q->Size;
}
//检查队列是否为空
int QueueEmpty(Queue* q)
{
assert(q);
return q->head == NULL;
}
//销毁队列
void QueueDestroy(Queue* q)
{
assert(q);
QNode* cur = q->head; //用一个指针cur遍历队列
//然后把队列依次free;
while (cur)
{
QNode* next =cur->pNext;//记录下一个指针地址
free(cur);
cur = next;
}
q->head = q->tail = NULL;
}
Queue.h
#pragma once
#include<stdio.h>
#include<assert.h>
#include<malloc.h>
#include<stdbool.h>
typedef int QDataType;
//队列
typedef struct QListNode
{
struct QListNode* pNext;
QDataType data;
}QNode;
//队列结构
typedef struct Queue
{
QNode* head;
QNode* tail;
size_t Size;
}Queue;
//基本操作实现
//初始化
void QueueInit(Queue* q);
//队尾入列
void QueuePush(Queue* q, QDataType data);
//队头出列
void QueuePop(Queue* q);
//获取队列头部元素
QDataType QueueTop(Queue* q);
//获取队列尾部元素
QDataType QueueBack(Queue* q);
//获取队列种有效元素的个数
int QueueSize(Queue* q);
//检查队列是否为空
int QueueEmpty(Queue* q);
//销毁队列
void QueueDestroy(Queue* q);