Studium, Ausbildung und Beruf
 StudiumHome   FAQFAQ   RegelnRegeln   SuchenSuchen    RegistrierenRegistrieren   LoginLogin

Verkettete Liste
Neues Thema eröffnen   Neue Antwort erstellen
Foren-Übersicht -> Informatik-Forum -> Verkettete Liste
 
Autor Nachricht
Textor
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.11.2006
Beiträge: 45

BeitragVerfasst am: 29 Jan 2008 - 19:26:40    Titel: Verkettete Liste

Nabend!

In unserer Vorlesung werden gerade verkettete Listen behandelt.
Dies verstehe ich auch ganz gut.
Allerdings wurde jetzt begonnen alles in Funktionen auszugliedern.
Und da fangen die Probleme an.
Hier erstmal das Programm:

#include <stdio.h>
#include <stdlib.h>
// Vorne einfuegen!!! :

struct element {
int eintrag;
struct element *nachfolger;};
struct element *kopf;

struct element *elementerzeugen(int i) {
struct element *p;
p=(struct element *)malloc(sizeof(struct element));
p->eintrag=i;
return p;
}

void einfuegen (struct element *p )
{
p->nachfolger=kopf;
kopf=p;
}


int main () {
int i;
kopf = 0;
for (i=5; i<=10;i++) {
einfuegen(elementerzeugen(i));
}

while (kopf!=NULL){
printf("\n%d", kopf->eintrag);
kopf=kopf->nachfolger;
}; getchar();


}

Es werden also 5 Werte in einer verketteten Liste abgespeichert und ausgegeben.

Aber wie läuft die Übergabe ab?
ich übergebe an die Funktion "einfuegen" ja nicht die Zahl sondern
"elementerzeugen(i)" Was ist denn hier elementerzeugen?

Gruß
T.
Annihilator
Valued Contributor
Benutzer-Profile anzeigen
Valued Contributor


Anmeldungsdatum: 18.05.2007
Beiträge: 6394
Wohnort: (hier nicht mehr aktiv)

BeitragVerfasst am: 29 Jan 2008 - 19:44:41    Titel:

Die Funktion 'elementerzeugen' gibt ein einen Zeiger auf eine Variable des Typs 'struct element' zurück und zwar handelt es sich um die Adresse des neu allozierten Listen-Eintrages. Durch 'elementerzeugen' allein wird aber die Listen-Struktur nicht aufrecht erhalten, da die Verknüpfung fehlt; das aber übernimmt die Funktion 'einfuegen'. Diese Funktion hat als Argument einen 'strcut element'-Zeiger und einen solchen übergibst du ja, indem du 'elementerzeugen' einsetzt. Verstanden ?
Textor
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.11.2006
Beiträge: 45

BeitragVerfasst am: 29 Jan 2008 - 19:53:19    Titel:

Also läuft es so ab?:

z.B.:
1. i=1

2. einfuegen(elementerzeugen(1));

3. void einfuegen (struct element *(elementerzeugen(1) )

4. Die Klammer wird aufgelöst:

struct element *elementerzeugen(int 1) { ..... }

und gibt die Anfangsadresse zurück an einfügen?
Also:

5. void einfuegen("rückgabeadresse von der Struktur in der sich jetzt 1 befindet?")

Da qualmt einem ja die Birne.


Und noch ne Frage:

Mit

"struct element *elementerzeugen;" (ohne weitere Eingaben)

definiere ich doch einfach nur einen Zeiger auf eine Struktur vom Typ element.

Und was macht folgendes?:
struct element *elementerzeugen(int 1) { ..... } <- Also kann man mit einem Zeiger auf eine Struktur auch gleichzeitig seinen reservierten Speicher auf dem Heap reservieren?

Gruß
T.
Annihilator
Valued Contributor
Benutzer-Profile anzeigen
Valued Contributor


Anmeldungsdatum: 18.05.2007
Beiträge: 6394
Wohnort: (hier nicht mehr aktiv)

BeitragVerfasst am: 29 Jan 2008 - 20:09:52    Titel:

Ich weiß nicht, was du mit 'Klammer' auflösen meinst. Ein Beispiel wäre:

einfuegen(elementerzeugen(4))

elementerzeugen(4) alloziert nun Speicher und gibt die Adresse zurück. Diese könnte so aussehen 0×003F76, nur als Beispiel. Also hat man dann:

einfuegen(0×003F76)

Was macht jetzt 'einfuegen' mit dieser tollen Adresse ? Na schau'nwer mal:

p->nachfolger = kopf
kopf = p

Er nimmt sich also den Wert dessen Addresse 0×003F76 und schreibt bei 'nachfolger' die Adresse 'kopf' rein.

Hast du das Zeiger-Konzept generell verstanden oder sind dir nur die Zusammenhängen in verketteten Listen unklar ?
Textor
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.11.2006
Beiträge: 45

BeitragVerfasst am: 29 Jan 2008 - 21:11:44    Titel:

Zitat:
elementerzeugen(4) alloziert nun Speicher und gibt die Adresse zurück. Diese könnte so aussehen 0×003F76


Ja das verstehe ich.

Zitat:
Also hat man dann: einfuegen(0×003F76)


So wie ich verstanden habe liefert die Funktion

einfuegen(struct element *elementerzeugen) .
elementerzeugen ist ein Zeiger und zeigt auf die Adresse 0×003F76
Also einfuegen(0×003F76). Okay verstanden.

Zitat:
Hast du das Zeiger-Konzept generell verstanden oder sind dir nur die Zusammenhängen in verketteten Listen unklar ?


Ich steh nur ein wenig auf dem Kriegsfuß mit verketteten Listen.
Mit Zeigern kann ich schon ganz gut umgehen.

Danke Dir!

Gruß
T.
Neoxim
Full Member
Benutzer-Profile anzeigen
Full Member


Anmeldungsdatum: 28.10.2006
Beiträge: 138

BeitragVerfasst am: 29 Jan 2008 - 21:37:35    Titel:

hi,

vielleicht helfen dir meine beiden tutorials Wink
in dem tutorials wird eine verkettete liste schritt für schritt erstellt

http://newmaxim.ne.funpic.de/create_page.php?file=liste_1.html&dir=artikel/cpp
http://newmaxim.ne.funpic.de/create_page.php?file=liste_2.html&dir=artikel/cpp
Textor
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.11.2006
Beiträge: 45

BeitragVerfasst am: 30 Jan 2008 - 12:49:38    Titel:

Ich habe jetzt folgendes Programm geschrieben,
welches die Zahlen 1-20 in einer verketteten Liste abspeichert:



#include <stdio.h>
#include <stdlib.h>
// Vorne einfuegen!!! :

#define EMPTY 0
struct element {
int eintrag;
struct element *nachfolger;};
struct element *kopf;

struct element*
elementerzeugen(int i) {
struct element *p;
p=(struct element *)malloc(sizeof(struct element));
p->eintrag=i;
return p;
}



void hinteneinfuegen (struct element *p) {

struct element *hilf= kopf;
if (hilf==EMPTY) { kopf=p;}
else {

while (hilf->nachfolger!=EMPTY) {hilf=hilf->nachfolger;}
hilf->nachfolger=p;
}}



int main () {
int i;
kopf = 0;


for (i=1; i<=20;++i) {
hinteneinfuegen(elementerzeugen(i));
}
struct element *p=kopf;
while (p!=EMPTY){
printf("\n%d", p->eintrag);
p=p->nachfolger;
}; getchar();


}


Ich habe immer hinten eingefügt. Leider funktioniert das Programm
nicht so wie ich will. Es wird ohne Murren kompiliert, nur erhalte ich
einen leeren Bildschirm als Ausgabe...???? Wo ist mein Fehler?
Ich find ihn nicht... Shocked

//EDIT: Ich hab den Fehler gemacht die letzte Adress nicht zu Nullen.
Jetzt läufts.
Neoxim
Full Member
Benutzer-Profile anzeigen
Full Member


Anmeldungsdatum: 28.10.2006
Beiträge: 138

BeitragVerfasst am: 30 Jan 2008 - 20:45:06    Titel:

Welche Sprache, C oder C++ soll es sein? wo hast du diesen dreckigen Programmierstil gelernt? Das will sich ja niemand anschauen, weil es unlesbar ist.
Annihilator
Valued Contributor
Benutzer-Profile anzeigen
Valued Contributor


Anmeldungsdatum: 18.05.2007
Beiträge: 6394
Wohnort: (hier nicht mehr aktiv)

BeitragVerfasst am: 30 Jan 2008 - 21:59:13    Titel:

@Neoxim
Programmieren ist wie Bilder malen - da hat jeder seinen eigenen Stil. Ich schreibe häufig Code-Zeilen, wie diese hier:

Code:

komplextyp komplextyp::operator ^ (komplextyp k1)
{double d1 = abs(), d2 = arg(); return (d1 ? polar(exp(k1.rea*log(d1)-k1.ima*d2), k1.ima*log(d1)+k1.rea*d2) : komplextyp());}


Ist der Code dann 'dreckig', nur weil ihn nicht jeder x-Beliebige sofort entziffern kann ?
Neoxim
Full Member
Benutzer-Profile anzeigen
Full Member


Anmeldungsdatum: 28.10.2006
Beiträge: 138

BeitragVerfasst am: 30 Jan 2008 - 22:05:13    Titel:

ja, ist er. nicht im sinne von funktionalität, sondern im aussehen bzw. lesbarkeit.
mit dem stil hast du recht, aber es sollte für andere programmierer lesbar sein ohne dass er sich anstrengen muss. das ist genau so wenn ich jetzt in dIE§E® §¢h®Iƒ† WEI†E® §¢h®EIbEn Wü®dE Wink
Beiträge der letzten Zeit anzeigen:   
Foren-Übersicht -> Informatik-Forum -> Verkettete Liste
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

Chat :: Nachrichten:: Lexikon :: Bücher :: Impressum