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
	
	TEST		:=FALSE;
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;

(__Delete操作符不能有效释放结点内存,待研究;PLAN B:使用内存池,存储删除的结点)
待更新

你可能感兴趣的:(ST语言基于Codesys3.5的线性表结构(ADT)移植)