Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » dynamische Liste - kleine Aufgabe zu Pointern

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
10.04.2005, 15:36 Uhr
~poiz
Gast


Hallo zusammen!

Ich hatte kürzlich eine Vorlesung über structs und pointer. Als erste "kleine" Übung sollte ich ein Programm verstehen und erweitern. Leider verstehe ich noch immer fast nichts ;-)

Vielleicht könnte mir jemand von Euch die Zeilen zu den Pointern mit einem kurzen, verständlichen Kommentar ergänzen...(meine kommentierte Version weiter unten):


C++:
// Praktikum 5
// Aufgabe: Dynamische Liste
// 05-APR-2005

#include
using namespace std;

const int BUFSIZE = 20; // size of input buffer
const int NAMESIZE = 20; // max size of person's name

struct Person {
Person* next;
char name[NAMESIZE];
unsigned int age;
};

Person anchor = { &anchor, "", 0 };
Person* p;

int main () {

while (1) {
p = new (Person);

cout << "Name (leave empty to exit): ";
cin.getline(p->name, BUFSIZE);
if (!p->name[0]) {
delete p;
break;
}

cout << "Age: ";
cin >> p->age;
cin.ignore();

p->next = anchor.next;
anchor.next = p;

cout << "\nCurrently in list:\n";
cout << "==================\n";

p = anchor.next;
while (p != &anchor) {
cout << "Name : " << p->name << endl;
cout << "Age: " << p->age << endl;
p = p->next;
}

cout << "==================\n";

}

cout << "Bye" << endl;
return 0;
}



*****************************************************
*****************************************************
*****************************************************

C++:
// Praktikum 5
// Aufgabe: Dynamische Liste
// 05-APR-2005

#include
#include
using namespace std;

const int BUFSIZE = 20; // size of input buffer
const int NAMESIZE = 20; // max size of person's name

//zusammengesetzer Datentyp Person
struct Person {
Person* next; //enthält einen Poiner auf next
char name[NAMESIZE]; //char Array für Namen
unsigned int age; //Alter
};

Person anchor = { &anchor, "", 0 }; //anchor = Anker vom Typ Person mit Zuweisung. Der Pointer next zeigt auf sich selbst bzw. anchor
Person* p; //Zeiger vom Typ Person

int main () {

while (1) { //Endlosschleife - Virus :-)
p = new (Person); //Speicher in der Grösse eines Typ Person wird alloziert und Pointer p zeigt darauf

cout << "Name (leave empty to exit): ";
cin.getline(p->name, BUFSIZE); //-> Operator dereferenziert Pointer p und wählt Feld name aus. p zeigt auf name[0] (char array). USer-Input wird in char array name geschrieben
if (!p->name[0]) { //im ersten Element des char-array name kein Zeichen steht (O bzw. kein Zeichen wird auf True gesetzt, wurde ein ZEichen eigegeben wird auf 0 bzw. false gesetzt
delete p; //wird Speicher wieder freigegeben (p zeigt jetzt auf NULL)
break; //Programm beenden
}

cout << "Age: ";
cin >> p->age; //alter wird in int Feld age der Struktur Person geschrieben
cin.ignore(); //werden Zeichen eingegben, so werden diese ignoriert (discard characters)

p->next = anchor.next; /*Pointer p (vom Typ struct) wird dereferenziert und das Feld next (ist ein Pointer) ausgewählt
Dem Pointer next unseres neues Person Datentypes (siehe Zeile 22) wird die Adresse (Pointer zu Pointer Zuweisung) des ersten Datensatzes(anchor Zeile 21) zugewiesen */


anchor.next = p; //Der ursprüngliche anchor.next Zeiger, zeigt jetzt auf den neu erstellen Datensatz

cout << "\nCurrently in list:\n";
cout << "==================\n";

p = anchor.next; //Pointer p soll auf sich selbst zeigen bzw. den eingegebenen Datensatz
//Pointer p adressiert jetzt nicht mehr den allozierten Adressraum, sondern sich selbst, den eingegebenen Datensatz
while (p != &anchor) { //Jetzt verstehe ich gar nichts mehr :-(
cout << "Name : " << p->name << endl;
cout << "Age: " << p->age << endl;
p = p->next;
}

cout << "==================\n";

}

cout << "Bye" << endl;
return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.04.2005, 15:59 Uhr
9ball



rück den code ein. ...und das '{' eines neuen anweisungsblocks immer in die nächste zeile. das erhöht die lesbarkeit ungemein. wenn du das gemacht hast schau's dir nochmal an. bestimmt verstehst du dann mehr
--
one for all and all for one
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.04.2005, 17:09 Uhr
~poiz
Gast


sorry, ist wohl was beim Kopieren schief gelaufen...

Hab jetzt mein kommentiertes File eingefügt...dann sieht man vielleicht besser, was ich nicht versatnden habe...

Vielen Dank!


C++:
// Praktikum 5
// Aufgabe: Dynamische Liste
// 05-APR-2005

#include <cstdlib>
#include <iostream>
using namespace std;


const int BUFSIZE   = 20;    // size of input buffer
const int NAMESIZE  = 20;    // max size of person's name

//zusammengesetzer Datentyp Person
struct Person {
   Person*      next;                //enthält einen Poiner auf next
   char         name[NAMESIZE];      //char Array für Namen
   unsigned int age;                 //Alter
};


Person  anchor = { &anchor, "", 0 }; //anchor = Anker vom Typ Person mit Zuweisung. Der Pointer next zeigt auf sich selbst bzw. anchor
Person* p;     //Zeiger vom Typ Person


int main () {
    
   while (1) { //Endlosschleife - Virus :-)
      p = new (Person);         //Speicher in der Grösse eines Typ Person wird alloziert und Pointer p zeigt darauf
      
      cout << "Name (leave empty to exit): ";
      cin.getline(p->name, BUFSIZE);  //-> Operator dereferenziert Pointer p und wählt Feld name aus. p zeigt auf name[0] (char array). USer-Input wird in char array name geschrieben
      if (!p->name[0]) {   //im ersten Element des char-array name kein Zeichen steht (O bzw. kein Zeichen wird auf True gesetzt, wurde ein ZEichen eigegeben wird auf 0 bzw. false gesetzt
          delete p;          //wird Speicher wieder freigegeben (p zeigt jetzt auf NULL)
          break;             //Programm beenden
      }
      
      cout << "Age:                        ";
      cin >> p->age;       //alter wird in int Feld age der Struktur Person geschrieben
      cin.ignore();        //werden Zeichen eingegben, so werden diese ignoriert (discard characters)
      
      p->next = anchor.next;        /*Pointer p (vom Typ struct) wird dereferenziert und das Feld next (ist ein Pointer) ausgewählt
                                    Dem Pointer next unseres neues Person Datentypes (siehe Zeile 22) wird die Adresse (Pointer zu Pointer Zuweisung) des ersten Datensatzes(anchor Zeile 21) zugewiesen */

                                    
      anchor.next = p;              //Der ursprüngliche anchor.next Zeiger, zeigt jetzt auf den neu erstellen Datensatz

      cout << "\nCurrently in list:\n";
      cout <<   "==================\n";
            
      p = anchor.next;                //Pointer p soll auf sich selbst zeigen bzw. den eingegebenen Datensatz
                                      //Pointer p adressiert jetzt nicht mehr den allozierten Adressraum, sondern sich selbst, den eingegebenen Datensatz
      while (p != &anchor) {          //Jetzt verstehe ich gar nichts mehr :-(
          cout << "Name : " << p->name << endl;
          cout << "Age:   " << p->age << endl;
          p = p->next;
      }

      cout <<   "==================\n";

   }
  
   cout << "Bye" << endl;
   return 0;
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.04.2005, 17:13 Uhr
~poiz
Gast


hmmm....meine langen Kommentare fördern nicht gerade die Lesbarkeit....
Gibts hier keine "Vorschau" Möglichkeit im Forum??

Hier nochmals der Code ohne Kommentare:


C++:
// Praktikum 5 Sommersemester 2005
// Aufgabe: Dynamische Liste
// 05-APR-2005


#include <iostream>
using namespace std;


const int BUFSIZE   = 20;    // size of input buffer
const int NAMESIZE  = 20;    // max size of person's name


struct Person {
   Person*      next;
   char         name[NAMESIZE];
   unsigned int age;
};


Person  anchor = { &anchor, "", 0 };
Person* p;


int main () {
    
   while (1) {
      p = new (Person);
      
      cout << "Name (leave empty to exit): ";
      cin.getline(p->name, BUFSIZE);
      if (!p->name[0]) {
          delete p;
          break;
      }
      
      cout << "Age:                        ";
      cin >> p->age;
      cin.ignore();
      
      p->next = anchor.next;
      anchor.next = p;

      cout << "\nCurrently in list:\n";
      cout <<   "==================\n";
            
      p = anchor.next;
      while (p != &anchor) {
          cout << "Name : " << p->name << endl;
          cout << "Age:   " << p->age << endl;
          p = p->next;
      }

      cout <<   "==================\n";

   }
  
   cout << "Bye" << endl;
   return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


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: