ST语言基于Codesys3.5的线性表结构(ADT)移植

codesys编译环境允许unicode编译,故一些变量设置成中文,方便阅读和维护。

TYPE node :
STRUCT
	I_Data		:INT;
	next		:POINTER TO node;
END_STRUCT
END_TYPE
PROGRAM Main
VAR
	链表			:POINTER TO NODE;
	录入数据		:INT;
	返回数据		:INT;
	删除的内容	:INT;
	创建结点数	:INT;
	返回结点位置	:INT;
	插入结点位置	:INT;
	删除结点位置	:INT;
	Status		:INT;
	I_FLAG0		:INT;
	Count		:INT;
	B_Init		:bool:=true;
	TEST		:BOOL;
END_VAR

IF TEST THEN
	IF B_Init THEN
		链表		:=__NEW(POINTER TO node,SIZEOF(node));//右键“Application”属性,启用内存动态分配
		链表^.next	:=0;
		B_Init:=FALSE;
	END_IF
	//初始化一个链表头结点
	IF I_FLAG0.0 THEN//头插法(一次性多个)
		Status		:=CreatListHead(Listadr:=ADR(链表),num:=创建结点数,Data:=录入数据);//约每1000字节,允许生成6个该结构体结点
		I_FLAG0.0	:=FALSE;
	END_IF
	
	IF I_FLAG0.1 THEN//尾插法(一次性多个)
		Status		:=CreatListTail(Listadr:=ADR(链表),num:=创建结点数,Data:=录入数据);
		I_FLAG0.1	:=FALSE;
	END_IF
	
	IF I_FLAG0.2 THEN//取得XX结点数据域内容
		Status		:=GetElem(list:=链表,i:=返回结点位置,Elemtype:=ADR(返回数据));
		返回结点位置:=0;
		I_FLAG0.2	:=FALSE;
	END_IF
	
	IF I_FLAG0.3 THEN//任意位置插入结点
		Status		:=ListInsert(Listadr:=ADR(链表),i:=插入结点位置,InsertData:=999);
		插入结点位置:=0;
		I_FLAG0.3	:=FALSE;
	END_IF
	
	IF I_FLAG0.4 THEN//任意位置删除结点
		Status		:=ListDelete(Listadr:=ADR(链表),i:=删除结点位置,Data_Delete:=ADR(删除的内容));
		删除结点位置:=0;
		I_FLAG0.4	:=FALSE;
	END_IF
	
	IF I_FLAG0.5 THEN//头结点之后插入一个结点
		AddHead(Listadr:=ADR(链表),Data:=123);
		I_Flag0.5	:=FALSE;
	END_IF
	
	IF I_FLAG0.6 THEN//清空单链表
		Status		:=ClearList(Listadr:=ADR(链表));
		I_FLAG0.6	:=FALSE;
	END_IF
END_IF

FUNCTION AddHead
VAR_INPUT
	Listadr		:POINTER TO POINTER TO node;
	Data		:INT;
END_VAR
VAR
	New			:POINTER TO node;
END_VAR

New			:=__NEW(POINTER TO node,SIZEOF(node));
NEW^.I_Data	:=Data;

IF Listadr^^.next <> 0 THEN//非空链表
	NEW^.next		:=	Listadr^^.next;
	Listadr^^.next	:=	NEW;
ELSE
	Listadr^^.next	:=	NEW;
	NEW^.next		:=	0;
END_IF

Listadr^^.I_Data := Listadr^^.I_Data + 1;//存结点总数
FUNCTION CreatListHead :int
VAR_INPUT
	Listadr			:POINTER TO POINTER TO node;
	Data			:INT;
	num				:INT;
END_VAR
VAR
	temp			:POINTER TO node;
	i				:INT;
END_VAR

FOR i:=1 TO num BY 1 DO
	temp			:=__NEW(POINTER TO node,SIZEOF(node));
	IF  (temp = 0) THEN
		CreatListHead:=101;//内存分配失败
		EXIT;
	END_IF
	Data			:=i;
	temp^.I_Data	:=Data;
	temp^.next		:=Listadr^^.next;
	Listadr^^.next	:=temp;
END_FOR
Listadr^^.I_Data := Listadr^^.I_Data + num;//存结点总数
FUNCTION CreatListTail : int
VAR_INPUT
	Listadr		:POINTER TO POINTER TO node;
	Data		:INT;
	num			:INT;
END_VAR
VAR
	temp		:POINTER TO node;
	temp1		:POINTER TO node;
	i			:INT;
END_VAR
temp	:=Listadr^;

FOR i:=1 TO num BY 1 DO
	temp1			:=__NEW(POINTER TO node,SIZEOF(node));
	IF temp1 = 0 THEN
		CreatListTail	:=101;//内存分配失败
	END_IF
	temp1^.next		:=0;
	Data			:=i;
	temp1^.I_Data	:=Data;
	temp^.next		:=temp1;
	temp			:=temp1;
END_FOR

Listadr^^.I_Data := Listadr^^.I_Data + num;
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值