Liste als Klasse < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 14:35 Sa 23.01.2010 | Autor: | nana |
Hallo, folgendes Programm hatten wir in der Vorlesung; ich versteh es auch eig , hab aber ein paar Fragen zu den Funktionen...hoffe ihr könnt mir helfen
hier erstmal die Def der Klasse CList (nur weil man sonst die funktionsparameter nicht so ganz versteht):
class CList {
private:
struct CListElement {
int digit;
CListElement* next;
CListElement(int d, CListElement* n) {
digit = d; next = n;}
};
/* doch eine Frage: eig ist CListElement doch ein struct, aber hier ist ein Konstruktor drin, oder gibt es die auch in structs??*/
CListElement* head;
};
CList(){ head =NULL;};
// falls liste erst neu erstellt werden muss
void CList::cinsertTop (int r) {
head = new CListElement(r,head);
}
/*Das verstehe ich nicht so ganz: also das neue El, das oben eingefügt werden soll hat den wert r und der zeiger ist head, das ist klar, aber head ist doch eigentlich der zeiger der liste der immer auf das erste el zeigen soll, aber head wurde ja gar nicht verändert (muss head dann nicht auch als referenzparameter üebrgeben werden)?? */
Zum Finden eines El:
bool CList::cfind ( int r) {
if (head == NULL){
return false;
}
else {
/*l wird zum Durchlauf
verwendet*/
CListElement* l = head;
while ((l != NULL) &&(l->digit != r)) {
l = l->next;
};
return (l != NULL);
}
}
/*ich versteh dieses programm bis auf den schluss: was bedeutet "return (l!= NULL)" in diesem Zusammenhang?? */
Vielen Dank für alle Antworten,
lg, nana
|
|
|
|
Hallo nochmal nana,
> class CList {
> private:
> struct CListElement {
> int digit;
> CListElement* next;
> CListElement(int d, CListElement* n) {
> digit = d; next = n;}
> };
> /* doch eine Frage: eig ist CListElement doch ein struct,
> aber hier ist ein Konstruktor drin, oder gibt es die auch
> in structs??*/
Das war jetzt auch für mich neu. Aber offenbar haben structs in C++ im Vergleich zu C eine etwas andere Bedeutung: .
> void CList::cinsertTop (int r) {
> head = new CListElement(r,head);
> }
> /*Das verstehe ich nicht so ganz: also das neue El, das
> oben eingefügt werden soll hat den wert r und der zeiger
> ist head, das ist klar, aber head ist doch eigentlich der
> zeiger der liste der immer auf das erste el zeigen soll,
> aber head wurde ja gar nicht verändert (muss head dann
> nicht auch als referenzparameter üebrgeben werden)?? */
Mir ist die Frage nicht ganz klar, weil 'head' doch als Parameter übergeben wird. Am Anfang ist head == NULL. Jetzt rufen wir mal cinsertTop(0) auf. Dann wird auf dem Heap ein neues Objekt vom Typ 'CListElement' erstellt. Bei der Erstellung werden an den Konstruktor dieses Objektes 0 und NULL übergeben: new CListElement(r,head). Im Konstruktor-Rumpf werden die internen Variablen digit und next dieses neuen Objektes/Listenelementes gesetzt. Danach springt das Programm zurück zu cInsertTop. Das fertig erstelle Listenelement wird nun der internen Variablen head zugewiesen. Das Ergebnis sieht so aus:
head -> |0|.next == NULL
Beim nochmaligen Aufruf von cinsertTop() wird nun der neue Wert von head an den Konstruktor CListElement für ein neues Listenelement übergeben:
head -> |1|.next -> |0|.next == NULL
> return (l != NULL);
> /*ich versteh dieses programm bis auf den schluss: was
> bedeutet "return (l!= NULL)" in diesem Zusammenhang?? */
Ist l ungleich NULL, d.h. wurde das Element gefunden, ergibt der Ausdruck (l != NULL) den Wert 'true'. Ansonsten ist der Ausdruck 'false'. Bei if-Abfragen benutzt du ja auch ständig solche Klammerausdrücke: if(l != NULL); Warum also nicht auch return(l != NULL)?
Viele Grüße
Karl
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 22:10 Mi 03.02.2010 | Autor: | nana |
Hey vielen Dank!!
(zum wiederholten Mal ;) )
für die Hilfe, habs jetzt verstanden, obwohl ich zugeben muss dass ich noch ein paar kleine verständnisprobleme hab bzgl benutzung von referenzparametern bei einer klasse list oder so ....
Aber auf jeden Fall danke...
Lg, nana
|
|
|
|