东直门小学的网站建设,网站建设方案书网络部署方案,百度公司销售卖什么的,百度站长平台开绿色收录通道加快网站收录大家好#xff0c;我是苏貝#xff0c;本篇博客带大家了解队列#xff0c;如果你觉得我写的还不错的话#xff0c;可以给我一个赞#x1f44d;吗#xff0c;感谢❤️ 目录 一. 队列的概念及结构二. 队列的实现队列的结构体初始化销毁队尾插入队头删除显示第一个节点的值… 大家好我是苏貝本篇博客带大家了解队列如果你觉得我写的还不错的话可以给我一个赞吗感谢❤️ 目录 一. 队列的概念及结构二. 队列的实现队列的结构体初始化销毁队尾插入队头删除显示第一个节点的值显示最后一个节点的值是否为空队列的大小 三. 模块化代码实现Queue.hQueue.cTest.c结果演示 一. 队列的概念及结构
队列只允许在一端进行插入数据操作在另一端进行删除数据操作的特殊线性表队列具有先进先出的性质。FIFO(First In First Out) 入队列进行插入操作的一端称为队尾 出队列进行删除操作的一端称为队头 二. 队列的实现
1
队列的结构体
因为数组在头删的时候不方便所以我们采用单链表来实现。
typedef int QDataType;typedef struct QueneNode
{QDataType val;struct QueneNode* next;
}QNode;typedef struct Quene
{QNode* phead;//指向第一个节点QNode* ptail;//指向最后一个节点int size;
}Quene;2
初始化
因为我们要对队列进行初始化所以实参要传Queue类型变量的地址用一级指针来接收。因为实参Queue类型变量的地址不可能为NULL所以对它断言下面的接口同理。
void QueneInit(Quene* pq)
{assert(pq);pq-phead NULL;pq-ptail NULL;pq-size 0;
}3
销毁
void QueneDestroy(Quene* pq)
{assert(pq);QNode* cur pq-phead;while (cur){QNode* next cur-next;free(cur);cur next;}pq-phead NULL;pq-ptail NULL;pq-size 0;
}4
队尾插入
插入前要创建一个新节点插入时还要判断队列是否为空若为空则让pq-phead pq-ptail newnode。若不为空则只让pq-ptail -next newnode再pq-ptailpq-ptail-next 注意不要忘记pq-size
void QuenePush(Quene* pq, QDataType x)
{assert(pq);//创建一个新节点QNode* newnode (Quene*)malloc(sizeof(Quene));if (newnode NULL){perror(malloc fail);return;}newnode-next NULL;newnode-val x;//插入if (pq-ptail NULL){pq-phead pq-ptail newnode;}else{pq-ptail-next newnode;pq-ptail pq-ptail-next;}pq-size;
}5
队头删除
删除时要保证队列里有元素所以对pq-phead断言下面的显示第一个/最后一个节点的值同理 注意当队列里只有一个元素时删除后pq-phead指向NULL没错但是此时pq-ptail是野指针所以也要将pq-ptail置为NULL。不要忘记pq-size- -
void QuenePop(Quene* pq)
{assert(pq);assert(pq-phead);QNode* next pq-phead-next;free(pq-phead);pq-phead next;if (pq-phead NULL){pq-ptail NULL;}pq-size--;
}6
显示第一个节点的值
QDataType QueneFront(Quene* pq)
{assert(pq);return pq-phead-val;
}7
显示最后一个节点的值
QDataType QueneBack(Quene* pq)
{assert(pq);return pq-ptail-val;
}8
是否为空
bool QueneEmpty(Quene* pq)
{assert(pq);return pq-phead NULL;
}9
队列的大小
int QueneSize(Quene* pq)
{assert(pq);return pq-size;
}三. 模块化代码实现
Queue.h
#includestdio.h
#includeassert.h
#includestdbool.htypedef int QDataType;typedef struct QueneNode
{QDataType val;struct QueneNode* next;
}QNode;typedef struct Quene
{QNode* phead;QNode* ptail;int size;
}Quene;//初始化
void QueneInit(Quene* pq);
//销毁
void QueneDestroy(Quene* pq);
//队尾插入
void QuenePush(Quene* pq, QDataType x);
//队头删除
void QuenePop(Quene* pq);
//显示第一个节点的值
QDataType QueneFront(Quene* pq);
//显示最后一个节点的值
QDataType QueneBack(Quene* pq);
//是否为空
bool QueneEmpty(Quene* pq);
//队列大小
int QueneSize(Quene* pq);Queue.c
#includeQuene.h//初始化
void QueneInit(Quene* pq)
{assert(pq);pq-phead NULL;pq-ptail NULL;pq-size 0;
}//销毁
void QueneDestroy(Quene* pq)
{assert(pq);QNode* cur pq-phead;while (cur){QNode* next cur-next;free(cur);cur next;}pq-phead NULL;pq-ptail NULL;pq-size 0;
}//队尾插入
void QuenePush(Quene* pq, QDataType x)
{assert(pq);//创建一个新节点QNode* newnode (Quene*)malloc(sizeof(Quene));if (newnode NULL){perror(malloc fail);return;}newnode-next NULL;newnode-val x;//插入if (pq-ptail NULL){pq-phead pq-ptail newnode;}else{pq-ptail-next newnode;pq-ptail pq-ptail-next;}pq-size;
}//队头删除
void QuenePop(Quene* pq)
{assert(pq);assert(pq-phead);QNode* next pq-phead-next;free(pq-phead);pq-phead next;if (pq-phead NULL){pq-ptail NULL;}pq-size--;
}//显示第一个节点的值
QDataType QueneFront(Quene* pq)
{assert(pq);return pq-phead-val;
}//显示最后一个节点的值
QDataType QueneBack(Quene* pq)
{assert(pq);return pq-ptail-val;
}//是否为空
bool QueneEmpty(Quene* pq)
{assert(pq);return pq-phead NULL;
}//队列大小
int QueneSize(Quene* pq)
{assert(pq);return pq-size;
}Test.c
#includeQuene.hint main()
{Quene p;QueneInit(p);QuenePush(p, 1);QuenePush(p, 2);QuenePush(p, 3);QuenePush(p, 4);QuenePush(p, 5);while (!QueneEmpty(p)){printf(%d , QueneFront(p));QuenePop(p);}QueneDestroy(p);return 0;
}结果演示 好了那么本篇博客就到此结束了如果你觉得本篇博客对你有些帮助可以给个大大的赞吗感谢看到这里我们下篇博客见❤️