Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Hilfe! Klausuraufgabe

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] > 3 <
020
21.06.2004, 18:35 Uhr
~iboT
Gast


Hallo...mal wieder ;-)
diesmal gehts um dynamisch verkettete Listen.

Ich hab jetzt mal versucht solch eine Liste zu programmieren. Leider passiert nichtmal ansatzweise das was ich mir vorgestellt habe.
Ich kann zwar Elemente hinzufügen, aber die Ausgabe- und die Suchfunktion funktionieren nicht.

Hier mein Programm:


C++:
# include <conio.h>
# include <iostream>
# include <stdlib.h>
# include <process.h>

using namespace std;

struct tEintrag
{
    char stadt[30];
    int plz;
    tEintrag *next;
};
void eingabe(tEintrag *pElem, tEintrag *pTop);
void suchen(tEintrag *pElem, tEintrag *pTop);
void ausgabe(tEintrag *pElem, tEintrag *pTop);

void main()
{    
    char q;
    tEintrag *pElem, *pTop;
    pTop = NULL;
    pElem = NULL;
        
    do
    {
        cout<<"\nBitte waehlen:"<<endl;
        cout<<"Eintrag hinzufuegen:\t'h'"<<endl;
        cout<<"PLZ suchen:\t's'"<<endl;
        cout<<"Alle Elemente ausgeben:\t'a'"<<endl;
        cout<<"Beenden:\t'q'"<<endl;
        cin>>q;
        switch(q)
        {
            case 'h':
                {
                    eingabe(pElem, pTop);
                    break;
                }
            case 's':
                {
                    suchen(pElem, pTop);
                    break;
                }
            case 'a':
                {
                    ausgabe(pElem, pTop);
                    break;
                }
        }
        system("CLS");
    }while (q != 'q');
}

//----------------Eingabe-Funktion------------------

void eingabe(tEintrag *pElem, tEintrag *pTop)
{
    pElem=new (tEintrag);
    cout<<"\nStadt: "; cin>>pElem->stadt;
    cout<<"Plz: "; cin>>pElem->plz;
    cout<<pElem->stadt<<"    "<<pElem->plz;
    pElem->next=pTop;
    pTop=pElem;
}

//----------------such-Funktion--------------------

void suchen(tEintrag *pElem, tEintrag *pTop)
{
    int suchplz;
    
    cout<<"\nBitte die gesuchte PLZ eingeben: ";
    cin>>suchplz;
        

    pElem = pTop;
    while (pElem != NULL)
    {
        if (suchplz == pElem->plz)
        cout<<"Die gesuchte PLZ: "<<pElem->plz<<" die dazugehoerige Stadt: "<<pElem->stadt<<endl;
        pElem=pElem->next;
    }
    getch();
}

//---------------Ausgabe-Funktion---------------------

void ausgabe(tEintrag *pElem, tEintrag *pTop)
{
    pElem=pTop;
    while (pElem != NULL)
    {
        cout<<"\nPLZ: "<<pElem->plz<<" Stadt: "<<pElem->stadt<<endl;
        pElem=pElem->next;
    }
    getch();
}



Also da das Programm von mir stammt hats bestimmt viele Fehler drin. Falls jemand welche entdeckt wärs super wenn ihr mir helfen könntet :-)


Dann hab ich da noch eine Zeile gefunden bei der ich nicht weiss was das soll:


C++:
....
struct tEintrag
{
    char name[10];
    tEintrag *next;
};

[b]void einfuegen(tEintrag *pNew, tEintrag *& pTop);[/b]

void main()
{
    tEintrag *pTop, *pNew;
    ......
    pTop=NULL;
    ....
    einfuegen(pNew,pTop);
    ...
}

[b]void einfuegen(tEintrag *pNew, tEintrag *& pTop)[/b]
{
    .......
}



Was bedeutet *& ???? Eine Referenz auf einen Pointer? Aber was heisst das? Würde das ganz nicht genausogut ganz "normal" ohne Referenz, nur mit Pointer funktionieren?

Dieser Post wurde am 21.06.2004 um 18:39 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
21.06.2004, 20:35 Uhr
ao

(Operator)


Die Eingabefunktion ist fehlerhaft. Der Einfüge-Algorithmus nimmt den pTop-Zeiger und lässt ihn auf das eingefügte Element zeigen. Innerhalb der Funktion eingabe() ist noch alles in Ordnung, aber die Änderung wirkt nicht nach außen; dadurch baust du in Wahrheit gar keine Liste auf, und Suchen und Ausgeben geht natürlich nicht.

Schreibe eingabe() so um:


C++:
void eingabe (tEintrag * pElem, tEintrag ** ppTop);

Aufruf:
eingabe (pElem, &pTop);



dann kannst du in eingabe *ppTop so verändern, dass das äußere pTop ebenfalls verändert wird.

Den formalen Parameter pElem brauchst du übrigens gar nicht.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
22.06.2004, 20:54 Uhr
~iboT
Gast


Super danke jetzt gehts :-)

Dazu aber gleich nochmal ne Frage:

Wenn ich nun tEintrag **ppTop deklariere und im Programm dann eine Zuweisung wie z.b. ppTop=pElem; machen will muss ich ja dann eigentlich *ppTop schreiben, oder? Aber wie unterscheidet sich dann *ppTop vom Inhalt des "ersten" Zeigers? Also ich mein mit dem * müsste ich doch eigentlich den Inhalt des ersten Zeigers kriegen, krieg aber so wies aussieht jetzt den 2ten Zeiger. Ich hoff ihr versteht was ich meine ;-)
wie wäre dann der Inhalt des zweiten Zeigers rauszukriegen? über **pTop?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
22.06.2004, 21:25 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


es liegt ganz einfach daran das innerhalb eine funktion mit einer kopie des übergebenen parameters gearbeitet wird und nicht mit dem übergebenen parameter selber


C++:
void eingabe(tEintrag *pElem, tEintrag *pTop)
{
    pElem=new (tEintrag);  
    cout<<"\nStadt: "; cin>>pElem->stadt;
    cout<<"Plz: "; cin>>pElem->plz;
    cout<<pElem->stadt<<"    "<<pElem->plz;
    pElem->next=pTop;
    pTop=pElem; //an der Stelle sagst du das pTop auf die gleiche adresse von pElem zeigen soll, wenn die prozedur durchgelaufen ist gibt es pTop gar nicht mehr. Das wird vom stack gelöscht. Um also dafür zu sorgen das der inhalt des zweite paramters den du in der funktion übergibst selber geändert werden kann, also das die ändrung noch nach durchlaufen der prozedur gilt musst du die adresse übergeben, dann ist die kopie mit der gearbeitet wird die adresse selber..., da pTop selber schon ein pointer ist, ist die adresse von pTop dann halt ein doppelpointer
}


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 22.06.2004 um 21:25 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
23.06.2004, 00:15 Uhr
~iboT
Gast


Danke! Ich glaub ich habs jetzt verstanden

Mittlerweile hab ich auch rausgekriegt dass es anstatt doppelpointer auch mit der Referenz geht.
Ist weniger schreibaufwand...ist aber im Prinzip so ähnlich, oder? Da wird dann eben mit nem Decknamen für den "richtigen" Pointer gearbeitet, oder?
Es funktioniert jedenfalls
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
23.06.2004, 00:37 Uhr
typecast
aka loddab
(Operator)


Es läuft ähnlich ab. Du kannst nur weniger falsch machen
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: