行业知识
C语言/数据结构——队列的实现
2026-11-08 23:42:52
来源:互联网转载
目录
一.前言
二.正文
1.1队列
1.12队列的概念及结构
1.13队列的实现
Queue.h
Queue.c
test.c
三.结言
一.前言
今天我们来聊一聊数据结构的一部分——队列。今天我们主要涉及队列的基本概念结构,以及队列的基本实现。
二.正文
1.1队列
1.12队列的概念及结构
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头
1.13队列的实现
队列也可以用数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。 下面是我学习过程中老师的课件图表:
我们使用单链表实现队列的过程,就像我们之前所分享——单链表实现数据的增删查改
差不多。有兴趣的小伙伴可以了解一下:https://blog.csdn.net/yiqingaa/article/details/138206746?spm=1001.2014.3001.5501
不过和单链表实现数据的增删查改不同的是,这里我们又多定义了一个结构体,用来存放链表的头/尾指针,以及节点个数。
这样设计的好处是:我们不需要使用二级指针,而且也不用传太多的参数。
struct Queue{QNode* phead;QNode* ptail;int size;}; 其他的内容就没有过多改动。
Queue.h
#pragma once#include#include#include#includetypedef int QDataType;struct QueueNode{struct QueueNode* next;QDataType val;};typedef struct QueueNode QNode;struct Queue{QNode* phead;QNode* ptail;int size;};typedef struct Queue Queue;void QueueInit(Queue* ps);//队列的初始化void QueueDestroy(Queue* ps);//队列的销毁void QueuePush(Queue* ps,QDataType x);//队尾插入数据void QueuePop(Queue* ps);//对头删除数据QDataType QueueFront(Queue* ps);//取队头数据QDataType QueueBack(Queue* ps);//取队尾数据int QueueSize(Queue* ps);//测量队列的元素个数bool QueueEmoty(Queue* ps);//判断队列是否为空 Queue.c
#include"Queue.h"void QueueInit(Queue* ps)//队列的初始化{assert(ps);ps->ptail=ps->phead = NULL;ps->size = 0;}void QueuePush(Queue* ps,QDataType x)//队尾的插入{assert(ps);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail!");return;}newnode->next = NULL;newnode->val = x;if (ps->phead == NULL){ps->phead = ps->ptail = newnode;}else{ps->ptail->next = newnode;ps->ptail = newnode;}ps->size++;}void QueuePop(Queue* ps)//队头的删除{assert(ps);assert(ps->size != 0);if (ps->phead == ps->ptail){ps->phead = ps->phead->next;free(ps->ptail);ps->ptail = NULL;}else{QNode* newhead = ps->phead;ps->phead = ps->phead->next;free(newhead);newhead = NULL;}ps->size--;}QDataType QueueFront(Queue* ps)//取出队头数据{assert(ps);assert(ps->size != 0);return ps->phead->val;}QDataType QueueBack(Queue* ps)//取出队尾数据{assert(ps);assert(ps->size != 0);return ps->ptail->val;}int QueueSize(Queue* ps)//测量队列数据个数{assert(ps);return ps->size;}bool QueueEmoty(Queue* ps)//判断队列是否为空{assert(ps);if (ps->phead == NULL){return true;}return false;}void QueueDestroy(Queue* ps)//销毁队列{assert(ps);QNode* pcur = ps->phead;QNode* pnext = pcur->next;while (pnext){free(pcur);pcur = pnext;pnext = pnext->next;}free(pcur);ps->size = 0;ps->phead = NULL;ps->ptail = NULL;} test.c
#include"Queue.h"void test01(){Queue s;QueueInit(&s);QueuePush(&s,1);QueuePush(&s,2);QueuePush(&s,3);QueuePush(&s,4);QueueDestroy(&s);//QueuePop(&s);//QueuePop(&s);//QueuePop(&s);//QueuePop(&s);printf("%d\n", QueueFront(&s));printf("%d\n", QueueBack(&s));}int main(){test01();return 0;} 值得注意的是:test.c只是我在测试函数功能时创建的。小伙伴们自行看看即可。
三.结言
文章到这里就结束了,觉得本文章对自己有用的小伙伴,能不能给个三连。
当然,如本文有些许错误,也请大捞们指正。
上一篇:怎么搭建云服务器网页?