浏览代码

premiers essais

Eric Streit 5 月之前
父节点
当前提交
21c6f5000c

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+*.o
+

+ 12 - 2
SimpleLinkedList/SingleLinkedList.def

@@ -12,14 +12,24 @@ PROCEDURE SearchItem ( item : ; compare : PROC ) : BOOLEAN;
 
 PROCEDURE Traverse (l : List; toDo : PROC);
 *)
-PROCEDURE Empty (l : List): BOOLEAN ;
+PROCEDURE Empty (VAR l : List): BOOLEAN ;
 (*
 PROCEDURE RemoveItem (): BOOLEAN;
 
 PROCEDURE AddItem (): BOOLEAN;
 *)
 
-PROCEDURE DeleteAllItems (l : List);
+PROCEDURE SetPos(l : List; pos : CARDINAL ) : BOOLEAN ;
+
+PROCEDURE GetPosCurrentElement (l : List) : CARDINAL ;
+
+PROCEDURE GetPosLastElement (l : List) : CARDINAL ;
+
+PROCEDURE AddElementLast  (VAR l : List);
+
+PROCEDURE RemoveElement (VAR l : List);
+
+PROCEDURE DoEmptyList (VAR l : List);
 
 PROCEDURE Free (VAR l : List);
 

+ 74 - 10
SimpleLinkedList/SingleLinkedList.mod

@@ -1,6 +1,6 @@
 IMPLEMENTATION MODULE SingleLinkedList;
 
-FROM  SYSTEM IMPORT ADDRESS;
+FROM SYSTEM IMPORT ADDRESS;
 FROM Storage IMPORT ALLOCATE, DEALLOCATE;
 
 TYPE 
@@ -12,12 +12,12 @@ TYPE
               END;  
   List      = POINTER TO ListRec;            
   ListRec   = RECORD
-                firstElement : ElementPtr;
-                lastElement  : ElementPtr;
-                homogene : BOOLEAN; (* allows or not homogene items                            *)
-                CheckType : PROC;   (* procedure to check if the elements are of the same type *)
+                firstElement    : ElementPtr;
+                lastElement     : ElementPtr;
+                currentElement  :  ElementPtr;
+                homogene        : BOOLEAN; (* allows or not homogene items                            *)
+                CheckType       : PROC;   (* procedure to check if the elements are of the same type *)
               END; 
-                      
 
 (*
 PROCEDURE SearchItem ( item : ; compare : PROC ) : BOOLEAN;
@@ -32,7 +32,7 @@ PROCEDURE Traverse (l : List; toDo : PROC);
     ;
   END Traverse;
 *)
-PROCEDURE Empty (l : List): BOOLEAN ;
+PROCEDURE Empty (VAR l : List): BOOLEAN ;
 
   BEGIN
     IF l^.firstElement = NIL THEN
@@ -55,8 +55,66 @@ PROCEDURE AddItem (): BOOLEAN;
   END Add;
 
 *)
+PROCEDURE SetPos(l : List; pos : CARDINAL ) : BOOLEAN ;
 
-PROCEDURE DeleteAllItems (l : List);
+BEGIN
+  IF pos <= l^.lastElement^.pos THEN
+    l^.currentElement^.pos := pos;
+    RETURN TRUE 
+  ELSE 
+    RETURN FALSE   
+  END;
+END SetPos;
+
+PROCEDURE GetPosCurrentElement (l : List) : CARDINAL ;
+
+  BEGIN
+    RETURN l^.currentElement^.pos
+  END GetPosCurrentElement;
+
+PROCEDURE GetPosLastElement (l : List) : CARDINAL ;
+
+  BEGIN
+    RETURN l^.lastElement^.pos
+  END GetPosLastElement;
+
+
+PROCEDURE AddElementLast  (VAR l : List );
+
+VAR 
+  localElementPtr : ElementPtr;
+  
+  BEGIN
+     IF l # NIL THEN
+      (*creating NEW element first, THEN add it TO the list *)
+      NEW(localElementPtr);
+      localElementPtr^.next := NIL;
+      localElementPtr^.item := NIL;
+      IF l^.firstElement = NIL THEN
+        l^.firstElement := localElementPtr;
+        localElementPtr^.pos := 0;
+      ELSE 
+        localElementPtr^.pos := l^.lastElement^.pos + 1;  
+      END; 
+      l^.currentElement := localElementPtr;
+      l^.lastElement := localElementPtr;
+    END 
+   
+  END AddElementLast ;
+  
+PROCEDURE RemoveElement (VAR l : List);
+
+  BEGIN
+    ;
+  END RemoveElement;
+    
+PROCEDURE DoEmptyList (VAR l : List);
+
+BEGIN
+
+END DoEmptyList;
+
+PROCEDURE DeleteAllItems (VAR l : List);
 
 BEGIN
 
@@ -66,17 +124,23 @@ PROCEDURE Free ( VAR l : List);
 
 BEGIN 
   DeleteAllItems(l);
+  DoEmptyList(l);
   l^.firstElement := NIL;
+  l^.lastElement := NIL;
+  l^.currentElement := NIL;
   l^.homogene := TRUE ;
   l^.CheckType := NIL;
-  DISPOSE (l);
+  DISPOSE (l);               (* destroying the List structure record *)
+  l := NIL;
 END Free;
 
 PROCEDURE Init ( VAR l : List; mode : BOOLEAN ; p : PROC );
 
   BEGIN
-    NEW (l);
+    NEW (l);                 (* creating the List structure record *)
     l^.firstElement := NIL;
+    l^.lastElement := l^.firstElement;
+    l^.currentElement := l^.firstElement;
     l^.homogene := mode;
     l^.CheckType := p;
   END Init;

二进制
SimpleLinkedList/SingleLinkedList.o


+ 47 - 0
SimpleLinkedList/Tests/testSingleLinkedList1.mod

@@ -5,6 +5,7 @@ FROM InOut IMPORT Write, WriteLn, WriteString, WriteCard;
 
 VAR 
   oneList : SingleLinkedList.List;
+  ok : BOOLEAN;
 
 BEGIN
   SingleLinkedList.Init(oneList, FALSE , NIL );
@@ -15,5 +16,51 @@ BEGIN
     WriteString("y'a un stuck ;) ");
     WriteLn
   END;    
+  SingleLinkedList.AddElementLast(oneList);
+  IF SingleLinkedList.Empty(oneList) THEN
+    WriteString("liste vide");
+    WriteLn
+  ELSE
+    WriteString("y'a un element :) ");
+    (* test de position *)
+    WriteCard(oneList^.lastElement^.pos ,5);
+    WriteCard(SingleLinkedList.GetPosCurrentElement(oneList), 5);
+    WriteCard(SingleLinkedList.GetPosLastElement(oneList), 5);
+    WriteLn;
+  END; 
+  
+   SingleLinkedList.AddElementLast(oneList);
+  IF SingleLinkedList.Empty(oneList) THEN
+    WriteString("liste vide");
+    WriteLn
+  ELSE
+    WriteString("y'a un element :) ");
+    (* test de position *)
+    WriteCard(oneList^.lastElement^.pos ,5);
+    WriteCard(SingleLinkedList.GetPosCurrentElement(oneList), 5);
+    WriteCard(SingleLinkedList.GetPosLastElement(oneList), 5);
+    WriteLn;
+  END;  
+  
+  
+  (* test de SetPos : 2 cas *)
+  (* cas 1 où pos est dans l'intervalle des positions actuelles *)
+  
+  ok := SingleLinkedList.SetPos(oneList,0);
+  IF ok THEN
+    WriteString("OK !"); WriteLn;
+  ELSE
+    WriteString("Not ok!!!!!!!"); WriteLn
+  END;  
+  
+  
+  (* cas 2 où pos est hors intervalle *)
+  ok := SingleLinkedList.SetPos(oneList,5);
+  IF ok THEN
+    WriteString("OK !"); WriteLn;
+  ELSE
+    WriteString("Not ok!!!!!!!"); WriteLn
+  END;   
   SingleLinkedList.Free (oneList);
+  
 END testSingleLinkedList1.

二进制
SimpleLinkedList/testSingleLinkedList1