Einige Fragen zum Code in C

Aufrufe: 449     Aktiv: 16.05.2020 um 18:43

0

include

#include <stdlib.h>

struct name {
    char firstname[100];
    char lastname[100];
};

struct player {
    struct name playername;
    int score;
    struct player *nextPlayer; **//WIRD HIER EIN PLAYER ERSTELLT; MIT EINER POINTERVARIABLE, WENN JA WOFÜR?**
};

struct player *newPlayer;
struct player *firstPlayer;
struct player *currentPlayer; **//WIESO WERDEN HIER 3 POINTERVARIABLEN ERSTELLT?**

int main(int argc, const char * argv[]) {
    newPlayer = (struct player *) malloc(sizeof(struct player)); //ICH VERSTEHE DEN SINN DES EINZELNEN STERNS NICHT

    firstPlayer = newPlayer;
    currentPlayer = firstPlayer;

    printf("\nVorname des Spielers: ");
    scanf("%s", &currentPlayer->playername.firstname);
    printf("Nachname des Spielers: ");
    scanf("%s", &currentPlayer->playername.lastname);
    printf("Punkte des Spielers: ");
    scanf("%d", &currentPlayer->score);
    currentPlayer->nextPlayer = NULL;


    newPlayer = (struct player *) malloc(sizeof(struct player));
    currentPlayer->nextPlayer = newPlayer;
    currentPlayer = currentPlayer->nextPlayer;


    printf("\nVorname des Spielers: ");
    scanf("%s", &currentPlayer->playername.firstname);
    printf("Nachname des Spielers: ");
    scanf("%s", &currentPlayer->playername.lastname);
    printf("Punkte des Spielers: ");
    scanf("%d", &currentPlayer->score);
    currentPlayer->nextPlayer = NULL;


    newPlayer = (struct player *) malloc(sizeof(struct player));
    currentPlayer->nextPlayer = newPlayer;
    currentPlayer = currentPlayer->nextPlayer;


    printf("\nVorname des Spielers: ");
    scanf("%s", &currentPlayer->playername.firstname);
    printf("Nachname des Spielers: ");
    scanf("%s", &currentPlayer->playername.lastname);
    printf("Punkte des Spielers: ");
    scanf("%d", &currentPlayer->score);
    currentPlayer->nextPlayer = NULL;

    printf("________________________\n");

    currentPlayer = firstPlayer;

    while(currentPlayer) {
        printf("Spieler: %s %s, Score: %d\n", currentPlayer->playername.firstname, currentPlayer->playername.lastname, currentPlayer->score);
        currentPlayer = currentPlayer->nextPlayer;

    }

    return 0;
}

Der Code ist vom Youtube Video: https://www.youtube.com/watch?v=7x32j_rzjuM

Diese Frage melden
gefragt

Student, Punkte: 10

 

Kommentar schreiben

3 Antworten
1

Hallo tremimi, das ist ein schönes Beispiel für eine einfach verkettete Liste. Manches könnte man noch optimieren aber ich denke mal das Beispiel soll das Problem und die Lösung veranschaulichen und nicht den optimalsten Code erzeugen. Zu Deinen Fragen: nextPlayer ist der Speicherplatz für den Zeiger des nächsten Players. Ist also der Zeiger für die Verkettung von Datensätzen der auf den nächsten zeigt / zeigen wird. Hättest Du noch einen "lastPlayer" wäre es eine doppelt verkettete Liste, weil Du dann vom aktuellen Element vorwärts (nextPlayer) und rückwärts (lastPlayer) gehen könntest. So geht es eben nur in eine Richtung. Die Definition von 3 Zeigern ist großzügig gewählt. Ging wie schon gesagt auch einfacher. newPlayer ist der Zeiger für einen neuen Datensatz. firstPlayer ist der "Anker" der verketteten Liste. Irgendwo muss sie ja beginnen. Das ist dann hier. Von hier wird ja auch die Ausgabe der Daten in der while Schleife gestartet. currentPlayer ist ein Zeiger der auf den aktuellen Datensatz zeigt der bearbeitet wird. Ist wie gesagt sehr großzügig gewählt. Deine dritte Frage ist ein type cast. Offiziell liefert malloc einen Zeiger des Typs void, Du brauchst aber einen Zeiger vom Typ struct player. Genau das teilst Du dem Compiler damit mit. Das ist ein cast um die Zuweisung formal richtig zu gestalten. Die meisten Compiler, zumindest die, die ich kenne, brauchen diesen cast eigentlich nicht. Ich hoffe ich konnte helfen. Bei Fragen, fragen. Gruß jobe

Diese Antwort melden
geantwortet

Sonstiger Berufsstatus, Punkte: 190
 

Kommentar schreiben

0

WHS?

Diese Antwort melden
geantwortet

Punkte: 10
 

Kommentar schreiben

0

WHS?

Diese Antwort melden
geantwortet

Punkte: 10
 

Kommentar schreiben