首页 > 其他分享 >队列——链式存储

队列——链式存储

时间:2024-05-26 19:30:46浏览次数:18  
标签:存储 队列 结点 链式 front NULL LinkNode rear 指针

核心思路:

1、首先定义队列结点,包含数据域和指针域;然后定义链式队列,包含队列节点类型的队头和队尾指针。
2、初始化:
    带头结点:给头结点分配内存,然后队头和队尾指针指向头结点,同时队头指针的next指向NULL。
    不带头结点:队头和队尾指针都指向NULL。
3、入队:
    带头结点:先给入队节点分配内存,然后将新节点插入到队尾指针后面,新节点的下一个节点为NULL,最后将队尾指针指向新结点。
    不带头结点:先给入队节点分配内存 ,如果队列为空 ,队头和队尾结点都指向新节点,否则将新节点插入到队尾指针后面,最后将队尾指针指向新结点。
4、出队:
    带头结点:首先判断队列是否为空,然后定义指针p指向队头指针的下一个结点,如果这是最后一个结点,则front=rear ,最后释放p的内存。
    不带头结点:首先判断队列是否为空, 然后定义指针p指向队头指针指向的结点,如果这是最后一个结点,则front=NULL,rear=NULL ,最后释放p的内存。

代码:

#include<stdio.h>
#include<stdlib.h>

//定义 
typedef struct LinkNode{        //队列结点 
    int data;
    struct LinkNode *next;
}LinkNode;
typedef struct{        //链式队列 
    LinkNode *rear,*front;
}LinkQueue;

//初始化——带头结点 
void InitQueue(LinkQueue &Q){
    Q.front=Q.rear=(LinkNode *)malloc(sizeof(LinkNode));
    Q.front->next=NULL; 
} 

//初始化——不带头结点 
void InitQueue_(LinkQueue &Q){
    Q.front=NULL;
    Q.rear=NULL;
} 

//入队——带头结点 
bool EnQueue(LinkQueue &Q,int x){
    LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));    //给新节点分配内存 
    s->data=x; 
    s->next=NULL;
    Q.rear->next=s;        //新节点插入到尾指针后面 
    Q.rear=s;     //尾指针指向新插入的结点 
    return true;
} 

//入队——不带头结点 
bool EnQueue_(LinkQueue &Q,int x){
    LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));    //给新节点分配内存 
    s->data=x; 
    s->next=NULL;
    if(Q.front==NULL){
        Q.front=s;
        Q.rear=s;
    } 
    else{
        Q.rear->next=s;        
        Q.rear=s;
    }
    return true;
} 

//出队——带头结点
bool DeQueue(LinkQueue &Q,int &x){
    if(Q.front==Q.rear)        //首先判断队空 
        return false;
    
    LinkNode *p=Q.front->next;    
    x=p->data;
    Q.front->next=p->next;
    
    if(Q.rear==p){    //这是最后一个结点 
        Q.rear=Q.front; 
    }
    free(p);
    return true; 
} 

//出队——不带头结点
bool DeQueue_(LinkQueue &Q,int &x){
    if(Q.front==NULL)        //首先判断队空 
        return false;
    
    LinkNode *p=Q.front;    //不带头结点时头指针指向队头元素 
    x=p->data;
    Q.front=p->next;
    
    if(Q.rear==p){    //这是最后一个结点 
        Q.rear=NULL;
        Q.front=NULL; 
    }
    free(p);
    return true; 
} 

//队列的链式存储一般不会出现队满的情况,除非内存不足 

int main(){
    
} 

标签:存储,队列,结点,链式,front,NULL,LinkNode,rear,指针
From: https://blog.csdn.net/qq_46137895/article/details/139219141

相关文章

  • aardio 队列
    1//queue队列结构2//队列的特点:先进先出3importconsole;4classqueueEx{5ctor(){6this.items={}7};8//排队9入队=function(element){10..table.push(this.items,element);11}12//出列13出队......
  • TIDB存储TiKV的键值对数据
    1.TiDB概述TiDB是一款开源分布式关系型数据库,同时支持在线事务处理(OLTP)与在线分析处理(OLAP)的混合型(HybridTransactionalandAnalyticalProcessing,HTAP)分布式数据库,具备水平扩容或缩容、金融级高可用、实时HTAP、Kubernetes云原生的分布式数据库、兼容MySQL5......
  • Java队列简介
    在现代应用程序开发中,队列是一种常见且强大的数据结构,用于存储和管理待处理的任务序列。结合MySQL数据库,我们可以利用队列实现任务的持久化存储与高效处理。本文将通过四个案例,详细介绍如何在Java中使用队列,并结合MySQL数据库实现数据的存储与检索,涵盖基础队列操作、消息队列......
  • etcd MVCC 存储结构及流程
    什么是MVCCMVCC是Multi-VersionConcurrencyControl的缩写,即多版本并发控制。它是一种并发控制的方法,用于在数据库系统中实现事务的隔离性。MVCC是一种乐观锁机制,它通过保存数据的多个版本来实现事务的隔禽性。在etcd中,MVCC是用于实现数据的版本控制的。而且可以查看历......
  • 每比特极致性价比的存储技术是如何实现单位存储成本的最小化的?
    每比特极致性价比的存储技术实现单位存储成本的最小化,主要通过存储体系结构的创新、介质应用的创新以及存储介质的突破等。下面将深入探讨这些关键技术点:存储体系结构创新新型存算分离技术:基于新型高速网络总线CXL/UB等,研究内存、存储等资源的高性能、高可靠池化共享及弹性伸......
  • 每比特极致性价比的存储技术
    每比特极致性价比的存储技术是指在确保数据存储性能和可靠性的基础上,通过技术创新和优化,实现单位存储成本的最小化。这涉及到存储体系结构的创新、介质应用的创新以及存储介质本身的突破。下面将围绕这一概念进行深入分析,探讨其研究挑战方向、关键技术点以及对未来存储技术发展......
  • 【数据结构】栈和队列
    栈和队列栈栈的实现stack.h文件stack.c文件队列队列的实现queue.h文件queue.c文件栈栈:一种特殊的线性表,其中允许在固定的一端进行插入和删除元素操作,进行数据插入和删除操作的一段称为栈顶,另一端称为栈底,栈中的数据元素遵守后进先出的原则LIFO(lostinfirstout)......
  • MySQL-存储引擎
    MySQL体系结构1).连接层最上层是一些客户端和链接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。2).服务层第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行......
  • C++U7-06-图的进阶存储
    上节课作业讲解:链接:https://pan.baidu.com/s/1A3Y5_12IgwYbmuep0Q2w6Q?pwd=0000提取码:0000  邻接表和链式前向星都是图论中用于表示图的常用数据结构,它们各自有特定的特点和用途。以下是对这两种数据结构的详细解释:邻接表定义与特点:邻接表是用来表示有限图的无序列表的......
  • 软考高级之redis中使用zset实现延迟队列,你答对了么?
    实现延迟队列的思路zset的特性,带有分数的排序,以时间戳作为分数进行排序添加任务zdd取出任务zrangbyscore执行任务zrem定时任务publicstaticvoidmain(String[]args){Jedisjedis=newJedis("ip",6379);TimerTasktask=newTimerTask()......