个人主页:欢迎大家光临——>沙漠下的胡杨
各位大帅哥,大漂亮
如果觉得文章对自己有帮助
可以一键三连支持博主
你的每一分关心都是我坚持的动力
![]()
☄: 本期重点:用链表实现队列
希望大家每天都心情愉悦的学习工作。
目录
队列的概念和结构:
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out)
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头
示意图如下:
我们在队列的实现方面,可以用数组和链表共同实现,但是如果用数组实现的话,我们在头部出数据时要移动数据,不太方面并且有扩容空间浪费,所以我们采用链表实现队列。链式结构不用考虑数据的挪动和扩容问题。
链式队列的实现:
头文件篇:
首先我们通过队列的性质可以知道,要完成先进先出的性质,我们需要一个结构体包含着一个头结点,一个尾节点,方便我们进行如队列和出队列,并且可以使我们不用二级指针就可以完成相对应的操作。另外我们还要创建一个链表的结点,存放数据,结构如下:
typedef int QDataType; typedef struct QueueNode//链表 { QDataType data; struct QueueNode* next; }QNode; typedef struct Queue//队列 { QNode* head; QNode* tail; }Queue;
剩下的就是函数接口,包括了初始化,销毁,插入,删除,取队列首元素,取尾元素,判断队列是否为空,返回队列元素个数。
void QueueInit(Queue* qp);//初始化 void QueueDestroy(Queue* qp);//队列的销毁 void QueuePush(Queue* qp,QDataType x);//队列插入 void QueuePop(Queue* qp);//队列删除 QDataType QueueFront(Queue* qp);//取出队列首元素 QDataType QueueBack(Queue* qp);//取出队列末尾元素 bool QueueEmpty(Queue* qp);//判断队列是否为空 int QueueSize(Queue* qp);//返回队列的元素个数
下面我们进入实现部分。
函数接口实现篇(源文件篇)
队列的初始化:
void QueueInit(Queue* qp)//初始化 { assert(qp); qp->head = qp->tail = NULL; }
首先判断是否为空,然后把头尾都置为NULL。
队列的销毁:
void QueueDestroy(Queue* qp)//队列的销毁 { assert(qp); QNode* cur = qp->head; while (cur) { QNode* next = cur->next; free(cur); cur = next; } qp->head = qp->tail = NULL; }
我们先创建一个链表的结点用于遍历,然后在free前,先创建一个新的链表指针,用于保存下一个结点,否则 free 这个节点之后就找不到下一个结点啦,最后就是把队列的头结点和尾节点都置为NULL。(千万记住是创建的是链表的指针,不要创建为队列的指针)。
队列的插入:
void QueuePush(Queue* qp,QDataType x)//队列插入 { assert(qp); QNode *newnode = (QNode*)malloc(sizeof(QNode)); if (newnode == NULL) { perror("malloc fail\n"); exit(-1); } newnode->next = NULL; newnode->data = x; if (qp->head == NULL) { qp->head = qp->tail = newnode; } else { qp->tail->next = newnode; qp->tail = newnode; } }