Browse Source

on avance dans les listes

Eric Streit 5 tháng trước cách đây
mục cha
commit
c1cf6d6845

+ 3 - 1
SimpleLinkedList/SingleLinkedList.def

@@ -25,9 +25,11 @@ PROCEDURE GetPosCurrentElement (l : List) : CARDINAL ;
 
 PROCEDURE GetPosLastElement (l : List) : CARDINAL ;
 
+PROCEDURE AddElement (VAR l : List; pos : CARDINAL) : BOOLEAN ;
+
 PROCEDURE AddElementLast  (VAR l : List);
 
-PROCEDURE RemoveElement (VAR l : List);
+PROCEDURE RemoveElement (VAR l : List; pos : CARDINAL ) : BOOLEAN ;
 
 PROCEDURE DoEmptyList (VAR l : List);
 

+ 82 - 2
SimpleLinkedList/SingleLinkedList.mod

@@ -78,6 +78,33 @@ PROCEDURE GetPosLastElement (l : List) : CARDINAL ;
     RETURN l^.lastElement^.pos
   END GetPosLastElement;
 
+PROCEDURE AddElement (VAR l : List; pos : CARDINAL) : BOOLEAN ;
+
+VAR 
+  localElementPtr : ElementPtr;
+  localElementPtr1 : ElementPtr;
+  localElementPtr2 : ElementPtr;
+  
+BEGIN
+  IF l # NIL THEN
+    IF pos > l^.lastElement^.pos THEN
+      RETURN FALSE
+    END;
+    localElementPtr := l^.firstElement;
+    WHILE  l^.localElementPtr^.pos # pos DO
+      localElementPtr := localElementPtr^.next;
+    END;
+    localElementPtr1 := localElementPtr^.next; 
+     NEW(localElementPtr2);
+     localElementPtr2^.next := localElementPtr1;
+     localElementPtr^.next:= localElementPtr;
+     WHILE localElementPtr1 # NIL DO
+       localElementPtr1^.pos := localElementPtr1^.pos + 1
+     END;
+  ELSE 
+    RETURN  TRUE
+  END; 
+END AddElement;
 
 PROCEDURE AddElementLast  (VAR l : List );
 
@@ -102,12 +129,65 @@ VAR
    
   END AddElementLast ;
   
-PROCEDURE RemoveElement (VAR l : List);
+PROCEDURE FindElement (l : List ; pos : CARDINAL ; VAR p : ElementPtr) : BOOLEAN ;
 
+VAR
+  localElementPtr : ElementPtr;
+  localElementPtrNext : ElementPtr;
+  localPos : CARDINAL;
+  
   BEGIN
-    ;
+    (* test if pos is not outside intervalle *)
+    IF pos > l^.lastElement^.pos THEN 
+      RETURN FALSE 
+    END;
+    
+    localElementPtr := l^.firstElement;
+    
+    (* test if pos is the first element *)
+    IF pos = 0 THEN
+      p := localElementPtr;
+      RETURN TRUE 
+    END;  
+
+    (* other cases : we go the list along*) 
+    WHILE localElementPtr # NIL DO
+      localElementPtr := localElementPtr^.next;
+      IF localElementPtr^.pos = pos THEN 
+        p := localElementPtr;
+        RETURN TRUE 
+      END;
+    END;
+    RETURN FALSE 
+  END FindElement;  
+  
+  
+PROCEDURE RemoveElement (VAR l : List; pos : CARDINAL ) : BOOLEAN ;
+
+VAR
+  localElementPtr1 : ElementPtr;
+  localElementPtr2 : ElementPtr;
+  
+  BEGIN
+    IF l # NIL THEN 
+      IF pos > l^.lastElement^.pos THEN
+        RETURN FALSE 
+      ELSIF pos = l^.firstElement THEN 
+      
+      
+      ELSIF  pos = l^.lastElement THEN
+        
+        
+      ELSE 
+      (* case where the element is in-betwwen *)
+      
+      END;
+    ELSE   
+      RETURN FALSE   
+    END;
   END RemoveElement;
     
+
 PROCEDURE DoEmptyList (VAR l : List);
 
 BEGIN

+ 4 - 0
SimpleLinkedList/Tests/testSingleLinkedList1.mod

@@ -44,6 +44,7 @@ BEGIN
   
   
   (* test de SetPos : 2 cas *)
+  
   (* cas 1 où pos est dans l'intervalle des positions actuelles *)
   
   ok := SingleLinkedList.SetPos(oneList,0);
@@ -63,4 +64,7 @@ BEGIN
   END;   
   SingleLinkedList.Free (oneList);
   
+  
+  
+  
 END testSingleLinkedList1.