Liste, warum?



  • Hey, ich hab mal ne Frage zu Listen, in der Musterlösung steht ein Code zu einer Funktion für Listen, der man Personalnummern zuweisen kann.

    Das gleiche mache ich aber einfacher ohne diese Funktion... ! Kann mir mal jemand den genauen Sinn dieser Funktion und bei struct den Verweis auf die nächste Adresse erklären? Ich steh momentan total auf dem Schlauch... 😕 Help pls 😞

    Musterlösung:

    a) Ein Unternehmen will die Personalnummern seiner Mitarbeiter in einer verketteten Liste verwalten. Definieren
    Sie hierfür eine Struktur sEmpList, welche die Komponenten PersNr für die ganzzahlige Personalnummer
    und next für den Zeiger auf den Nachfolger besitzt.

    struct sEmpList{
       int PersNr;
       struct sEmpList *next;
    }; /*sNameList*/
    

    b) Schreiben Sie eine Funktion NewEmployee, die eine neue Personalnummer am Anfang einer Liste mit Struktur
    aus a) einfügt. Eingabeparameter sind ein Zeiger E auf den Listenanfang und die neue Personalnummer PersNr.
    Rückgabewert soll ein Zeiger auf den Anfang der erweiterten Liste sein.

    struct sEmpList *NewEmployee(struct sEmpList *E, int PersNr){
       struct sEmpList* F;
       F = (struct sEmpList*) malloc (sizeof(struct sEmpList));
       F->PersNr=PersNr;
       F->next=E; /*neues Element an den Anfang setzen*/
       return(F);
    }
    

    Meine Alternative:

    #include <cstdlib>
    #include <iostream>
    
    struct sEmpList{
       int PersNr;
    };
    
    int main(int argc, char *argv[]){
    
       struct sEmpList a={43141};
       struct sEmpList b={23425};
       struct sEmpList c={2352522};
       struct sEmpList d={2535253};
    
       printf("%i %i %i %i\n",a.PersNr,b.PersNr,c.PersNr,d.PersNr);
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    


  • Und was machst Du, wenn Du mehr als 4 Angestellte hast?



  • Und was machst du, wenn du eine fünfte oder sechste Personalnummer benötigst? Weitere Variablen e, f etc anlegen?
    Mit der verketteten Liste kannst du zur Laufzeit entscheiden, wieviele Datensätze du benötigst - und wenn das nicht reicht, holst du dir per malloc() einen weiteren Datensatz und hängst ihn in die Liste ein. (wobei, bei der Datensatzgröße wäre es vielleicht auch eine Lösung, par malloc()/realloc() ein dynamisches Array anzufordern)



  • Es geht noch einfacher:

    #include <stdio.h>
    
    int main()
    {  printf("43141 23425 2352522 2535253\n");
       return 0;
    }
    

    oder gleich in der Konsole

    echo "43141 23425 2352522 2535253"
    

    🙂



  • Die Qualität der genannten "Musterlösung" ist zumindest zweifelhaft, dein Aufgabensteller möchte dir gerne den Sinn und Zweck verketteter Listen anschaulich machen.
    Ist nur von akademischem und damit nichtpraktischem Wert, kannst mal versuchen, deine Liste nach unterschiedlichen Kriterien zu sortieren (kannst mir glauben, sowas kommt in der Praxis häufig vor).

    Deine Variante lässt sich mittels Array sehr viel einfacher gestalten:

    int main(int argc, char *argv[]){
    
       struct sEmpList a[]={43141,23425,2352522,2535253};
       size_t n = sizeof a/sizeof*a;
    
       while( n-- ) printf("%i ",a[n].PersNr);
    
       return 0;
    }
    

    Praktischerweise und für Anfänger noch einfacher für variable Arraywerte ist es, eine max. Anzahl vorzugeben (auch zu prüfen) und dann mit konstanten Arraygrößen zu arbeiten (u.a. kannst du damit einfacher/fehlerfreier hantieren, z.B. Sortieren, auch fällt die Speicherverwaltung dabei weg)

    #define MAX_EMP 1000
    int main(int argc, char *argv[]){
    
       struct sEmpList a[MAX_EMP];
       size_t n = 0;
    
       while( n<MAX_EMP && 1==scanf("%d",&a[n].PersNr) ) ++n;
    
       while( n-- ) printf("%i ",a[n].PersNr);
    
       return 0;
    }
    

Anmelden zum Antworten