Skip to content
Snippets Groups Projects
Commit 715f2802 authored by Uwe Wienkop's avatar Uwe Wienkop
Browse files

2021-04-13 Doppelt-verkettete Liste

parent 5810d0eb
No related branches found
No related tags found
No related merge requests found
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>_04_2_DoppeltVerketteteListe</RootNamespace>
</PropertyGroup>
</Project>
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("-------------------");
}
}
}
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();
}
}
}
......@@ -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;
}
}
}
......@@ -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++)
{
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment