Program.cs 10.7 KB
Newer Older
Uwe Wienkop's avatar
Uwe Wienkop committed
1
using System;
Uwe Wienkop's avatar
Uwe Wienkop committed
2
using System.Collections;
Uwe Wienkop's avatar
Uwe Wienkop committed
3
using System.Security.Cryptography;
Uwe Wienkop's avatar
Uwe Wienkop committed
4
5

namespace _02VerketteteListe_2
Uwe Wienkop's avatar
Uwe Wienkop committed
6
{
Uwe Wienkop's avatar
Uwe Wienkop committed
7
8
9
10
11
12
13
14
    class StringListe
    {
        // Die Klasse Element ist nun eine *private* Klasse der Klasse StringListe
        // Die Methoden von StringListe dürfen auf private Member zugreifen
        // Methoden außerhalb von StringListe dürfen dies nicht!
        private class Element  // Element ist eine private Hilfsklasse der Klasse StringListe
        {
            public string name;
Uwe Wienkop's avatar
Uwe Wienkop committed
15
            public Element next = null;
Uwe Wienkop's avatar
Uwe Wienkop committed
16
17
18
19
            public Element(string name) { this.name = name; }
            public override string ToString() => name;
        }

Uwe Wienkop's avatar
Uwe Wienkop committed
20
        Element anf = null, ende = null;
Uwe Wienkop's avatar
Uwe Wienkop committed
21
        int anz = 0;      // Sehr sinnvoll für Index-Ops
Uwe Wienkop's avatar
Uwe Wienkop committed
22
23
        //public StringListe() { }
        public void AddEnd(string name)
Uwe Wienkop's avatar
Uwe Wienkop committed
24
        {
Uwe Wienkop's avatar
Uwe Wienkop committed
25
            Element neuesElement = new Element(name);   // 1. Neues Element anlegen
Uwe Wienkop's avatar
Uwe Wienkop committed
26
            anz++;
Uwe Wienkop's avatar
Uwe Wienkop committed
27
            if (anf == null)                            // 2. Leere Liste?
Uwe Wienkop's avatar
Uwe Wienkop committed
28
29
30
                anf = ende = neuesElement;
            else
            {
Uwe Wienkop's avatar
Uwe Wienkop committed
31
                ende.next = neuesElement;               // 3. Neues Element am Ende anfügen
Uwe Wienkop's avatar
Uwe Wienkop committed
32
33
34
                ende = ende.next;
            }
        }
Uwe Wienkop's avatar
Uwe Wienkop committed
35
36
37
38
39
        public void AddFront(string name)
        {
            // 1. Leere Liste
            // 2. Es existiert mind. ein Element
            Element neuesElement = new Element(name);   // Neues Element anlegen
Uwe Wienkop's avatar
Uwe Wienkop committed
40
            anz++;
Uwe Wienkop's avatar
Uwe Wienkop committed
41
42
43
44
45
46
47
48
            if (anf == null)                            // 1.Fall: Leere Liste?
                anf = ende = neuesElement;
            else
            {
                neuesElement.next = anf;                // 2. Fall
                anf = neuesElement;
            }
        }
Uwe Wienkop's avatar
Uwe Wienkop committed
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
        public void AddBeforeNth(int index, string name)
        {
            if (index < 0 || index > anz)
                throw new ArgumentOutOfRangeException("Index außerhalb der Listengröße");
            if (index == 0)
                AddFront(name);
            else if (index == anz)
                AddEnd(name);
            else
            {
                Element neu = new Element(name);
                anz++;
                Element item = anf;
                for (int i = 1; i < index; i++)
                    item = item.next;
                neu.next = item.next;    // Die Reihenfolge dieses und des nächsten Befehls ist ENTSCHEIDEND!
                item.next = neu;
            }
        }
        public void AddSorted(string name)
        {
            // 1. Fall: Leere Liste oder Anfügen am Listenende
            if (anf == null || ende.name.CompareTo(name) <= 0)
                AddEnd(name);
            else
            {
                if (name.CompareTo(anf.name) <= 0)
                    AddFront(name);
                else
                {
                    // Wir wissen: Das neue Element ist nicht das erste und nicht das letzte Element
                    Element neu = new Element(name);
                    anz++;

                    Element item = anf;
                    while (item.next.name.CompareTo(name) < 0)
                        item = item.next;
                    neu.next = item.next;
                    item.next = neu;
                }
            }
        }
Uwe Wienkop's avatar
Uwe Wienkop committed
91
92
        public bool Suche(string name)
        {
Uwe Wienkop's avatar
Uwe Wienkop committed
93
            for (Element item = anf; item != null; item = item.next)
Uwe Wienkop's avatar
Uwe Wienkop committed
94
            {
Uwe Wienkop's avatar
Uwe Wienkop committed
95
                if (item.name == name)
Uwe Wienkop's avatar
Uwe Wienkop committed
96
97
98
99
100
101
                    return true;
            }
            return false;
        }
        public void Print()
        {
Uwe Wienkop's avatar
Uwe Wienkop committed
102
            for (Element item = anf; item != null; item = item.next)
Uwe Wienkop's avatar
Uwe Wienkop committed
103
            {
Uwe Wienkop's avatar
Uwe Wienkop committed
104
                Console.WriteLine(item);
Uwe Wienkop's avatar
Uwe Wienkop committed
105
106
            }
        }
Uwe Wienkop's avatar
Uwe Wienkop committed
107
108
109
110
111
112
113
114
115
116
        public IEnumerator GetEnumerator()
        {
            for (Element item = anf; item != null; item = item.next)
            {
                yield return item.name; // Merken dieser Ausführungsposition
                                        // UND Zurückliefern von item.name
                                        // Beim nächsten Aufruf von GetEnumerator() wird
                                        // an der gespeicherten Pos. weitergemacht.
            }
        }
Uwe Wienkop's avatar
Uwe Wienkop committed
117
118
119
120
121
122
123
124
125
126
127
        public IEnumerable Filter(string pattern)
        {
            for (Element item = anf; item != null; item = item.next)
            {
                if (item.name.Contains(pattern))
                    yield return item.name; // Merken dieser Ausführungsposition
                                            // UND Zurückliefern von item.name
                                            // Beim nächsten Aufruf von GetEnumerator() wird
                                            // an der gespeicherten Pos. weitergemacht.
            }
        }
Uwe Wienkop's avatar
Uwe Wienkop committed
128
        public IEnumerable Iterate(int offset = 0)
Uwe Wienkop's avatar
Uwe Wienkop committed
129
130
131
132
        {
            Element item = anf;
            for (int i = 0; i < offset; i++)
                item = item.next;
Uwe Wienkop's avatar
Uwe Wienkop committed
133
            while (item != null)
Uwe Wienkop's avatar
Uwe Wienkop committed
134
135
136
137
138
            {
                yield return item.name;
                item = item.next;
            }
        }
Uwe Wienkop's avatar
Uwe Wienkop committed
139

Uwe Wienkop's avatar
Uwe Wienkop committed
140
141
142
143
144
145
146
        // foreach --> GetEnumerator() merkt sich die Pos nach yield return und liefert ("Anton")
        // item = "Anton"
        // foreach --> GetEnumerator(), überprüft, ob noch eine Ausführungspos. gespeichert ist
        //                  JA: --> hier geht die Ausführung weiter
        //                          item=item.next, merkt sich die Pos nach yield return und liefert ("Berta")
        // item = "Berta"
        // ... bis GetEnumerator() am Methodenende angelangt ist.
Uwe Wienkop's avatar
Uwe Wienkop committed
147
        public void DeleteFirst()
Uwe Wienkop's avatar
Uwe Wienkop committed
148
149
150
151
152
153
        {
            // 1.Fall: Liste ist leer
            // 2.Fall: Liste besteht nur aus einem Element
            // 3.Fall: Liste hat mehr als ein Element
            if (anf == null)  // 1. Fall
                return;
Uwe Wienkop's avatar
Uwe Wienkop committed
154
            anz--;
Uwe Wienkop's avatar
Uwe Wienkop committed
155
156
157
158
159
            if (anf == ende)  // 2. Fall
                anf = ende = null;
            else
                anf = anf.next;   // 3. Fall
        }
Uwe Wienkop's avatar
Uwe Wienkop committed
160
        public void DeleteLast()
Uwe Wienkop's avatar
Uwe Wienkop committed
161
162
163
164
165
166
        {
            // 1.Fall: Liste ist leer
            // 2.Fall: Liste besteht nur aus einem Element
            // 3.Fall: Liste hat mehr als ein Element
            if (anf == null)  // 1. Fall
                throw new NullReferenceException("Die Liste ist leer");
Uwe Wienkop's avatar
Uwe Wienkop committed
167
            anz--;
Uwe Wienkop's avatar
Uwe Wienkop committed
168
169
170
171
172
173
174
175
176
177
            if (anf == ende)  // 2. Fall
                anf = ende = null;
            else              // 3. Fall
            {  // Wir wissen: Die Liste hat mehr als ein Element, d.h. es gibt ein
               // vorletztes Element vorletzter.next == ende
                Element vorletzter = anf;
                while (vorletzter.next != ende)
                    vorletzter = vorletzter.next;
                vorletzter.next = null;
                ende = vorletzter;
Uwe Wienkop's avatar
Uwe Wienkop committed
178
179
            }
        }
Uwe Wienkop's avatar
Uwe Wienkop committed
180
        public void DeleteNth(int index)
Uwe Wienkop's avatar
Uwe Wienkop committed
181
        {
Uwe Wienkop's avatar
Uwe Wienkop committed
182
183
184
185
186
187
188
189
190
191
192
193
194
            // 1.Fall: Liste ist leer ODER Ind>=anz --> Fehler
            // 2.Fall: Ind == 0  --> DeleteFirst
            // 3.Fall: Ind == anz-1 --> DeleteLast
            // 4. Bis hierher: Liste hat mind. ein Element und das zu löschende Element
            //                 ist nicht das Erste oder Letzte
            if (anz == 0 || index >= anz)  // 1. Fall
                throw new ArgumentOutOfRangeException("Außerhalb der Anzahl der Listenelemente");
            if (index == 0)  // 2. Fall
                DeleteFirst();
            else if (index == anz - 1) // 3. Fall
                DeleteLast();
            else
            {
Uwe Wienkop's avatar
Uwe Wienkop committed
195
                Element vorletzter = anf;
Uwe Wienkop's avatar
Uwe Wienkop committed
196
                for (int i = 0; i < index - 1; i++)  // Liste bis zum n-1-ten Element durchlaufen
Uwe Wienkop's avatar
Uwe Wienkop committed
197
                    vorletzter = vorletzter.next;
Uwe Wienkop's avatar
Uwe Wienkop committed
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
                vorletzter.next = vorletzter.next.next;
                anz--;
            }
        }
        public void DeleteByName(string name)
        {
            // leere Liste ohne Elemente
            if (anf == null)
                return;
            // erstes Element = gesuchtes Element
            if (anf.name.CompareTo(name) == 0)
                DeleteFirst();
            // Wir wissen jetzt:
            // Liste hat mind. ein Element UND das erste Element ist nicht das gesuchte Element
            else
            {
                Element item = anf;
                // Durchlaufen der Liste
                // solange Elemente in Liste vorhanden und gesuchtes Element noch nicht gefunden
                while (item.next != null && item.next.name.CompareTo(name) != 0)
                    item = item.next;
                // Wenn gesuchtes Element in Liste vorhanden
Uwe Wienkop's avatar
Uwe Wienkop committed
220
221
                // item = "B"
                if (item.next != null)  // "C"
Uwe Wienkop's avatar
Uwe Wienkop committed
222
                {
Uwe Wienkop's avatar
Uwe Wienkop committed
223
                    anz--;
Uwe Wienkop's avatar
Uwe Wienkop committed
224
                    // Nächstes Element überspringen = löschen
Uwe Wienkop's avatar
Uwe Wienkop committed
225
226
                    item.next = item.next.next;  // item.next = null
                    // Wenn gesuchtes Element == letztes Element:
Uwe Wienkop's avatar
Uwe Wienkop committed
227
228
229
230
231
232
233
234
235
236
237
238
239
240
                    if (item.next == null)
                        ende = item;
                }
            }
        }
        private Element NthElem(int index)
        {
            if (index < 0 || index >= anz)
                throw new IndexOutOfRangeException("Listenindex außerhalb des gültigen Bereichs");
            Element item = anf;
            while (index > 0)
            {
                item = item.next;
                index--;
Uwe Wienkop's avatar
Uwe Wienkop committed
241
            }
Uwe Wienkop's avatar
Uwe Wienkop committed
242
243
244
245
246
247
            return item;
        }
        public string this[int index]
        {
            get => NthElem(index).name;
            set { NthElem(index).name = value; }
Uwe Wienkop's avatar
Uwe Wienkop committed
248
        }
Uwe Wienkop's avatar
Uwe Wienkop committed
249
250
251
252
253
254
255
        public StringListe Reverse() // DIES IST NICHT DIE LÖSUNG FÜR DIE PRAKTIKUMSAUFGABE!!!
        {
            StringListe neueListe = new StringListe();
            for (Element item = anf; item != null; item = item.next)
                neueListe.AddFront(item.name);
            return neueListe;
        }
Uwe Wienkop's avatar
Uwe Wienkop committed
256
257
258
259
260
261
262
263
    }
    class Program
    {
        static void Main(string[] args)
        {
            StringListe l1 = new StringListe();
            StringListe l2 = new StringListe();

Uwe Wienkop's avatar
Uwe Wienkop committed
264
265
266
267
268
            l1.AddSorted("Emil ");
            l1.AddSorted("Anton");
            l1.AddSorted("Berta");
            l1.AddSorted("Claudia");
            l1.AddSorted("Dieter");
Uwe Wienkop's avatar
Uwe Wienkop committed
269
            l1.Print();
Uwe Wienkop's avatar
Uwe Wienkop committed
270
271
272
273
274
            l1 = l1.Reverse();
            Console.WriteLine("==================");
            l1.Print();
            Console.WriteLine("==================");

Uwe Wienkop's avatar
Uwe Wienkop committed
275
            Console.WriteLine(l1[3]);
Uwe Wienkop's avatar
Uwe Wienkop committed
276
277
278
279
280
281
282
            Console.WriteLine("==================");
            //l1.DeleteFirst();
            //l1.DeleteLast();
            //l1.DeleteNth(1);
            //l1.Print();
            l1.AddBeforeNth(2, "Bodo");
            l1.Print();
Uwe Wienkop's avatar
Uwe Wienkop committed
283
            foreach (string item in l1.Filter("er"))
Uwe Wienkop's avatar
Uwe Wienkop committed
284
285
286
            {
                Console.WriteLine($"foreach: {item}");
            }
Uwe Wienkop's avatar
Uwe Wienkop committed
287
288
289
        }
    }
}