Listen in C? < Softwaretechnik+Pro < Praktische Inform. < Hochschule < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 15:30 Di 22.03.2011 | Autor: | bandchef |
Aufgabe | - Datentyp für eine doppelt verkettete Liste schreiben
- Funktion schreiben die das Element aus der Liste löscht, das nach einem angegebenen Element in der Liste steht. |
Hi!
Ich soll die oben gezeigt Aufgabe lösen. Ich weiß aber nicht recht was das soll, insbesondere auch weil meine Vorlesungskopie zur "Vorstellung" nicht viel hergibt. Ich weiß quasi nicht was das soll.
Könnt ihr mir Anstöße geben dieses Problem besser zu verstehen und helfen?
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 20:33 Mi 23.03.2011 | Autor: | rainerS |
Hallo!
> - Datentyp für eine doppelt verkettete Liste schreiben
> - Funktion schreiben die das Element aus der Liste
> löscht, das nach einem angegebenen Element in der Liste
> steht.
>
> Hi!
>
> Ich soll die oben gezeigt Aufgabe lösen. Ich weiß aber
> nicht recht was das soll, insbesondere auch weil meine
> Vorlesungskopie zur "Vorstellung" nicht viel hergibt. Ich
> weiß quasi nicht was das soll.
>
> Könnt ihr mir Anstöße geben dieses Problem besser zu
> verstehen und helfen?
In einer doppeltverketteten Liste enthält jedes Listenelement je einen Verweis auf das vorhergehende und auf das nachfolgende Listenelement, dazu noch die Information, die in dem Listenelement selbst enthalten sein soll.
Wie würde also ein passender Datentyp aussehen?
Viele Grüße
Rainer
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:30 Do 24.03.2011 | Autor: | bandchef |
Also, so wie ich das grad verstanden hab, gibt es auch noch "einfach verkettete Listen". Ich hab da jetzt mal nen Code mit reingetan der zeigt wie ich da grad eine Struktur einer Liste programmiert hab. Ich weiß, was ich da jetzt getan habe, habe es mir auch aufgezeichnet. Was mir noch schleierhaft ist, ist, dass ich nicht weiß was man damit jetzt alles machen kann.
Momentan mach mein Code ja folgendes:
Ich hab quasi 3 Knöten mit jeweils einem int-Wert (42,34,44). Momentan sind die 3 Knöten (nennt man das überhaupt Knoten, das was ich grad versuche zu beschreiben? Oder nennt man es doch eher Element?) noch nicht miteinandern verbunden. Was kann ich nun aber machen wenn ich das ganze jetzt miteinander verbinde? Was ist dann da der Vorteil?
Was bringt mir ein head-Element am Anfang der Liste und ein z-Element am Ende der Liste? Nutzen? Vorteile? Ich hab das in meiner Vorlesung gelesen aber leider steht da nix wie man das dann implementiert!
Warum muss man am Ende einer Liste bzw. nach dem z-Element die Liste noch auf einen NULL-Zeiger zeigen lassen? Eine andere Möglichkeit ist doch, dass der letzte Knoten auf sich selbst zeigt. Unterschiede? Was bringen mir die Unterschiedlichen Möglichkeiten?
Wie kann ich mir die momentan angelegte Liste auf dem Bildschirm ausgeben lassen?
Könnt ihr mich aufklären?
Hier der Code:
#include<iostream>
using namespace std;
struct node
{
int value;
struct node* next;
};
int main()
{
node *liste1, *liste2, *liste3;
liste1 = new node; //wie nennt man das hier?
liste1 -> value = 42;
liste2 = new node; //wie nennt man das hier?
liste2 -> value = 43;
liste3 = new node; //wie nennt man das hier?
liste3 -> value = 44;
return 0;
}
|
|
|
|
|
Hallo!
Bisher hast du eine einfach verkettete Liste, denn jedes Elemen zeigt auf das nächste, sobald du ein
liste1->next=liste2
machst. Du bräuchtest nach der gleichen Manier noch ein previous.
Der Witz ist, daß du nur die allererste Adresse node1 benötigst, denn die nächste Adresse kennt node1 ja selbst. Du kannst zum Anhängen also ne Funktion schreiben, die sich deine Liste entlang hangelt, bis sie das Ende erreicht, und dort was neues dran hängt:
void addNode(*node, int val){
//Mit einer Schleife sich eine Node nach der anderen holen
// bis der next-Pointer=0 ist.
// Diesen auf einen neu zu erschaffenden node setzen,
// und den neuen mit val füllen
}
int main()
{
node *liste;
liste->value=42;
liste->next=0;
addNode(liste, 43);
addNode(liste, 44);
addNode(liste, 45);
return 0;
}
die main() hat keine Ahnung, wie viele Elemente in der liste sind, aber im Gegensatz zu einem Array, das nie überfüllt werden darf, ist das bei ner Liste auch nicht unbedingt notwendig.
Genauso ist es sehr einfach, einen Node aus der Liste zu entfernen, und die "offenen Enden" miteinander zu verbinden. Das geht bei nem Array nicht so einfach.
>> Was bringt mir ein head-Element am Anfang der Liste und ein z-Element am Ende der Liste? Nutzen?
>> Vorteile? Ich hab das in meiner Vorlesung gelesen aber leider steht da nix wie man das dann
>> implementiert!
>>
>> Warum muss man am Ende einer Liste bzw. nach dem z-Element die Liste noch auf einen NULL-Zeiger
>> zeigen lassen? Eine andere Möglichkeit ist doch, dass der letzte Knoten auf sich selbst zeigt.
>> Unterschiede? Was bringen mir die Unterschiedlichen Möglichkeiten?
Ich weiß nicht genau, was ein Head-Element oder ein z-Element ist, aber ich hab auch nie Informatik gelernt...
Letztendlich brauchst du markierungen, die bei ner verketteten Liste das Ende markieren, bei ner doppelt verketteten wäre auch eine Anfangsmarkierung nicht schlecht.
Sicher kannst du als Konvention festlegen, daß das letzte Element auf sich selbst zeigen soll. Aber dieser wert wäre ja nicht konstant, sondern würde sich immer, wenn ein neues Element hinzugefügt wird, ändern.
Außerdem ist es eine gute Konvention, Zeiger, die auf nichts zeigen, auf 0 zeigen zu lassen.
>> Wie kann ich mir die momentan angelegte Liste auf dem Bildschirm ausgeben lassen?
Du könntest dir nach Manier der addNode-Funktion eine weitere Funktion schreiben, die die Werte ausliest, und auf den Bildschirm ausgibt. Auch hier: Eine gesonderte Angabe, wieviele Nodes vorhanden sind, oder wo die alle liegen, ist nicht notwendig, es braucht nur den Zeiger auf das allererste Node.
|
|
|
|