Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
#include <iostream> using namespace std; struct Knoten { int Daten; Knoten *next; }; Knoten *Anfang = 0; Knoten *InsertKnoten(int &val); void ShowKnoten(const Knoten *n); Knoten *DeleteKnoten(int dat); int main() { Knoten *node; int Auswahl, iVal; do { cout << "Eine einfache verkettete Liste\n"; cout << "----------------------------------\n"; cout << "1 - Neues Element hinzufuegen\n"; cout << "2 - Alle Elemente ausgeben\n"; cout << "3 - einzelnes Element loeschen\n"; cout << "4 - Programm beenden\n\n"; cout << "Ihre Auswahl: "; cin >> Auswahl; switch(Auswahl) { case 1: cout << "Daten eingeben: "; cin >> iVal; node = InsertKnoten(iVal); break; case 2: ShowKnoten(node); break; case 3: cout << "Wert zum Loeschen eingeben: "; cin >> iVal; node = DeleteKnoten(iVal); break; case 4: break; default: cout << "Falsche Menueauswahl. \n"; } }while(Auswahl != 4); system("pause"); return 0; } Knoten *InsertKnoten(int &Val) { if (Anfang == 0) { Knoten *node = new Knoten; node->Daten = Val; node->next = 0; Anfang = node; return Anfang; } else { Knoten *node = Anfang; Knoten *NewNode; while(node->next != 0) node = node->next; NewNode = new Knoten; NewNode->Daten = Val; NewNode->next = 0; node->next = NewNode; return Anfang; } } void ShowKnoten(const Knoten *n) { if(Anfang == 0) { cout << "Die Liste ist leer\n"; } else { cout << "1. Element: " << n->Daten << endl; for (int i = 2; n->next != 0; i++) { n = n->next; cout << i << ". Element: " << n->Daten << endl; } } } Knoten *DeleteKnoten(int Dat) { if (Anfang == 0) { cout << "Die Liste ist leer!\n"; } if (Anfang->Daten == Dat) { Knoten *Del = Anfang; if (Anfang->next != 0) Anfang = Anfang->next; delete Del; } else { Knoten *node = Anfang; while(node->next != 0 && node->next->Daten != Dat) node=node->next; if (node->next == 0) cout << "Element zum Loeschen kommt nicht vor!\n"; else { Knoten *Del = node->next; Knoten *Help = Del->next; node->next = Help; delete Del; } } return Anfang; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
Knoten *InsertKnoten(int &Val) //Beispiel Val ist 10 { if (Anfang == 0) { Knoten *node = new Knoten; node->Daten = Val; node->next = 0; Anfang = node; return Anfang; // Bis hierhin kein Problem } else { Knoten *node = Anfang; //OK Knoten *NewNode; //Neuer Zeiger while(node->next != 0) node = node->next; // Das verstehe ich nicht. Zuerst übergebe ich Node die Daten von // Anfang (Also die 10 z. Bsp. um dann die Daten umgehend durch den // Inhalt von Next zu überschreiben, oder wie soll ich das verstehen? Ist // dann node->Daten = 0 durch die Zuweisung node=node->next? Und // Wie kann die While-Schleife funktionieren und von sich aus // Speicherbereiche vergleichen, ich gebe ja keinen Index oder Iterator // für die Zählschleife vor? NewNode = new Knoten; //OK, neues Objekt NewNode->Daten = Val; NewNode->next = 0; //Bishierhin OK.NewNode->Daten hätte jetzt die 10 //next kennzeichnet das Ende der Liste mit 0 node->next = NewNode; /* Kapier ich wieder nicht. Welche Daten hat jetzt node->next? Immerhin hat NewNode ja mit NewNode->Daten denWert 10 und NewNode->next die 0, oder bekommt node->next einfach nur die Speicheradresse von NewNode zugewiesen und beinhaltet sowohl NewNode->Daten als auch NewNode->next ?*/ return Anfang; //Wieso "Return Anfang" und nicht NewNode oder node, dass doch die //aktuellen Daten beinhalten sollte? } } |
Zitat
// Das verstehe ich nicht. Zuerst übergebe ich Node die Daten von
// Anfang (Also die 10 z. Bsp. um dann die Daten umgehend durch den
// Inhalt von Next zu überschreiben, oder wie soll ich das verstehen? Ist
// dann node->Daten = 0 durch die Zuweisung node=node->next? Und
// Wie kann die While-Schleife funktionieren und von sich aus
// Speicherbereiche vergleichen, ich gebe ja keinen Index oder Iterator
// für die Zählschleife vor?
Zitat
node->next = NewNode;
Zitat
/* Kapier ich wieder nicht. Welche Daten hat jetzt node->next? Immerhin hat NewNode ja mit NewNode->Daten denWert 10 und NewNode->next die 0, oder bekommt node->next einfach nur die Speicheradresse von NewNode zugewiesen und beinhaltet sowohl NewNode->Daten als auch NewNode->next ?*/
C-/C++-Quelltext |
|
1 |
node->next = NewNode; |
Zitat von »"NotGood"«
das heißt node->next beinhaltet die Adresse von NewNode, oder?
Zitat
Also wäre der Inhalt von node->next den ich ansprechen kann daten=10 und next=0?
Zitat
Und das mit der Iteration habe ich leider noch nicht verstehen können.
Bei einem Array ist das Nachvollziehbar da ich den Index ansprechen kann. Wie kann node die einzelnen Daten rausfiltern wenn es z. Bsp. 8, 9 und 10 beinhalten würde. Das ist ja nur ein Zeiger, der nur eine Speicheradresse wiedergeben kann, während die Werte doch in verschiedenen Adressen gespeichert sein sollten?
Quellcode |
|
1 2 3 4 |
2 (Wert) 0x236512 (Zeiger) --------> 5 (Wert) 0x123065 (Zeiger) ---------> 10 0 |
Zitat von »"NotGood"«
P.S.
Klasse Darstellung Drakon. Die hat viel ausgemacht.
Werbeanzeige