From 0507c76d08c18ad93c3dadf362f0a1834ff96c92 Mon Sep 17 00:00:00 2001
From: wienkop <uwe.wienkop@th-nuernberg.de>
Date: Tue, 30 Mar 2021 11:19:43 +0200
Subject: [PATCH] 2021-03-30 Liste mit Indexer, GetEnumerator, AddBeforeNth,
 DeleteFirst

---
 02-4 VerketteteStrukturenIntro/Liste.cs   | 76 ++++++++++++++++++++---
 02-4 VerketteteStrukturenIntro/Program.cs | 26 ++++++--
 03-UbgListe-Di/03-UbgListe-Di.csproj      |  9 +++
 03-UbgListe-Di/Program.cs                 | 31 +++++++++
 03-UbgListe-Di/ToDoListe.cs               | 59 ++++++++++++++++++
 Prog2WienkopSS2021.sln                    |  8 ++-
 6 files changed, 196 insertions(+), 13 deletions(-)
 create mode 100644 03-UbgListe-Di/03-UbgListe-Di.csproj
 create mode 100644 03-UbgListe-Di/Program.cs
 create mode 100644 03-UbgListe-Di/ToDoListe.cs

diff --git a/02-4 VerketteteStrukturenIntro/Liste.cs b/02-4 VerketteteStrukturenIntro/Liste.cs
index bf2f38a..0b68013 100644
--- a/02-4 VerketteteStrukturenIntro/Liste.cs	
+++ b/02-4 VerketteteStrukturenIntro/Liste.cs	
@@ -4,16 +4,23 @@ using System.Text;
 
 namespace _02_4_VerketteteStrukturenIntro
 {
-    class LItem
-    {
-        public int zahl;
-        public LItem next;
-
-        public LItem(int k) { zahl = k; next = null; }
-    }
+    
     class Liste
     {
-        public LItem first, last;
+        // LItem ist eine private Klasse der Klasse Liste
+        // private ~ Liste darf auf LItem zugreifen
+        // Methoden außerhalb von Liste dürfen dies nicht!
+        private class LItem
+        {
+            public int zahl;
+            public LItem next;
+
+            public LItem(int k) { zahl = k; next = null; }
+        }
+                
+        private LItem first, last;
+        private int anz;
+
         public Liste()
         {
             first = last = null;
@@ -21,6 +28,7 @@ namespace _02_4_VerketteteStrukturenIntro
         public void AddLast(int k)
         {
             LItem neu = new LItem(k);
+            anz++;
 
             if (first == null)
                 first = last = neu;
@@ -33,6 +41,7 @@ namespace _02_4_VerketteteStrukturenIntro
         public void AddFirst(int k)
         {
             LItem neu = new LItem(k);
+            anz++;
 
             if (first == null)
                 first = last = neu;
@@ -54,5 +63,56 @@ namespace _02_4_VerketteteStrukturenIntro
             //    item = item.next;
             //}
         }
+        public int this[int ind]
+        {
+            get
+            {
+                LItem item = first;
+                for (int i = 0; i < ind; i++)
+                    item = item.next;
+                return item.zahl;
+            }
+        }
+        public IEnumerator<int> GetEnumerator()
+        {
+            for (LItem item = first; item != null; item = item.next)
+                yield return item.zahl;
+        }
+
+
+        public void AddBeforeNth(int index, int zahl)
+        {
+            if (index < 0 || index > anz)
+                throw new ArgumentOutOfRangeException("Index außerhalb der Listengröße");
+            if (index == 0)
+                AddFirst(zahl);
+            else if (index == anz)
+                AddLast(zahl);
+            else // Wir wissen: Nicht vor das erste und nicht hinter das letzte Element
+                 // Es gibt mindestens ein Element VORHER und ein Element NACHHER
+            {
+                LItem neu = new LItem(zahl);
+                anz++;
+                LItem item = first;
+                for (int i = 1; i < index; i++) // Element mit index-1 suchen
+                    item = item.next;
+
+                // REIHENFOLGE ist ENTSCHEIDEND
+                neu.next = item.next;   // #1 Nachfolgeradresse im neuen Elem. speichern
+                item.next = neu;        // #2 Nachfolger von Elem[index-1] auf das neue Element setzen
+            }
+        }
+
+        public void DeleteFirst()
+        {
+            if (anz == 0)
+                return;
+
+            anz--;
+            if (anz == 0)
+                first = last = null;
+            else // Wir wissen: Die Liste enthält MEHR als ein Element!
+                first = first.next;
+        }
     }
 }
diff --git a/02-4 VerketteteStrukturenIntro/Program.cs b/02-4 VerketteteStrukturenIntro/Program.cs
index ad42e13..1b25948 100644
--- a/02-4 VerketteteStrukturenIntro/Program.cs	
+++ b/02-4 VerketteteStrukturenIntro/Program.cs	
@@ -31,12 +31,30 @@ namespace _02_4_VerketteteStrukturenIntro
             l1.AddLast(20);
             l1.AddLast(30);
 
-            for (int i = 100; i < 110; i++)
-                l1.AddLast(i);
+            //for (int i = 100; i < 110; i++)
+            //    l1.AddLast(i);
 
-            l1.AddFirst(5);
+            //l1.AddFirst(5);
 
-            l1.Ausgabe();
+            //l1.Ausgabe();
+
+
+            // Bitte so nicht programmieren!!!
+            // Durch den Indexer sehr ineffizient!
+            //for (int i = 0; i < 1000000; i++)
+            //{
+            //    Console.WriteLine($"{i}. Element: {l1[i]}");
+            //}
+
+            l1.AddBeforeNth(2, 25);
+
+            int sum = 0;
+            foreach (int item in l1)
+            {
+                Console.WriteLine($"Liste: {item}");
+                sum += item;
+            }
+            Console.WriteLine($"Die Summe beträgt: {sum}");
         }
     }
 }
diff --git a/03-UbgListe-Di/03-UbgListe-Di.csproj b/03-UbgListe-Di/03-UbgListe-Di.csproj
new file mode 100644
index 0000000..bf48e79
--- /dev/null
+++ b/03-UbgListe-Di/03-UbgListe-Di.csproj
@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <RootNamespace>_03_UbgListe_Di</RootNamespace>
+  </PropertyGroup>
+
+</Project>
diff --git a/03-UbgListe-Di/Program.cs b/03-UbgListe-Di/Program.cs
new file mode 100644
index 0000000..833456e
--- /dev/null
+++ b/03-UbgListe-Di/Program.cs
@@ -0,0 +1,31 @@
+using System;
+
+namespace _03_UbgListe_Di
+{
+    class Program
+    {
+        // Listenstruktur anlegen (string)
+        // anf, ende - Zeiger
+        // anz - mitzählen
+        // Add-Befehl
+        // GetAll() -- Alle gespeicherten string-Einträge als Feld zurückliefern
+        static void Main(string[] args)
+        {
+            ToDoListe toDoListe = new ToDoListe();
+            toDoListe.Add("Bericht fertigstellen");
+            toDoListe.Add("Webseite aktualisieren");
+
+            //string[] aufgaben = toDoListe.GetAll();
+            //foreach (var item in aufgaben)
+            //{
+            //    Console.WriteLine(item);
+            //}
+
+            foreach (var item in toDoListe)
+            {
+                Console.WriteLine(item);
+            }
+            Console.WriteLine(toDoListe[1]);
+        }
+    }
+}
diff --git a/03-UbgListe-Di/ToDoListe.cs b/03-UbgListe-Di/ToDoListe.cs
new file mode 100644
index 0000000..cd7bd71
--- /dev/null
+++ b/03-UbgListe-Di/ToDoListe.cs
@@ -0,0 +1,59 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace _03_UbgListe_Di
+{
+    class LItem
+    {
+        public string toDo;
+        public LItem next;
+        public LItem (string ToDo) { toDo = ToDo;next = null; }
+    }
+    class ToDoListe
+    {
+        LItem anf = null, ende = null;
+        int anz = 0;
+
+        public void Add(string todo)
+        {
+            LItem neu = new LItem(todo);
+            anz++;
+
+            if (anf == null)
+                anf = ende = neu;
+            else
+            {
+                ende.next = neu;
+                ende = neu;
+            }
+        }
+        public string [] GetAll()
+        {
+            if (anz == 0)
+                return null;
+
+            string[] res = new string[anz];
+            int i = 0;
+            for (LItem item = anf; item != null; item=item.next)
+                res[i++] = item.toDo;
+            return res;
+        }
+        public IEnumerator<string> GetEnumerator()
+        {
+            for (LItem item = anf; item != null; item = item.next)
+                yield return item.toDo;
+        }
+        public string this[int ind]
+        {
+            get
+            {
+                LItem item = anf;
+                for (int i = 0; i < ind; i++)
+                    item = item.next;
+                return item.toDo;
+            }
+        }
+
+    }
+}
diff --git a/Prog2WienkopSS2021.sln b/Prog2WienkopSS2021.sln
index cf5db06..0d2b9d0 100644
--- a/Prog2WienkopSS2021.sln
+++ b/Prog2WienkopSS2021.sln
@@ -19,7 +19,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "02-UbgKlasseTime-Di", "02-U
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "02-4 VerketteteStrukturenIntro", "02-4 VerketteteStrukturenIntro\02-4 VerketteteStrukturenIntro.csproj", "{1FC21BA1-47A7-4466-BA80-A29C0AFD5FB6}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "03-UbgKlasseTime-Mo", "03-UbgKlasseTime-Mo\03-UbgKlasseTime-Mo.csproj", "{DD51B164-0F20-47B9-94C4-549CE555DDC2}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "03-UbgKlasseTime-Mo", "03-UbgKlasseTime-Mo\03-UbgKlasseTime-Mo.csproj", "{DD51B164-0F20-47B9-94C4-549CE555DDC2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "03-UbgListe-Di", "03-UbgListe-Di\03-UbgListe-Di.csproj", "{0E5C379D-0D10-4CAC-A12C-4757DE1E5C4E}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -63,6 +65,10 @@ Global
 		{DD51B164-0F20-47B9-94C4-549CE555DDC2}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{DD51B164-0F20-47B9-94C4-549CE555DDC2}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{DD51B164-0F20-47B9-94C4-549CE555DDC2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0E5C379D-0D10-4CAC-A12C-4757DE1E5C4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0E5C379D-0D10-4CAC-A12C-4757DE1E5C4E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0E5C379D-0D10-4CAC-A12C-4757DE1E5C4E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0E5C379D-0D10-4CAC-A12C-4757DE1E5C4E}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
-- 
GitLab