C语言--队列

张开发
2026/5/6 3:56:41 15 分钟阅读
C语言--队列
目录一.定义和特点二.实现方法1.初始化2.销毁3.队尾插入4.队头删除5.取队头数据6.取队尾数据7.取队列中节点个数8.判断队列中是否为空三.整体代码实现一.定义和特点队列中允许一段插入数据另一端删除数据。插入数据的一段叫做队尾删除数据的一段叫做队头。因此它与栈不同的特点是它具有先进先出的特点。二.实现方法队列可以通过数组或链表实现但链表实现优于数组因此选用链表作为例子。1.初始化void QueueInit(Queue* pq) { assert(pq); pq-phead pq-ptail NULL;//对头节点和尾节点置为空 pq-size 0;//无节点size赋为0 }2.销毁void QueueDestroy(Queue* pq) { assert(pq); QNode* pcur pq-phead; while (pcur)//遍历 { QNode* next pcur-next;//新指针存放下一个节点地址 free(pcur);//释放原节点 pcur next;//pcur赋值为下一个节点地址 } //释放完后要重新对pheadptailsize赋值为空 pq-phead pq-ptail NULL; pq-size 0; }3.队尾插入// 队尾插入 void QueuePush(Queue* pq, QDataType x) { assert(pq); //产生新节点 QNode* p1 (QNode*)malloc(sizeof(QNode)); if (p1 NULL) { perror(p1); return; } p1-next NULL;//对新结点赋值 p1-val x; if (pq-ptail NULL)//特殊插入:当队列中无节点时 { pq-phead pq-ptail p1; } else//一般情况插入 { pq-ptail-next p1; pq-ptail p1;//注意ptail位置改变 } pq-size;//注意size大小改变 }4.队头删除void QueuePop(Queue* pq) { assert(pq); assert(pq-size); 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;//注意phead位置改变 } pq-size--;//注意size大小改变 }5.取队头数据QDataType QueueFront(Queue* pq) { assert(pq); assert(pq-phead); return pq-phead-val; }6.取队尾数据QDataType QueueBack(Queue* pq) { assert(pq); assert(pq-ptail); return pq-ptail-val; }7.取队列中节点个数int QueueSize(Queue* pq) { assert(pq); return pq-size; }8.判断队列中是否为空//判断队列中是否为空 bool QueueEmpty(Queue* pq) { assert(pq); return pq-size 0; }三.整体代码实现1.Queue.h#includestdio.h #includestdlib.h #includestdbool.h #includeassert.h typedef int QDataType; typedef struct QueueNode { struct QueueNode* next; QDataType val; }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);2.Queue.c#includeQueue.h //初始化 void QueueInit(Queue* pq) { assert(pq); pq-phead pq-ptail NULL;//对头节点和尾节点置为空 pq-size 0;//无节点size赋为0 } //销毁 void QueueDestroy(Queue* pq) { assert(pq); QNode* pcur pq-phead; while (pcur)//遍历 { QNode* next pcur-next;//新指针存放下一个节点地址 free(pcur);//释放原节点 pcur next;//pcur赋值为下一个节点地址 } //释放完后要重新对pheadptailsize赋值为空 pq-phead pq-ptail NULL; pq-size 0; } // 队尾插入 void QueuePush(Queue* pq, QDataType x) { assert(pq); //产生新节点 QNode* p1 (QNode*)malloc(sizeof(QNode)); if (p1 NULL) { perror(p1); return; } p1-next NULL;//对新结点赋值 p1-val x; if (pq-ptail NULL)//特殊插入:当队列中无节点时 { pq-phead pq-ptail p1; } else//一般情况插入 { pq-ptail-next p1; pq-ptail p1;//注意ptail位置改变 } pq-size;//注意size大小改变 } // 队头删除 void QueuePop(Queue* pq) { assert(pq); assert(pq-size); 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;//注意phead位置改变 } pq-size--;//注意size大小改变 } // 取队头数据 QDataType QueueFront(Queue* pq) { assert(pq); assert(pq-phead); return pq-phead-val; } //取队尾数据 QDataType QueueBack(Queue* pq) { assert(pq); assert(pq-ptail); return pq-ptail-val; } //取队列中节点个数 int QueueSize(Queue* pq) { assert(pq); return pq-size; } //判断队列中是否为空 bool QueueEmpty(Queue* pq) { assert(pq); return pq-size 0; }文章到这里就结束了创造不易如果喜欢的话点个关注点个赞谢谢大家

更多文章