在Codesys用ST语言基于链表实现队列FIFO数据结构详细说明+代...-CODESYS资源下载区-酷德网 - CoDeSys软件教程下载,CoDeSys工控资讯门户 

酷德网

HSC6490-cn中国制造,中国芯~
查看: 4723|回复: 10

在Codesys用ST语言基于链表实现队列FIFO数据结构详细说明+代...

  [复制链接]

该用户从未签到

发表于 2023-4-12 21:57:15 | 显示全部楼层 |阅读模式
在Codesys用ST语言基于链表实现队列FIFO数据结构详细说明+代码实例-1.gif


一、 队列定义

队列是一种先入先出(FIFO——first in first out)线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。

在Codesys用ST语言基于链表实现队列FIFO数据结构详细说明+代码实例-2.png


二、队列实现

实现队列,我们可以使用链表,链表中的每个结点不仅包含值,还包含链接到下一个结点的引用字段。通过这种方式,单链表将所有结点按顺序组织起来。蓝色箭头显示单个链接列表中的结点是如何组合在一起的

在Codesys用ST语言基于链表实现队列FIFO数据结构详细说明+代码实例-3.png

用链表实现队列相对数组实现队列的优点是能节约空间,没有浪费的空间节点。
三、 队列设计

我们分别采用c++和codesys中st语言进行实现链表队列
(1) C++ 语言实现

功能如下

    Push(value) : 向队列中插入一个元素,成功返回truepop():从队列中删除一个元素,成功返回trueFront():从队列头部获取元素,如果队列是空,返回falseRear():从队列尾部获取元素,如果队列为空,返回falseEmpty(): 检测队列是否为空,为空返回trueSize():获得队列节点个数,返回个数
  1. typedefint DataElement;//用户自定义的数据typedefstruct QueueElement//队列元素{
  2.     DataElement  mdata;//用户自定义的数据
  3.     QueueElement* next;//指向下一个节点}QueueElement;//通过链表实现队列classListCircleQueue{public:ListCircleQueue(){};~ListCircleQueue(){};private:
  4.     QueueElement* pHead =0;//
  5.     QueueElement* pTail =0;//队尾指针public:boolpush(DataElement _data){// 申请一个结点空间
  6.         QueueElement* pTemp =(QueueElement*)malloc(sizeof(QueueElement));
  7.          pTemp->mdata = _data;// 申请一个结点空间
  8.          pTemp->next =0;// 结点的next设为NULLif(Empty())// 判断队头和队尾是否为空,用于第一次入队{
  9.              pHead = pTemp;// 判断队头和队尾是否为空,用于第一次入队
  10.              pTail = pTemp;}else{
  11.           pTail->next = pTemp;// 让pTemp成为当前尾部的下一结
  12.            pTail = pTemp;// 尾部指针指向pTemp}returntrue;}boolpop(){if(Empty())returnfalse;if(pHead->next ==0)// 判断队列是否就1个,如果只有一个 ,移除后队列为空 {
  13.             pHead =0;
  14.             pTail =0;}else{
  15.           QueueElement* pTemp = pHead;
  16.           pHead = pHead->next;//移动头部指针delete(pTemp);//清除移除的内存空前}returntrue;};boolFront(DataElement &_data){if(pHead !=0){
  17.           _data = pHead->mdata;//返回头部数据returntrue;}elsereturnfalse;}boolRear(DataElement& _data){if(pTail !=0){
  18.            _data = pTail->mdata;//返回尾部数据returntrue;}elsereturnfalse;}//返回节点个数intSize(){int iSize  =0;
  19.          QueueElement* pTemp = pHead;while(pTemp !=0){
  20.              iSize = iSize +1;
  21.              pTemp = pTemp->next;}return iSize;}//判断队列是否为空boolEmpty(){if((pHead ==0)&&(pTail ==0))returntrue;elsereturnfalse;}}
复制代码
示例如下

在Codesys用ST语言基于链表实现队列FIFO数据结构详细说明+代码实例-4.jpg


(2) Codesys 实现


    编程软件: Codesys V3.5 SP17运行设备:PC电脑编程语言: ST ST 掌握如何创建动态数组 之New的使用;以及指针的灵活使用
定义结构体
  1. //队列操作的数据
  2. TYPE ListQueueElement :
  3. STRUCT
  4.         mData : BaseElement;
  5.         pNext : POINTER TO ListQueueElement;
  6. END_STRUCT
  7. END_TYPE
复制代码
其中 BaseElement 是一个别名,其定义如下,这里BaseElement 是用户自定义数据(比如结构体),采用别名是方便替换。
  1. TYPE BaseElement : INT; END_TYPE
复制代码
定义功能块(FUNCTION_BLOCK): ListQueue,实现如下函数

    Push(value) : 向队列中插入一个元素,成功返回truepop():从队列中删除一个元素,成功返回trueFront():从队列头部获取元素,如果队列是空,返回falseRear():从队列尾部获取元素,如果队列为空,返回falseEmpty(): 检测队列是否为空,为空返回trueSize():获得队列节点个数,返回个数
示例如下
  1. PROGRAM PLC_PRG
  2. VAR        
  3.         t : ListQueue;
  4. END_VAR

  5. VAR
  6.         bInit :BOOL:= FALSE;
  7.         isize : INT;
  8.         ivar1: ARRAY[0..10] OF BaseElement;
  9. END_VAR
复制代码
  1. IF bInit = FALSE THEN
  2.         
  3. bInit := TRUE;

  4. t.Push(11);//入队 ,返回TRUE
  5. t.Push(22);//入队 ,返回TRUE
  6. t.Push(33);//入队 ,返回TRUE
  7. isize := t.Size();//返回3
  8. t.Front(_data =>ivar1[0]);//返回11
  9. t.Pop();//从循环队列中删除一个元素,成功返回true
  10. t.Front(_data =>ivar1[1]);//返回22

  11. END_IF
复制代码
在Codesys用ST语言基于链表实现队列FIFO数据结构详细说明+代码实例-5.jpg


四、 Codesys代码下载
游客,如果您要查看本帖隐藏内容请回复

+11
不赞一个?

最近谁赞过

打赏鼓励一下!
回复

使用道具 举报

该用户从未签到

发表于 2023-9-27 15:08:38 | 显示全部楼层
谢谢谢谢  谢谢谢谢谢谢
+10
不赞一个?
打赏鼓励一下!
回复 支持 反对

使用道具 举报

  • TA的每日心情
    郁闷
    2024-12-16 12:50
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2024-12-16 12:05:46 | 显示全部楼层
    谢谢谢谢  谢谢谢谢谢谢
    +10
    不赞一个?
    打赏鼓励一下!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2025-10-17 08:53
  • 签到天数: 64 天

    [LV.6]常住居民II

    发表于 2024-12-17 08:18:02 | 显示全部楼层
    6666666666666666666666
    +10
    不赞一个?
    打赏鼓励一下!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-7 20:05
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2025-1-7 20:00:58 | 显示全部楼层
                                                       
    +10
    不赞一个?
    打赏鼓励一下!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-4-1 09:40
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2025-1-21 16:12:23 | 显示全部楼层
    aaaaaaaaaaaaaaaaaaaaa
    +10
    不赞一个?
    打赏鼓励一下!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2026-2-1 19:47:17 | 显示全部楼层
    学习学习,谢谢分享
    +10
    不赞一个?
    打赏鼓励一下!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

    本版积分规则

    
    顶部qrcode底部
    关注酷德网订阅号,获取更多资讯!

    QQ|Archiver|手机版|小黑屋|酷德论坛 ( 苏ICP备16065247号-1 )|网站地图

    GMT+8, 2026-11-10 20:52 , Processed in 0.165760 second(s), 87 queries .

    酷德网

    © 2001-2013 Hicodesys. 技术支持 by 酷德网

    快速回复 返回顶部 返回列表