From 715f2802ac5d633789e3811e17394ee35bd20831 Mon Sep 17 00:00:00 2001
From: wienkop <uwe.wienkop@th-nuernberg.de>
Date: Tue, 13 Apr 2021 11:33:04 +0200
Subject: [PATCH] 2021-04-13 Doppelt-verkettete Liste

---
 .../04-2 DoppeltVerketteteListe.csproj        |   9 ++
 04-2 DoppeltVerketteteListe/Personenliste.cs  | 122 ++++++++++++++++++
 04-2 DoppeltVerketteteListe/Program.cs        |  19 +++
 04-UbgCycleList-Di/CycleList.cs               |  46 ++++++-
 04-UbgCycleList-Di/Program.cs                 |   2 +
 Prog2WienkopSS2021.sln                        |   6 +
 6 files changed, 203 insertions(+), 1 deletion(-)
 create mode 100644 04-2 DoppeltVerketteteListe/04-2 DoppeltVerketteteListe.csproj
 create mode 100644 04-2 DoppeltVerketteteListe/Personenliste.cs
 create mode 100644 04-2 DoppeltVerketteteListe/Program.cs

diff --git a/04-2 DoppeltVerketteteListe/04-2 DoppeltVerketteteListe.csproj b/04-2 DoppeltVerketteteListe/04-2 DoppeltVerketteteListe.csproj
new file mode 100644
index 0000000..158317c
--- /dev/null
+++ b/04-2 DoppeltVerketteteListe/04-2 DoppeltVerketteteListe.csproj	
@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <RootNamespace>_04_2_DoppeltVerketteteListe</RootNamespace>
+  </PropertyGroup>
+
+</Project>
diff --git a/04-2 DoppeltVerketteteListe/Personenliste.cs b/04-2 DoppeltVerketteteListe/Personenliste.cs
new file mode 100644
index 0000000..40213d5
--- /dev/null
+++ b/04-2 DoppeltVerketteteListe/Personenliste.cs	
@@ -0,0 +1,122 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace _04_2_DoppeltVerketteteListe
+{
+    // Kriterien einfach vs. doppel-verkettete Listen
+    // - Speicherplatz
+    // - Welche Operationen werden wie HÄUFIG benötigt (Anfügen am Ende, Anfügen am Anf)
+    //          Löschen am Anfang --> einfach-verkettet
+    // - Löschen des letzten Elements HÄUFIG benötigt? --> Doppelt-verk.L
+    class Personenliste
+    {
+        class LItem
+        {
+            public string name;
+            public LItem next = null, prev = null;
+            public LItem(string Name) { name = Name; }
+
+            public override string ToString()
+            => $"Name: {name}, prev: {(prev == null ? "null" : prev.name)}, next: {(next == null ? "null" : next.name)}";
+        }
+
+        LItem first = null, last = null;
+
+        public void AddEnd(string Name)
+        {
+            LItem newItem = new LItem(Name);
+            if (first == null)
+                first = last = newItem;
+            else  // Es gibt schon Listenelemente
+            {
+                last.next = newItem;
+                newItem.prev = last;
+                last = newItem;
+            }
+        }
+        public void AddFront(string Name)
+        {
+            LItem newItem = new LItem(Name);
+            if (first == null)
+                first = last = newItem;
+            else
+            {
+                newItem.next = first;
+                first.prev = newItem;
+                first = newItem;
+            }
+        }
+
+        public void DeleteFirst()
+        {
+            // Fall 1: Liste ist leer
+            // Fall 2: Liste besteht nur aus EINEM Element
+            // Fall 3: Liste hat mehr als ein Element
+
+            if (first == null)  // Fall 1
+                return;
+            if (first == last)  // Fall 2
+                first = last = null;
+            else
+            {
+                first = first.next;
+                first.prev = null;
+            }
+        }
+        public void DeleteLast()
+        {
+            // Fall 1: Liste ist leer
+            // Fall 2: Liste besteht nur aus EINEM Element
+            // Fall 3: Liste hat mehr als ein Element
+
+            if (first == null)  // Fall 1
+                return;
+            if (first == last)  // Fall 2
+                first = last = null;
+            else
+            {
+                last = last.prev;
+                last.next = null;
+            }
+        }
+        public void DeleteByName(string DelName)
+        {
+            // Fall 1: Liste ist leer
+            // Fall 2: Das gesuchte Element befindet sich am Anfang
+            // Fall 3: Das gesuchte Element befindet sich am Ende
+            // Fall 4: Das gesuchte Element befindet sich mittendrin
+
+            if (first == null)  // Fall 1
+                return;
+            if (first.name.CompareTo(DelName) == 0)   // Fall 2
+                DeleteFirst();
+            else if (last.name.CompareTo(DelName) == 0) // Fall 3
+                DeleteLast();
+            else
+            {
+                // Fall 4: Wir wissen:
+                // Das zu löschende Element befindet sich weder am Anfang noch am Ende
+                //    --> Es gibt ein Vorgänger- UND ein Nachfolger-Element
+                LItem item = first.next;
+                while (item.next != null && item.name.CompareTo(DelName) != 0)
+                    item = item.next;
+                if (item.next != null) 
+                {
+                    // d.h. Element wurde gefunden und item zeigt auf dieses Element
+                    //                                  20 - 21 - 22
+                    item.prev.next = item.next;      // 20 -> 22 Nachfolger
+                    item.next.prev = item.prev;      // 22 -> 20 Vorgänger
+                }
+            }
+        }
+        public void  Print()
+        {
+            for (LItem item = first;item!=null;item=item.next)
+            {
+                Console.WriteLine(item.name);
+            }
+            Console.WriteLine("-------------------");
+        }
+    }
+}
diff --git a/04-2 DoppeltVerketteteListe/Program.cs b/04-2 DoppeltVerketteteListe/Program.cs
new file mode 100644
index 0000000..7e81e21
--- /dev/null
+++ b/04-2 DoppeltVerketteteListe/Program.cs	
@@ -0,0 +1,19 @@
+using System;
+
+namespace _04_2_DoppeltVerketteteListe
+{
+    class Program
+    {
+        static void Main(string[] args)
+        {
+            Personenliste freunde = new Personenliste();
+            freunde.AddEnd("Anton");
+            freunde.AddEnd("Berta");
+            freunde.AddEnd("Claudia");
+            freunde.Print();
+
+            freunde.DeleteByName("Berta");
+            freunde.Print();
+        }
+    }
+}
diff --git a/04-UbgCycleList-Di/CycleList.cs b/04-UbgCycleList-Di/CycleList.cs
index 26c7733..fdbe797 100644
--- a/04-UbgCycleList-Di/CycleList.cs
+++ b/04-UbgCycleList-Di/CycleList.cs
@@ -12,11 +12,55 @@ namespace _04_UbgCycleList_Di
     
     class CycleList
     {
+        class LItem
+        {
+            public string name;
+            public LItem next;
+            public LItem(string Name) { name = Name; next = null; }
+        }
+        LItem first = null, last = null;
+        LItem iterator;
 
-        public void AddEnd() // wie bisher
+        public void AddEnd(string Name) // wie bisher
+        {
+            LItem newItem = new LItem(Name);
+            if (first == null)
+                first = last = newItem;
+            else
+            {
+                last.next = newItem;
+                last = newItem;
+            }
+        }
         public void  CloseCycle() // letztes mit dem ersten Element verbinden
+        {
+            last.next = first;
+        }
+        public void Print()
+        {
+            if (first == null)
+                return;
+            //Wir wissen hier: Es gibt mindestens ein Element
+            LItem item = first;
+            do
+            {
+                Console.WriteLine(item.name);
+                item = item.next;
+            } while (item != first);
+        }
+
+
         public void  SetIterator(int offset=0) // Einen internen Zeiger (Iterator) auf das (anfang+offset) Listenelement setzen
+        {
+            iterator = first;
+            for (int i = 0; i < offset; i++)
+                iterator = iterator.next;
+        }
         public string GetName() // Den string zurückliefern, der im Iterator-Listenelement gespeichert ist
+            => iterator.name;
         public void  MoveNext() // Den Iterator um ein Element weitersetzen
+        {
+            iterator = iterator.next;
+        }
     }
 }
diff --git a/04-UbgCycleList-Di/Program.cs b/04-UbgCycleList-Di/Program.cs
index e15ebbe..952928e 100644
--- a/04-UbgCycleList-Di/Program.cs
+++ b/04-UbgCycleList-Di/Program.cs
@@ -7,6 +7,7 @@ namespace _04_UbgCycleList_Di
         static void Main(string[] args)
         {
             CycleList cl = new CycleList();
+            cl.Print();
             cl.AddEnd("Anton");
             cl.AddEnd("Berta");
             cl.CloseCycle();
@@ -17,6 +18,7 @@ namespace _04_UbgCycleList_Di
             cl.CloseCycle();
             cl.Print();
             Console.WriteLine("-------------");
+
             cl.SetIterator(2);
             for (int i = 0; i < 10; i++)
             {
diff --git a/Prog2WienkopSS2021.sln b/Prog2WienkopSS2021.sln
index 372d4c9..3a73b0c 100644
--- a/Prog2WienkopSS2021.sln
+++ b/Prog2WienkopSS2021.sln
@@ -29,6 +29,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "04-1 VerketteteStrukturen2"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "04-UbgCycleList-Di", "04-UbgCycleList-Di\04-UbgCycleList-Di.csproj", "{E1A44696-1661-47C6-B083-65BD53DA917A}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "04-2 DoppeltVerketteteListe", "04-2 DoppeltVerketteteListe\04-2 DoppeltVerketteteListe.csproj", "{A253CA17-DA49-47FB-B8A6-C24D84C9A3E6}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -87,6 +89,10 @@ Global
 		{E1A44696-1661-47C6-B083-65BD53DA917A}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{E1A44696-1661-47C6-B083-65BD53DA917A}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{E1A44696-1661-47C6-B083-65BD53DA917A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A253CA17-DA49-47FB-B8A6-C24D84C9A3E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A253CA17-DA49-47FB-B8A6-C24D84C9A3E6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A253CA17-DA49-47FB-B8A6-C24D84C9A3E6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A253CA17-DA49-47FB-B8A6-C24D84C9A3E6}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
-- 
GitLab