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