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;