高端行业网站建设,网站怎么做海外推广,中国建筑工程网官网二建报名查询,做推广赚钱的网站有哪些前言: #x1f4a5;#x1f388;个人主页:Dream_Chaser#xff5e; #x1f388;#x1f4a5; ✨✨专栏:http://t.csdn.cn/oXkBa ⛳⛳本篇内容:c语言数据结构--C语言实现队列 目录
一.队列概念及结构
1.1队列的概念
1.2队列的结构
二.队列的实现
2.1头文…前言: 个人主页:Dream_Chaser ✨✨专栏:http://t.csdn.cn/oXkBa ⛳⛳本篇内容:c语言数据结构--C语言实现队列 目录
一.队列概念及结构
1.1队列的概念
1.2队列的结构
二.队列的实现
2.1头文件
2.2链式队列的结构定义
2.3队列接口的定义
2.4初始化队列
2.5判断队列是否为空
2.6销毁队列
2.7队尾入队列
2.8队头出队列
2.9获取队列头部元素
2.10获取队列队尾元素
2.11获取队列中有效元素个数
2.12打印队列元素
Test.c
Queue.h
Queue.c 一.队列概念及结构
1.1队列的概念 队列只允许 在一端进行插入数据操作在 另一端进行删除数据操作的特殊线性表队列具有 先进先出 FIFO(First In First Out) 入队列 进行插入操作的一端称为 队尾 出队列 进行删除操作的一端称为 队头 1.2队列的结构 二.队列的实现 队列也可以数组和链表的结构实现使用链表的结构实现更优一些因为如果使用数组的结构出队列在数组头上出数据效率会比较低 2.1头文件
#includestdio.h
#includeassert.h
#includestdbool.h
#includestdlib.h
2.2链式队列的结构定义
typedef int QDataType;
typedef struct QueueNode
{ QDataType data;struct QueueNode* next;
}QNode;typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;//表示队列整体,一个是出数据一个是入数据.QueueNode结构体表示队列中的节点每个节点包含一个数据项 data 和一个指向下一个节点的指针 next。Queue结构体表示整个队列包含指向队列头部和尾部节点的指针 phead 和 ptail以及记录队列大小的变量 size 2.3队列接口的定义
void QueueInit(Queue* pq);// 初始化队列void QueueDestroy(Queue* pq);// 销毁队列void QueuePush(Queue* pq, QDataType x);// 队尾入队列void QueuePop(Queue* pq);// 队头出队列QDataType QueueFront(Queue* pq);// 获取队列头部元素QDataType QueueBack(Queue* pq);// 获取队列队尾元素int QueueSize(Queue* pq);// 获取队列中有效元素个数bool QueueEmpty(Queue* pq);// 检测队列是否为空如果为空返回非零结果如果非空返回0
2.4初始化队列
void QueueInit(Queue* pq)
{assert(pq);// 检查指针是否为空pq-pheadNULL; //将队列的头指针置为空pq-ptail NULL;//将队列的尾指针置为空pq-size 0;// 将队列的头指针置为空
}2.5判断队列是否为空
bool QueueEmpty(Queue* pq)
{assert(pq);//方法一,将队列的头指针以及尾指针置空//return pq-phead NULL pq-ptailNULL;//方法二,将队列的有效元素置空return pq-size 0;
} 2.6销毁队列
代码解析: assert(pq) 用于断言 pq 指针不为空确保传入的指针有效。 创建一个指针 cur并将其初始化为队列的头指针 pq-phead。 进入循环遍历队列中的每个节点。 在循环中首先保存当前节点的下一个节点指针为 next以便在释放当前节点后能够访问下一个节点。 使用 free(cur) 释放当前节点的内存。 将指针 cur 移动到下一个节点即 cur next。 循环继续直到遍历完队列中的所有节点。 在循环结束后将队列的头指针和尾指针 pq-phead、pq-ptail 都置为空表示队列已经为空。 将队列的大小 pq-size 置为 0表示队列中没有元素。 void QueueDestroy(Queue* pq)
{assert(pq);// 检查指针是否为空QNode* cur pq-phead;// 创建一个指针 cur指向队列的头指针while (cur){QNode* next cur-next;// 创建一个指针 cur指向队列的头指针free(cur);// 释放当前节点的内存cur next;// 将指针 cur 移动到下一个节点}pq-phead pq-ptail NULL;// 将队列的头指针和尾指针置为空pq-size 0;// 将队列的大小置为0
} 2.7队尾入队列
第一种情况:尾插第一个队列元素 第二种情况:已有元素前提下尾插节点
先尾插节点后把新节点的地址给ptail(让ptail指向新节点) void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode (QNode*)malloc(sizeof(QNode));// 创建一个新的节点if (newnode NULL){perror(malloc fail\n);// 检查内存分配是否成功return;}newnode-data x;// 设置新节点的数据为传入的元素值newnode-next NULL;// 将新节点的指针域置空//一个节点if (pq-ptail NULL)// 判断队列是否为空{assert(pq-phead NULL);// 如果队列为空头指针也应为空pq-phead pq-ptail newnode;// 将新节点同时设置为队列的头节点和尾节点}//多个节点else{pq-ptail-next newnode;// 将新节点同时设置为队列的头节点和尾节点pq-ptail newnode;// 更新队列的尾指针为新节点}pq-size;// 增加队列的大小计数
}
代码执行: 2.8队头出队列
第一种:队列只有一个元素时 第二种:队列有多个元素时 void QueuePop(Queue* pq)
{assert(pq);// 检查指针是否为空assert(!QueueEmpty(pq));// 检查队列是否非空assert(pq-phead);// 检查队列的头指针是否存在//1.一个节点if (pq-phead-next NULL) // 队列只有一个节点的情况{free(pq-phead); // 释放队列头节点的内存pq-phead pq-ptail NULL;// 将队列的头指针和尾指针置为空}//2.多个节点else{QNode* next pq-phead-next; //保存队列头节点的下一个节点指针free(pq-phead);// 释放队列头节点的内存pq-phead next;// 更新队列的头指针为下一个节点}pq-size--;//减少队列的大小计数
}代码执行: 2.9获取队列头部元素
QDataType QueueFront(Queue* pq)
{assert(pq);// 检查指针是否为空assert(!QueueEmpty(pq));// 检查队列是否非空assert(pq-phead);// 检查队列的头指针是否存在return pq-phead-data;// 返回队列头节点的数据
}
代码执行: 2.10获取队列队尾元素
QDataType QueueBack(Queue* pq)
{assert(pq);// 检查队列是否非空assert(!QueueEmpty(pq));// 检查队列是否非空assert(pq-ptail);// 检查队列的尾指针是否存在return pq-ptail-data;//返回队列尾节点的数据
}
代码执行: 2.11获取队列中有效元素个数
int QueueSize(Queue* pq)
{assert(pq);//检查指针是否为空return pq-size;//返回队列的大小元素个数
}
代码执行: 2.12打印队列元素
void QPrint(Queue* pq)
{assert(pq);QNode* cur pq-phead;QNode* next cur;while (cur ! NULL){printf(%d , cur-data);cur cur-next;}
}
代码执行: Test.c
#includeQueue.h
void TestQueue1()//元素入队列
{Queue q;QueueInit(q);QueuePush(q,1);QueuePush(q,2); //printf(%d , QueueFront(q));//QueuePop(q);QueuePush(q,3);QueuePush(q,4);//printf(Size:%d\n, QueueSize(q));//QPrint(q);while (!QueueEmpty(q)){printf(%d , QueueFront(q));QueuePop(q);}printf(\n);
}
void TestQueue2()//元素出队列
{Queue q;QueueInit(q);QueuePush(q, 1);QueuePush(q, 2);QueuePush(q, 3);QueuePush(q, 4);printf(%d\n, QueueFront(q));QueuePop(q);printf(%d\n, QueueFront(q));QueuePop(q);printf(%d\n, QueueFront(q));QueuePop(q);printf(%d\n, QueueFront(q));printf(\n);
}
void TestQueue3()//获取队列头部和尾部元素,和队列元素个数
{Queue q;QueueInit(q);QueuePush(q, 1);QueuePush(q, 2);QueuePush(q, 3);QueuePush(q, 4);printf(队列头部元素:%d\n,QueueFront(q));printf(队列尾部元素:%d\n, QueueBack(q));printf(Size:%d\n, QueueSize(q));/*while (!QueueEmpty(q)){printf(%d , QueueFront(q));QueuePop(q);}*/printf(\n);
}
void TestQueue4()//打印队列
{Queue q;QueueInit(q);QueuePush(q, 1);QueuePush(q, 2);QueuePush(q, 3);QueuePush(q, 4);QPrint(q);printf(\n);
}
int main()
{//TestQueue1();//元素入队列//TestQueue2();//元素出队列//TestQueue3();//获取队列头部和尾部元素,和队列元素个数TestQueue4();
}
Queue.h
#pragma once
#includestdio.h
#includeassert.h
#includestdbool.h
#includestdlib.h
typedef int QDataType;
typedef struct QueueNode
{ QDataType data;struct QueueNode* next;
}QNode;typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;//表示队列整体,一个是出数据一个是入数据.void QueueInit(Queue* pq);// 初始化队列
void QueueDestroy(Queue* pq);// 销毁队列
void QueuePush(Queue* pq, QDataType x);// 队尾入队列
void QueuePop(Queue* pq);// 队头出队列
QDataType QueueFront(Queue* pq);// 获取队列头部元素
QDataType QueueBack(Queue* pq);// 获取队列队尾元素
int QueueSize(Queue* pq);// 获取队列中有效元素个数
bool QueueEmpty(Queue* pq);// 检测队列是否为空如果为空返回非零结果如果非空返回0Queue.c
#includeQueue.h
void QueueInit(Queue* pq)
{assert(pq);// 检查指针是否为空pq-pheadNULL; // 将队列的头指针置为空pq-ptail NULL;// 将队列的头指针置为空pq-size 0;// 将队列的头指针置为空
}void QPrint(Queue* pq)
{assert(pq);QNode* cur pq-phead;QNode* next cur;while (cur ! NULL){printf(%d , cur-data);cur cur-next;}
}void QueueDestroy(Queue* pq)
{assert(pq);// 检查指针是否为空QNode* cur pq-phead;// 创建一个指针 cur指向队列的头指针while (cur){QNode* next cur-next;// 创建一个指针 cur指向队列的头指针free(cur);// 释放当前节点的内存cur next;// 将指针 cur 移动到下一个节点}pq-phead pq-ptail NULL;// 将队列的头指针和尾指针置为空pq-size 0;// 将队列的大小置为0
}void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode (QNode*)malloc(sizeof(QNode));// 创建一个新的节点if (newnode NULL){perror(malloc fail\n);// 检查内存分配是否成功return;}newnode-data x;// 设置新节点的数据为传入的元素值newnode-next NULL;// 将新节点的指针域置空//一个节点//多个节点if (pq-ptail NULL)// 判断队列是否为空{assert(pq-phead NULL);// 如果队列为空头指针也应为空pq-phead pq-ptail newnode;// 将新节点同时设置为队列的头节点和尾节点}else{pq-ptail-next newnode;// 将新节点同时设置为队列的头节点和尾节点pq-ptail newnode;// 更新队列的尾指针为新节点}pq-size;// 增加队列的大小计数
}void QueuePop(Queue* pq)
{assert(pq);// 检查指针是否为空assert(!QueueEmpty(pq));// 检查队列是否非空assert(pq-phead);// 检查队列的头指针是否存在//1.一个节点if (pq-phead-next NULL) // 队列只有一个节点的情况{free(pq-phead); // 释放队列头节点的内存pq-phead pq-ptail NULL;// 将队列的头指针和尾指针置为空}else{//头删QNode* next pq-phead-next; //保存队列头节点的下一个节点指针free(pq-phead);// 释放队列头节点的内存pq-phead next;// 更新队列的头指针为下一个节点}pq-size--;//减少队列的大小计数
}QDataType QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));// 检查队列是否非空assert(pq-phead);// 检查队列的头指针是否存在return pq-phead-data;// 返回队列头节点的数据
}QDataType QueueBack(Queue* pq)
{assert(pq);// 检查队列是否非空assert(!QueueEmpty(pq));// 检查队列是否非空assert(pq-phead);// 检查队列的头指针是否存在return pq-ptail-data;//返回队列尾节点的数据
}int QueueSize(Queue* pq)
{assert(pq);//检查指针是否为空return pq-size;//返回队列的大小元素个数
}
bool QueueEmpty(Queue* pq)
{assert(pq);//方法一,将队列的头指针以及尾指针置空//return pq-phead NULL pq-ptailNULL;//方法二,将队列的有效元素置空return pq-size 0;
} 本篇结束如有错误欢迎大家指正感谢来访