Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Probleme mit verketteter Liste (Ausgabe und Verwaltung)

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 <
000
15.05.2015, 14:08 Uhr
C3PO



Liebe Forumsmitglieder,

ich bin noch relativ neu in C++ und probiere mich momentan an einer Personenverwaltung via verketteter Liste. Jedoch stoße ich da auf ein paar Probleme beim Anlegen und Ausgeben der Personen.

Hier mein Code:

Die Struktur




C++:
#include <iostream>
#include <stdio.h>

//...

struct Personen
{
    unsigned int nummer;
    char name[30];
    char vorname[30];
    struct Personen* next;            
};

int main()
{      
      Personen* Person = new Person[10000]; //10000 Personen in einem Feld von Zeigern

      char neu = 'Y'

      while (neu == 'Y')
      {                    
       add(Person);
                    
       cout << "Weiter (Y/N)?\n" << endl;
       cin >> neu;

       if (neu == 'N')
        break;                    
       }    
            
       print(Person);                
}

void print(Personen* p)
{    
       Personen* temp =p;    
    
       while (temp != NULL)
       {
              printf("%u %s %s \n", temp->nummer, temp->name, temp->vorname);
          temp = temp->next;
       };
}

Personen* add(Personen* p)
{    
    Personen* temp = new Personen;            
    
    cin >> temp->nummer;    
    cin >> temp->name;;
    cin >> temp->vorname;    

    if (temp != NULL)
    {
        temp->next = head->next;
        head->next = temp;
    }
    
    return temp;
}



1. Wie können die Personen so angelegt werden, dass alle restlichen Felder, auf denen der Zeiger zeigt, NULL sind?
2. Resultat aus 1. : Die Ausgabe schießt weg, wenn temp->next auf Adressen mit anderen Werten außer NULL oder eben durch Eingabe belegt wurde.

Wer kann mir dabei helfen, wie ich vorgehen soll? Vielen Dank im Voraus.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.05.2015, 19:12 Uhr
ao

(Operator)


Zuallererst solltest du entscheiden, ob das C oder C++ werden soll. Im Moment ist es eine Mischung, das heißt, du hast vor allem von beiden die Nachteile.

Ich würde zu C++ raten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.05.2015, 09:56 Uhr
~f.-th.
Gast


Wie ao schrieb: C oder C++?

Wenn du kein engen Vorgaben von Lehrer oder Schule hast, baue das neu auf ???
Vector und Container sollst du dann eventuell nicht nutzen, da der Stoff noch kommt?


C++:
#include <iostream>
#include <vector>   // schau dir an, wie dein Beispiel damit eleganter in C++ geht
#include <stdio.h>  // das gehört nicht in aktuelles C++

//...

struct Personen
{
    unsigned int nummer;
    char name[30];      // ist string keine Alternative?
    char vorname[30];  // ist string keine Alternative?
    struct Personen* next;            
};

int main()
{      
      Personen* Person = new Person[10000]; // new findet man nur noch selten in aktuellen Quelltexten -> siehe "C++ Container" für ähnliche Beispiele

      char neu = 'Y'

      while (neu == 'Y')
      {                    
       add(Person);
                    
       cout << "Weiter (Y/N)?\n" << endl;
       cin >> neu;

       if (neu == 'N')
        break;                    
       }    
            
       print(Person);                
}

void print(Personen* p)
{    
       Personen* temp =p;    
    
       while (temp != NULL)
       {
              printf("%u %s %s \n", temp->nummer, temp->name, temp->vorname);  // das geht auch mit cout!
          temp = temp->next;
       };
}

Personen* add(Personen* p)
{    
    Personen* temp = new Personen;  // siehe oben und wo "endet" new?          
    
    cin >> temp->nummer;    
    cin >> temp->name;;
    cin >> temp->vorname;    

    if (temp != NULL)
    {
        temp->next = head->next;
        head->next = temp;
    }
    
    return temp;
}



So wie du das hast ist C++ vor 20 Jahren und selbst da nicht sauber.
Seh gerade ein ";" ist auch noch zu viel - schadet aber nicht - schöner ist es ohne dieses.

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.05.2015, 10:18 Uhr
~f.-th.
Gast


Hab noch was in deinem Quelltext übersehen. Findest du schon.

Hier mal die Basis eines aktuellen C++:
http://de.cppreference.com/w/cpp/container/array
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.05.2015, 03:11 Uhr
Hans
Library Walker
(Operator)


Hab das mal durch den Compiler (Open Watcom 1.9) gejagt, und dabei einige Fehlermeldungen erhalten. Einige Fehler hab ich behoben, aber zwei blieben übrig. Die hab ich an die entsprechende Stelle in den Quelltext kopiert.

C++:
/* Datei: liste.cpp

   Eine Personenverwaltung via verketteter Liste; von jemandem aus dem C/C++ Forum.
   www.fun-soft.de/showtopic.php?threadid=22198
  
  
*/


#include <iostream>
#include <vector>   // schau dir an, wie dein Beispiel damit eleganter in C++ geht
#include <stdio.h>  // das gehört nicht in aktuelles C++

//...
using namespace std; // sonst erkennt OpenWatcom kein cout, etc.

struct Personen
{
    unsigned int nummer;
    char name[30];      // ist string keine Alternative?
    char vorname[30];  // ist string keine Alternative?
    struct Personen* next;            
};

// Funktionsprototypen ; die sind hier nötig, weil diese Funktionen erst hinter main() im Text stehen.
void print(Personen* p);
Personen* add(Personen* p);

int main()
{      
      Personen *Person = new Person[10000]; // new findet man nur noch selten in aktuellen Quelltexten -> siehe "C++ Container" für ähnliche Beispiele
      /* Compilermeldung: (Open Watcom 1.9)
         liste.cpp(30): Error! E498: col(30) syntax error before 'Person'; probable cause
         : incorrectly spelled type name
      */
  

      char neu = 'Y';  // hier fehlte das Semikolon.

      while (neu == 'Y')
      {                    
       add(Person);
                    
       cout << "Weiter (Y/N)?\n" << endl;
       cin >> neu;

       if (neu == 'N')
        break;                    
       }    
            
       print(Person);                
}

void print(Personen* p)
{    
       Personen* temp =p;    
    
       while (temp != NULL)
       {
              printf("%u %s %s \n", temp->nummer, temp->name, temp->vorname);  // das geht auch mit cout!
          temp = temp->next;
       };
}

Personen* add(Personen* p)
{    
    Personen* temp = new Personen;  // siehe oben und wo "endet" new?          
    
    cin >> temp->nummer;    
    cin >> temp->name;;
    cin >> temp->vorname;    

    if (temp != NULL)
    {
        temp->next = head->next;
         /* Compilermeldung: (Open Watcom 1.9)
            liste.cpp(73): Error! E029: col(22) symbol 'head' has not been declared
       ------
   Stimmt. Und wo wird eigentlich *p verwendet?
         */
  

        head->next = temp;
    }
    
    return temp;
}


--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.05.2015, 09:28 Uhr
ao

(Operator)


Ich hab das Rahmenprogramm mal überarbeitet. Natürlich würde ich es in "richtig schönem" C++ ganz anders machen, aber in richtig schönem C++ würde man dieses ganze selbstgeschriebene Listengedöns gar nicht brauchen (weils das schon fertig gibt), und darum gehts ja hier: Um die Implementierung der verketteten Liste.


C++:
#include <iostream>
//#include <vector>        //    kein std::vector, std::list etc. - den Container programmieren wir selber.
//#include <stdio.h>    //    C-IO - in C++ unerwünscht.
#include <string>        //    den C++-String gönnen wir uns, der macht die Verwaltung des Namens einfacher

using namespace std;

struct Person // Umbenannt: Die Struktur modelliert EINE Person
{                // und soll deshalb auch so heißen.
    unsigned int nummer;
    string name;
    string vorname;
    Person* next;            
};

//    die gesamte Liste ausgeben
void printList (Person * list);

//    ein Person-Objekt zu der Liste hinzufügen
void addPersonToList (Person * list, const Person * person);

int main ()
{
    Person * headOfList = 0;
    
    char neu = 'Y';
    while (neu == 'Y')
    {
        Person newPerson;
        cin >> newPerson.nummer;
        cin >> newPerson.name;
        cin >> newPerson.vorname;
        newPerson.next = 0;
        
        addPersonToList (headOfList, &newPerson);
        
        cout << "Weiter (Y/N)?\n" << endl;
        cin >> neu;
    }
    
    printList (headOfList);
    
    //    todo: Liste abräumen, sonst Speicherleck.

}

void printList (Person * list)
{
    // todo
}

void addPersonToList (Person * list, const Person * person)
{
    // todo
}


Dieser Post wurde am 18.05.2015 um 09:29 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: