队列
队列是运算受限的线性表,和线性表一样也是线性结构,只不过插入只能在队尾插入称为入队,删除只能在队头删除称为出队,和日常生活中的排队顺序一样,是先进先出(FIFO)的线性表。队列存储结构分为顺序存储和链式存储,本文主要介绍 队列的链式存储.
优点:
动态扩容:链式存储结构可以根据实际需求动态扩容,不需要预先确定队列的最大长度,能够更灵活地处理不确定长度的队列。
不会出现溢出问题:链式存储结构不会出现循环队列的溢出问题,可以无限扩展,适合处理大规模数据。
缺点:
占用额外的存储空间:链式存储结构需要额外的指针空间来存储节点之间的关系,占用了额外的存储空间。
**操作复杂:**链式存储结构在插入和删除操作时需要涉及指针的操作,相对于循环顺序存储结构来说,操作可能更加复杂,时间复杂度为O(n)。
代码实现(C语言)
定义
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int DataType;
typedef struct QNode
{
DataType data; //定义结点的数据域
struct QNode *next; //定义结点的指针域
}QNode;
typedef struct{
QNode *front,*rear; //定义队列的头指针和尾指针
}LinkQueue;
初始化
Status InitQueue(LinkQueue *Q)
{
Q->front =Q->rear = (QNode *)malloc(sizeof(QNode));
Q->front->next = NULL; //带头结点的链队列
// Q->front =Q->rear =NULL; 不带头结点
return OK;
}
销毁
Status DestroyQueue(LinkQueue *Q)
{
while(Q->front)
{
Q->rear = Q->front->next; //这里Q->rear 只是当作一个中继指针使用,不做尾指针,也可用一个新的指针
free(Q->front);
Q->front = Q->rear;
}
return OK;
}
判队空
Status IsEmpty(LinkQueue *Q)
{
return Q->front == Q->rear; //带头结点的
// Q-front == NULL; 不带头结点
}
入队
1.链队不需要考虑队满情况,申请一个新结点
2.新结点数据域赋值,因为在队尾插入,所以指针域next赋空.
3.队尾指针的next域指向新结点
4.修改队尾指针指向新结点
//入队
Status EnQueue(LinkQueue *Q, DataType x)
{
QNode *p = (QNode *)malloc(sizeof(QNode));
if(!p)
exit(OVERFLOW);
p->data = x

最低0.47元/天 解锁文章
1461

被折叠的 条评论
为什么被折叠?



