链式队列

顺序队列/链式队列         队列是另一种限定性的线性表,他只允许在表的一端插入元素,而在表的另一端删除元素,具有“先进先出”的特点。在队列中,允许插入的一端称为队尾,允许删除的一端称为队首。        与线性表相似,队列也有两种存储结构:顺序队列和链式队列。一,顺序队列        顺序队列使用顺序表来实现的,即队列中的元素均存放在一片连续的内存空间中。通过该片内存的地址对队列中元素进行访问。之前是用数... 阅读详情

/*武汉大学,物理科学与技术学院,材料物理,盛华平*/

 

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

typedef int ElemType;

typedef struct queueNode/*链式队列结点的类型定义*/
{
 ElemType data;  /*数据域*/
 struct queueNode *next;  /*指针域*/
}QueueNode;

typedef struct      //链式队列的类型定义
{
 QueueNode  *front;    //队头指针
 QueueNode  *rear;     //队尾指针
}LinkQueue;

//链式队列的初始化
void QueueInitial(LinkQueue  *pQ)
{//指针pQ所指向的链式队列初始化为有表头结点链表
 pQ->front=(QueueNode *)malloc(sizeof(QueueNode));
 if(pQ->front==NULL)
 {
  printf("内存分配失败!/n");
  exit(1);
 }
 pQ->rear=pQ->front;
 pQ->front->next=NULL;    //头结点指针域置空
}

//链式队列判空
int IsEmpty(LinkQueue  *pQ)
{//链队为空时返回1,否则返回0
 return pQ->front==pQ->rear;
}

//元素进队
void EnQueue(LinkQueue *pQ,ElemType e)
{//将元素e插入到队尾
 QueueNode  *p;
 p=(QueueNode *)malloc(sizeof(QueueNode));
 if(p==NULL)    //内存分配失败
 {
  printf("内存分配失败!/n");
  exit(1);
 }
 p->data=e;
 p->next=NULL;   //设置为尾结点
 pQ->rear->next=p;   //尾部插入
 pQ->rear=p;   //尾指针后移
}

//元素出队
ElemType DeQueue(LinkQueue *pQ)
{//若队列元素不为空,则删除队头元素,并返回它的值
 QueueNode  *first;
 ElemType temp;
 if(IsEmpty(pQ))       //队列为空,退出
 {
  printf("空对!/n");
  exit(1);
 }
 first=pQ->front->next;  //first指向队列头结点
 temp=first->data;      //暂存队头元素值
 pQ->front->next=first->next;    // 摘下队头结点
 if(pQ->rear==first)        //只有一个结点时,修改尾指针
  pQ->rear=pQ->front;
 free(first);
 return temp;
}

//取队头元素值
ElemType GetFront(LinkQueue  *pQ)
{//若队列不为空,则返回队头元素的值
 QueueNode *first;
 if(IsEmpty(pQ))
 {
  printf("空对!/n");
  exit(1);
 }
 first=pQ->front->next;//first指向队头元素
 return first->data;//返回队头元素值
}

//队列置空
void MakeEmpty(LinkQueue *pQ)
{//清楚队列中所有元素,仅保留头结点
 QueueNode *p,*q;//p为当前结点指针
 p=pQ->front->next;//p指向第一个元素结点
 while(p!=NULL)  //当没有到达队尾时
 {
  q=p;
  p=p->next;  //当前节点指针后移
  free(q);
 }
 pQ->front->next=NULL;  //头结点指针域置空
 pQ->rear=pQ->front;  //队头与队尾指针指向头结点
}

//销毁队列
void Destroy(LinkQueue *pQ)
{//销毁链队所有结点的存储空间
 QueueNode *p,*q;//p为当前结点指针
 p=pQ->front;//p指向表头结点
 while(p!=NULL)
 {
  q=p;
  p=p->next;//当前结点指针后移
  free(q);
 }
 pQ->rear=pQ->front=NULL;//对头与队尾指针置空
}

void main()
{
 int m,n,i,j,e;
 printf("链式队列的实现/n/n");
    LinkQueue Q;
    LinkQueue *pQ=&Q;
 pQ->front=pQ->rear=NULL;
   
 for(;;)
 {
  printf("/n/n");
  printf("请选择您要执行的操作1~9:/n");
  printf("1:初始化队列/n");
  printf("2:判空/n");
  printf("3:元素进队/n");
  printf("4:出队一个元素/n");
  printf("5:输出出队序列/n");
  printf("6:取队头元素/n");
  printf("7:队列置空/n");
  printf("8:销毁队列/n");
  printf("9:退出/n");
       
  scanf("%d",&m);
  while(m<1||m>9)
  {
   printf("输入有误,请输入1~10之间的数字!/n");
   scanf("%d",&m);
  }
  switch(m)
  {
  case 1:  QueueInitial(pQ);
        printf("初始化成功! ");break;
  case 2:  if(pQ->front==NULL)
     {  printf("请先初始化队列!/n"); break; }
        if(IsEmpty(pQ))
      printf("队列为空!");
        else
      printf("队列非空!");
     break;
  case 3:  if(pQ->front==NULL)
     {  printf("请先初始化队列!/n");break; }
        printf("请输入要进队的元素个数:");
     scanf("%d",&i);
        for(j=0;j<i;j++)
     {
      printf("请输入第%d个元素:/n",j+1);
      scanf("%d",&e);
      EnQueue(pQ,e);
     }
     break;
  case 4:  if(pQ->front==NULL)
     {  printf("请先初始化队列!/n"); break; }
        printf("出队元素为:%d",DeQueue(pQ));
        break;
  case 5:  if(pQ->front==NULL)
     {  printf("请先初始化队列!/n");
      break; }
        printf("出队序列为:/n");
        while(pQ->rear!=pQ->front)
      printf("%d/t",DeQueue(pQ));
     break;
  case 6:  if(pQ->front==NULL)
     {  printf("请先初始化队列!/n");
        break; }
        printf("队头元素为:%d",GetFront(pQ));
        break;
  case 7:  if(pQ->front==NULL)
     {  printf("请先初始化队列!/n");break; }
        MakeEmpty(pQ);
     break;
  case 8:  if(pQ->front==NULL)
     {  printf("请先初始化队列!/n"); break; }
        Destroy(pQ);
        break;
  case 9: return;
  }
 }
}

建立数据域值为字符型的链式队列 #include #include #include #include #define ElemType char typedef struct LQNode { ElemType data;//结点的数据域 struct LQNode *next;//定义指向下一结点的指针 }LQNode,*QueuePtr; typedef struct { QueueP 阅读详情

相关推荐

18650锂电池充放电测试全流程:从实验室到实际应用的避坑指南

本文详细介绍了18650锂电池充放电测试的全流程,从实验室设备选型到实际应用中的常见问题解决方案。涵盖测试前的准备工作、标准测试流程执行、动态工况测试以及数据深度分析方法,为电池测试工程师和科研人员提供实用的避坑指南。特别针对电压平台异常和温度异常等关键问题,提供了专业的诊断与解决措施。

weixin_30790841的博客 545

c语言设计一个字符型的链队列,C语言实现链式队列(单队列版本)

#include #include /*written on 2018-5-29 23:31:47some errors not fixed at func::clear然后我就曲线救了一下国,clear2函数可以正常使用这一段代码还有一些其他的错误,比如,在gdb进行调试的时候会出现SIGTRAP的问题,但是能正常运行原因不明*/// 实现链队列,这里非循环队列typedef int ElemT...

weixin_29611239的博客 359

在ROS中使用行为树

在ROS中使用行为树 我提供的工程示例文件: demo链接 文章目录在ROS中使用行为树0、 学习本教程的前提1、 behaviorTree 库安装(ROS使用下的安装方式)2、 处理 behaviortree 库并准备好 service 和 ros action2.1 对ROS 的 service 和 action 进行封装,使其在 behaviortree 上使用更加方便。2.2 创建一个 service 和一个 action2.3 创建与决策树相关的数据类型2.4 修改`package.xml`文件2

qq_37416258的博客 6376

c语言设计一个字符型的链队列,跪求c语言的高手,链式队列设计问题

运行结果:totalelement >1-->2-->3-->4-->5-->6-->7-->8-->9totalelement >6-->7-->8-->9totalelement >6-->7-->8-->9-->0-->10-->20-->30-->40the4...

weixin_35433448的博客 159

CANoe信号波形分析保姆级教程:Graphic窗口从配置到实战避坑

本文详细解析了CANoe的Graphic窗口在信号波形分析中的高效配置与实战应用技巧。从信号显示模式选择、测量光标进阶操作到信号分组策略,提供工程化解决方案,帮助工程师快速定位总线信号异常,提升汽车电子开发与测试效率。

weixin_29279047的博客 267

从牛顿冷却定律到热传导方程:一维热传导方程的物理直觉与数学推导

本文从牛顿冷却定律出发,结合傅里叶热传导定律和能量守恒原理,系统推导了一维热传导方程的数学形式。通过微元分析和物理直觉,揭示了温度随时间变化与空间二阶导数之间的关系,并阐释了热扩散率α的物理意义。文章还探讨了方程的边界条件、数值解法及其在材料科学和工程中的应用,为理解热量传递提供了清晰的物理图像和数学框架。

palm99的专栏 838

数据结构——链队列的基本操作(字符类型数据入队的问题)

数据结构—链队列的基本操作(字符类型数据入队的问题) 注:本文主要讲述字符型数据 入队遇到的问题以及解决方案,若想详细了解基本操作功能及讲解请移步其他文章。<功能源码可全部复制>   我在入队操作时候,通过循环输入三个字符,发现第三位字符无法进队,需要增加一次循环才可以全部入队,而且入队之后打印输出元素,发现前面多了一项换行的字符   产生原因:由于在输入元素个数时候,需要按回车键进行下一步,此时就默认在输入数据1 a 2前方默认有个换行符,所以在进行入队操作时,实际入队为:‘\n’ ‘1

qq_41605893的博客 978

redhawk:Low Power Analysis

1.rush current与switch cell 在standby状态下为了控制leakage power我们选择power gating的设计方式,使用power switch cell关闭block/power domain的电源。 power switch的基本介绍可见: 低功耗设计-Power Switch power switch的table中有四种状态,对应block工作、待机和上电,下电。low power analysis主要分析上电的过程。 上电过程可以看做mos电容

m0_61544122的博客 3206

链式队列,队列篇(链式队列的出队入队操作)

数据结构专升本学习,队列篇(链式队列) 前言: 上一篇博主简单讲解了顺序队列和循环队列,今天讲解队列最后一篇链式队,链式队在数据结构中用到比较多,用来做一些排队的算法,还有链式队列是也是和链式栈一样采用链表的方式来表现,链式队列针对数据比较灵活的数据比较方便,因为它不像顺序队列一样需要定义最大值,链式队列只需要建立新结点,比较灵活,没有大小限制,只要内存,并且用完了就释放了,对于变动较大的数据很友好。 每日一遍,防止颓废 1.理解链式队列逻辑,认识核心代码 所谓队列的链式存储结构是用一个线性链表来表示一个

qq_46104786的博客 2万+

超声波雷达探测车位及信号处理方法

在APA泊车中用到了超声波雷达,第一次接触,总结研究之。

周陽讀書 1229

欺诈文本分类微调(一):基座模型选型

通义千问Qwen2具有0.5B、1.5B、7B、72B等一系列参数大小不等的模型,我们需要做的是从大到小依次测试每个模型的能力,找到满足自己需要的最小参数模型。依1.5B和1.5B-Instruct的主要区别:按照官方文档,前者是预训练模型,后者是经过指令微调的模型。

golfxiao的专栏 2655

队列——顺序队列和链式队列

队列是一种遵循先进先出(FIFO)原则的线性表,仅允许在队尾插入、队头删除。其核心体现在缓冲协调(平衡速度差异)、延时任务管理(如订单超时处理)、多线程协作(阻塞队列)及LRU缓存淘汰等场景。顺序队列用数组实现,存在“假溢出”问题,通过循环队列解决,牺牲一个存储单元以(rear+1)%MAX_SIZE==front判断队满,front==rear判队空。链式队列基于链表,动态分配内存,无溢出风险,入队时尾插新节点,出队删除队头节点并释放内存,通过front和rear指针维护队列状态,适用于长度不确定的场景。

2503_92090935的博客 2222

基于DeepFashion2和YOLOv12的服装检测系统:从数据集构建到UI界面实现

官方网站:数据集大小: 约80GB(压缩包)包含训练集、验证集和测试集数据集目录结构:text复制下载├── train/└── test/├── image/├── annos/Backbone优化:使用更高效的CSPNet结构Neck增强:引入BiFPN特征金字塔网络Head改进:使用解耦头(Decoupled Head)提升分类和定位精度损失函数:采用CIoU损失和分类Focal Loss训练策略:引入Mosaic数据增强和自适应锚框python复制下载。

YOLO 498

【链式队列的实现】

一个完整的链式队列包含头指针,尾指针,头结点,一般结点这四个部分//<1>队列结点结构定义//队结点数据域,用来存储队列元素//队结点指针域,用来指向下一个队结点//QNode: 链队列结点类型,用来定义队结点//QNodePtr: 链队列结点指针类型,用来定义队结点指针//<2>队列链式定义//定义链队的头指针,尾指针}LinkQueue;//LinkQueue:通过LinkQueue定义链队列;通过 定义出的链队列 访问队列的头指针,尾指针。

2401_82676816的博客 1218

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

链式栈和链式队列

链式栈和链式队列的优点:不用像顺序栈和顺序队列一样,进行扩容。 链式栈 class LinkStack<T>{ // 链表的第一个节点充当栈顶元素 private Entry<T> bottom; // 栈底 private int count; // 记录链表节点的个数 public LinkStack(){ bottom...

qq_44822679的博客 401

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

链式栈与链式队列学习

数据结构与算法(C++实现)学习笔记(七) 1.链式栈 1.1链式栈简介 链式栈是一种数据存储结构,可以通过单链表的方式来实现,使用链式栈的优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,但是需要为每个栈元素分配额外的指针空间用来存放指针域。 栈是只能在某一端插入和删除的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底(push),最后...

ttdss12345678的博客 826

顺序队列和链式队列

队列采用顺序存储结构来表示,即在内存中用一组地址连续的存储单元依次存放从队头到队尾的数据元素。 有一点要注意,当队尾rear=MAX_SIZE时候,队列并不一定占满。 判断队列为空的条件front == rear 判断队列满的条件为 (rear + 1) % MAX_SIZE == front 进队操作:rear = (rear + 1) % MAX_SIZE 出队操作:front = (front + 1) % MAX_SIZE 在这里插入代码片 #include<stdio.h> #inc

qq_26646107的博客 2132

【数据结构】链式队列

链式队列(Linked Queue)是使用链表实现的队列,它克服了顺序队列中的假溢出问题,并且,通过动态分配内存,链式队列可以灵活地调整队列大小,不受固定容量限制。

猫猫的小茶馆 1142

十、数据结构——链式队列

本篇文章详细介绍了数据结构中的链式队列。链式队列是一种通过链表实现的队列,具有动态增长和高效的特性。文章首先定义了链式队列的节点结构和队列结构,然后详细讲解了链式队列的基本操作,包括初始化队列、判断队列是否为空、入队操作、出队操作和获取队列长度。示例代码带有详细注释,演示了入队、出队、打印队列和获取队列长度的操作,帮助读者更好地理解链式队列的使用。链式队列适用于动态管理数据的场景,通过本文,读者可以掌握链式队列的概念和操作,并了解其在数据结构中的重要应用。文章还提醒读者注意动态内存管理和异常处理。

qq_57737603的博客 4481

链式队列的实现

/* 队列是一种先进先出线性表,队列是线性表的特化 也具有线性表的性质分为:顺序队列与链式队列 链式队列与线性表的单链表相似只不过链式队列只 允许从头部进行删除、尾部进行插入.需要为链式队列 创建一个头结点包括两个指针,指向队头的指针(front) 与指向队尾的指针(rear).当两个指针相等时队列为空*/ #ifndef LINKQUEUE_H #define LINKQUEUE_H

flying0033的专栏 1万+

队列的链式存储

队列的链式存储 实验目的 1.掌握队列的数据类型描述及队列的特点。 2.掌握队列的顺序和链式两种存储结构的特点及算法描述。 3.掌握队列的5种基本运算及算法在两种不同存储结构上的实现。 实验内容 1、实现链式队列的进队列、出队列、判断队列空否、显示队列中全部元素的运算。 2、设计一个选择式菜单,以菜单方式选择队列的各种操作。 实验代码 #include<stdio.h> { if (!q)return FALSE; q->front = -1; q->rear = -1;

路在前方 557

链式栈与链式队列

链式队列是一种队列,其元素使用链表结构存储,每个节点包含存储的数据和指向下一个节点的指针。链式队列的队首和队尾分别由链表的头节点和尾节点来表示。

m0_71637218的博客 853
上一篇: 菜单功能,实现循序队列
下一篇: 链式队列 字符型
Kinshipa
博客等级 码龄17年 6粉丝 10原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值