Suchen in linearen (verketteten) Listen



  • Hallo,
    unser Informatik Lehrer möchte gerne, das wir uns mit Hilfe des Internets die Einführung zum Thema lineare Verkettet Listen weitesgehend selbst erarbeiten. Darum haben wir einen Quelltext erhalten, den wir nun erweitern sollen. Problem dabei ist nun ihn erstmal vollkommen zu verstehen. Die Liste speichert 3 Elemente Vornamen, Nachnahmen und Telefon Nummer in den Speicher. Jedesmal wird gefragt, ob ein neues Element erstellt werden soll. Soweit ist es ja noch recht einfach. Wird irgendwann einmal diese Frage mit nein Bestätigt, werden noch einmal alle Benutzer ausgegeben. Nun sollen wir es soweit erweitern, das man anschließend noch nach einem Namen suchen kann. Es würde auch reichen, wenn man jedem Element eine Nr zuordnet, und dann die Nummer eingibt, um es ganz einfach zu halten. Ich habe versucht die mir die Startadresse zu Beginn in eine Variable abzuspeichern, und dan die Liste nocheinmal von vorne durchzugegehen, und zu überbrüfen ob Vor- bzw. Nachname = such; Hat leider nicht geklappt. Hier nochmal das grundgerüst. Könnte mir jemand helfen?

    class liste
    {
     public:
      char nachname [15];
      char vorname [15];
      int telefon, nr;
    
      liste *next;
    };
    
    int main(int argc, char* argv[])
    {
        liste *z;
        liste *wurzel = NULL;
        char antw, antw2, startwert;
        int nr=1, such;
    
        do
        {
         z = new liste;
    
         if (nr==1)
            startwert = &z;
    
         cout<<"\n\n\tVorname: "; cin>>z->vorname;
         cout<<"\n\tNachname: "; cin>>z->nachname;
         cout<<"\n\tTelefon Nr.: "; cin>>z->telefon;
    
         z->next = wurzel;
         wurzel = z;
    
         cout<<"\n\n\tWeiteren Datensatz ? ";
         cin>>antw;
    
         z->nr = nr;
         nr++;
        }
        while(antw != 'n');
    
        cout<<startwert<<endl;
    
        do
        {
         cout<<"\n\tNr.:"<<z->nr<<"\t"<<z->vorname <<"\t"<<z->nachname<<"\t\tTelefon Nr.: "<<z->telefon;
         z = z->next;
        }
        while(z != NULL);
    
        if ( antw == 'n' )
        {
          cout<<"\n\n\tMöchtest du dir eine Datensatz erneut ausgeben lassen? ";
          cin>>antw2;
    
              if ( antw2 == 'j' )
              {
                 cout<<"\n\tGib bitte die Nummer ein: ";
                 cin>>such;
              }
        }
    
        getch();
    
        return 0;
    }
    

    Wäre echt nett. In das Thema lässt es sich nämlich relativ schwer eigenständig reinarbeiten.

    MfG Daniel



  • naja, ist doch schon fast fertig. Nachdem die Nummer eingegeben wurde läufst du vorne wieder durch die List durch und vergleichst die Nummer. Ist die Nummer gleich gibst du den Namen, Vornamen etc aus und wenn die Nummer nicht gleich ist suchst du weiter



  • #include <iostream>
    using namespace std;
    
    class liste
    {
     public:        //warum den PUBLIC?!?!?!
      string nachname;
      string vorname;
      int telefon;
    
      liste *next;
    };
    
    int main()
    {
        liste *z;
        liste *first;
        liste *last = NULL;
        char antw, startwert; //was bringt dir startwert?
        string suche;
    
        do
        {
         z = new liste;
    
         cout<<"\n\n\tVorname: "; cin>>z->vorname;
         cout<<"\n\tNachname: "; cin>>z->nachname;
         cout<<"\n\tTelefon Nr.: "; cin>>z->telefon;
         z->next = last;
         last = z;
    
         cout<<"\n\n\tWeiteren Datensatz ? ";
         cin>>antw;
        }
        while(antw != 'n');
    
        cout<<startwert<<endl;  //???
    
        do
        {
         cout<<"\n"<<z->vorname <<"\t"<<z->nachname<<"\t\tTelefon Nr.: "<<z->telefon;
         z = z->next;
        }
        while(z != NULL);
    
        if ( antw == 'n' )          //ist doch eigentlich sinnlos!
        {
                cout<<"\n\n\tMöchtest du dir einen Datensatz erneut ausgeben lassen? ";
                cin>>antw;
                if(antw == 'n' || antw == 'N')
                            return 0;
                cout<<"\n\tGib bitte den Vornamen ein: ";
                cin>>suche;
                for( ; suche != z->vorname; z->next)
                            cout << "/n" << z->vorname << z->nachname << z->telefon;
        }
    
        cin.get();
    
        return 0;
    }
    

    gibt nur noch ein problem, dass ich nicht so richtig lösen kann, da ich den fehler nicht genau finden kann 😞 😡 🙄
    es gibt immer einen unerwarteten speicher zugriff, bei dem das programm dann abstürzt... kein schöner fehler!

    ich glaube es liegt daran, dass es kein z->next gibt, wenn er in der for-schleife die daten vergleicht.... musste mal gucken



  • if ( antw2 == 'j' ) 
    		{ 
    			cout<<"\n\tGib bitte die Nummer ein: "; 
    			cin>>such; 
    
    			z = wurzel;
    
    			do 
    			{ 
    				if (such == z->nr)
    				{
    					cout<<"\n\tNr.:"<<z->nr<<"\t"<<z->vorname <<"\t"<<z->nachname<<"\t\tTelefon Nr.: "<<z->telefon;
    					break;
    				}
    				else
    				{
    					z = z->next; 
    				}
    			} 
    			while(z != NULL); 
    
    			if (z == NULL)
    			{
    				cout << "nr " << such << "not found" << endl;
    			}
    
    		}
    


  • Vielen Dank!
    Genau so habe ich es mir auch schon hingebastelt, nur hatte ich es dann mit dem Vor- und Nachnahmen versucht, und da hat er mir eine Fehlermeldung ([C++ Fehler] Unit1.cpp(70): E2034 Konvertierung von 'int' nach 'char *' nicht möglich) ausgegeben. Komisch und mit Nummer funktioniert es. Naja, jedenfalls danke! Wenn ihr noch ein Tipp habt, wie ich das mit der Eingabe eines Namen funktionieren würde, aber nicht wenn es zu kompliziert wird.

    Nochmals Danke!

    MfG Daniel



  • ja ne, ist klar. Du kannst ja auch ein int und ein char* nicht mit = vergleichen, da musst du vorher entweder das int in ein char*, oder das char* in ein int umwandeln



  • Mensch bin ich blöd 🙄 ! Naja, manchmal sieht man den Wald vor lauter Bäumen nicht! Habe irgendwie übersehen, dass such als Integer deklariert ist. Naja. Vielen Dank nochmal. Du hast mir sehr weitergeholfen.

    MfG Daniel


Anmelden zum Antworten