数据结构——队列的链式存储(优缺点及代码实现:C语言)

队列

队列是运算受限的线性表,和线性表一样也是线性结构,只不过插入只能在队尾插入称为入队,删除只能在队头删除称为出队,和日常生活中的排队顺序一样,是先进先出(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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值